漏洞简介
漏洞名称:证书验证漏洞
漏洞编号:CVE-2022-22885
漏洞类型:CWE-295 证书验证不正确
漏洞概述
该库的HttpRequest类默认的HostnameVerifier信任所有的hostname,并不对服务器证书进行校验。
https://nvd.nist.gov/vuln/detail/CVE-2022-22885
漏洞利用条件
使用Hutool默认的HostnameVerifier。
漏洞分析
该漏洞是证书验证漏洞,该漏洞会导致服务器遭受中间人攻击从而造成信息泄露等问题。若泄露的信息涉及密钥等可供验证的内容,会导致密钥对应设备被入侵。
该漏洞产生的原因在于Hutool HttpUtil的setInfo函数传入的hostNameVerfier默认的为TRUST_ANY_HOSTNAME_VERIFIER。
其恒返回true。
HostnameVerifier是一种fallback机制,当要连接的host与服务端证书server name不匹配进行调用。Hutool默认放行所有这类请求。故而服务器易遭受不安全站点的攻击。
漏洞复现
1.使用未封装的Java函数请求不安全页面
Java自带HttpsURLConnection访问hostname与证书不匹配时报错。
2.使用Hutool的HttpRequest类访问不安全页面
成功返回页面内容。
解决方案:
相关commit: https://github.com/dromara/hutool/commit/cdf105589deb9b0999c7fcdf33b2b5b86b22f960
漏洞补丁: https://github.com/dromara/hutool/commit/cdf105589deb9b0999c7fcdf33b2b5b86b22f960
参考方案:
目前厂商已发布升级补丁以修复漏洞,补丁获取链接: https://github.com/dromara/hutool/issues/2042
漏洞修复:
使用自定义的HostnameVerifier
使用自定义的HostnameVerifier对证书主体名称和hostname进行校验。
private static class TestHostnameverifier implements HostnameVerifier{ @override public boolean verify(String hostname, SSLSession session){ try{ String principalName = session.getPeerPrincipal().getName(); if(hostname.equals("1.1.1.1") && principalName.equals("1.1.1.1")) return true; }catch(SSLPeerUnverifiedException e){ } return HttpsURLConnection.getDefaultHostnameVerifier().verify(hostname,session); } }
修复后,如下图所示,在执行Https请求时,程序会自动校验hostname和从证书获取的主体名称。具体需要根据请求URL改变传入hostname.equals(),principalName.equals()。如此就不会遭受证书域名不匹配的不安全站点的攻击。
该修复方案需要根据请求URL的hostname和证书信息配置verify代码。
4A评测 - 免责申明
本站提供的一切软件、教程和内容信息仅限用于学习和研究目的。
不得将上述内容用于商业或者非法用途,否则一切后果请用户自负。
本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑或手机中彻底删除上述内容。
如果您喜欢该程序,请支持正版,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。敬请谅解!
程序来源网络,不确保不包含木马病毒等危险内容,请在确保安全的情况下或使用虚拟机使用。
侵权违规投诉邮箱:4ablog168#gmail.com(#换成@)