组件风险分析与修复指引:cn.hutool:hutool-http Hutool证书验证漏洞-风险分析 CVE-2022-22885
字数 1241 2025-08-19 12:41:14
Hutool证书验证漏洞(CVE-2022-22885)分析与修复指南
漏洞概述
漏洞名称:Hutool证书验证漏洞
CVE编号:CVE-2022-22885
漏洞类型:CWE-295 证书验证不正确
影响组件:cn.hutool:hutool-http
漏洞描述
Hutool工具库中的HttpRequest类默认使用了一个信任所有主机名的HostnameVerifier(TRUST_ANY_HOSTNAME_VERIFIER),该验证器不会对服务器证书进行任何校验,导致存在中间人攻击(MITM)风险。
漏洞原理
技术背景
- HostnameVerifier机制:这是Java HTTPS连接中的一种回退机制,当要连接的host与服务端证书中的server name不匹配时会被调用
- 正常行为:Java自带的
HttpsURLConnection在访问hostname与证书不匹配的站点时会报错 - Hutool问题:Hutool默认配置放行所有这类请求,使应用易受不安全站点攻击
具体问题代码
Hutool的HttpUtil.setInfo()函数传入的hostNameVerifier默认为TRUST_ANY_HOSTNAME_VERIFIER,该验证器实现简单返回true,不进行任何验证。
漏洞影响
- 中间人攻击:攻击者可拦截HTTPS通信
- 信息泄露:可能泄露敏感信息如密钥等
- 设备入侵:若泄露验证密钥,可能导致对应设备被入侵
漏洞复现
对比测试
-
使用原生Java函数请求不安全页面:
// 使用Java自带HttpsURLConnection访问hostname与证书不匹配的站点会报错 -
使用Hutool的HttpRequest类:
// 使用Hutool的HttpRequest访问不安全页面会成功返回内容
修复方案
官方修复
厂商已发布升级补丁,建议升级到修复版本:
- 补丁链接:https://github.com/dromara/hutool/commit/cdf105589deb9b0999c7fcdf33b2b5b86b22f960
- 问题跟踪:https://github.com/dromara/hutool/issues/2042
临时修复方案
若无法立即升级,可自定义HostnameVerifier:
private static class CustomHostnameVerifier implements HostnameVerifier {
@Override
public boolean verify(String hostname, SSLSession session) {
try {
// 获取证书主体名称
String principalName = session.getPeerPrincipal().getName();
// 自定义验证逻辑,示例中验证hostname和证书主体是否为"1.1.1.1"
if(hostname.equals("1.1.1.1") && principalName.equals("1.1.1.1")) {
return true;
}
} catch(SSLPeerUnverifiedException e) {
// 处理证书未验证异常
}
// 默认使用系统验证器
return HttpsURLConnection.getDefaultHostnameVerifier().verify(hostname, session);
}
}
使用说明
- 根据实际请求URL修改
hostname.equals()和principalName.equals()中的值 - 建议将验证逻辑与业务需求结合,严格验证证书主体和主机名
- 可结合白名单机制,只允许访问已知安全的主机
修复效果
修复后,在执行HTTPS请求时:
- 程序会自动校验hostname和从证书获取的主体名称
- 不会接受证书域名不匹配的不安全站点连接
- 有效防止中间人攻击
最佳实践
- 及时更新:优先使用官方修复版本
- 最小权限:自定义验证器时应遵循最小权限原则
- 日志记录:记录验证失败的连接尝试
- 代码审查:检查所有使用Hutool HTTP工具的地方
- 测试验证:修复后应进行安全测试验证效果