组件风险分析与修复指引: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)风险。

漏洞原理

技术背景

  1. HostnameVerifier机制:这是Java HTTPS连接中的一种回退机制,当要连接的host与服务端证书中的server name不匹配时会被调用
  2. 正常行为:Java自带的HttpsURLConnection在访问hostname与证书不匹配的站点时会报错
  3. Hutool问题:Hutool默认配置放行所有这类请求,使应用易受不安全站点攻击

具体问题代码

Hutool的HttpUtil.setInfo()函数传入的hostNameVerifier默认为TRUST_ANY_HOSTNAME_VERIFIER,该验证器实现简单返回true,不进行任何验证。

漏洞影响

  1. 中间人攻击:攻击者可拦截HTTPS通信
  2. 信息泄露:可能泄露敏感信息如密钥等
  3. 设备入侵:若泄露验证密钥,可能导致对应设备被入侵

漏洞复现

对比测试

  1. 使用原生Java函数请求不安全页面

    // 使用Java自带HttpsURLConnection访问hostname与证书不匹配的站点会报错
    
  2. 使用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);
    }
}

使用说明

  1. 根据实际请求URL修改hostname.equals()principalName.equals()中的值
  2. 建议将验证逻辑与业务需求结合,严格验证证书主体和主机名
  3. 可结合白名单机制,只允许访问已知安全的主机

修复效果

修复后,在执行HTTPS请求时:

  1. 程序会自动校验hostname和从证书获取的主体名称
  2. 不会接受证书域名不匹配的不安全站点连接
  3. 有效防止中间人攻击

最佳实践

  1. 及时更新:优先使用官方修复版本
  2. 最小权限:自定义验证器时应遵循最小权限原则
  3. 日志记录:记录验证失败的连接尝试
  4. 代码审查:检查所有使用Hutool HTTP工具的地方
  5. 测试验证:修复后应进行安全测试验证效果

参考链接

  1. NVD漏洞详情
  2. 官方修复提交
  3. GitHub问题跟踪
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函数请求不安全页面 : 使用Hutool的HttpRequest类 : 修复方案 官方修复 厂商已发布升级补丁,建议升级到修复版本: 补丁链接:https://github.com/dromara/hutool/commit/cdf105589deb9b0999c7fcdf33b2b5b86b22f960 问题跟踪:https://github.com/dromara/hutool/issues/2042 临时修复方案 若无法立即升级,可自定义 HostnameVerifier : 使用说明 根据实际请求URL修改 hostname.equals() 和 principalName.equals() 中的值 建议将验证逻辑与业务需求结合,严格验证证书主体和主机名 可结合白名单机制,只允许访问已知安全的主机 修复效果 修复后,在执行HTTPS请求时: 程序会自动校验hostname和从证书获取的主体名称 不会接受证书域名不匹配的不安全站点连接 有效防止中间人攻击 最佳实践 及时更新 :优先使用官方修复版本 最小权限 :自定义验证器时应遵循最小权限原则 日志记录 :记录验证失败的连接尝试 代码审查 :检查所有使用Hutool HTTP工具的地方 测试验证 :修复后应进行安全测试验证效果 参考链接 NVD漏洞详情 官方修复提交 GitHub问题跟踪