ECDSA(椭圆曲线数字签名算法)签名被广泛应用于各个认证领域,如SSL证书,JWT签名等。近日,国外安全研究员发现了Java自带的ECDSA签名验证函数中,存在认证绕过漏洞。
Java 15, 16, 17, 18
请及时安装Oracle发布的2022 4月补丁
https://www.oracle.com/security-alerts/cpuapr2022.html
是一种非对称加密算法,被广泛应用于数字签名领域。ECDSA相较于RSA,在相同的安全级别下,可以得到更短的密钥和签名,备受数字签名领域的喜爱。
ECDSA签名由2个值组成,r和s,推导公式有点复杂,感兴趣的同学可以参考
https://en.wikipedia.org/wiki/Elliptic_Curve_Digital_Signature_Algorithm#Signature_verification_algorithm
https://zhuanlan.zhihu.com/p/97953640
简单来讲,如果 r=r*(根据s导出的值),即可验证成功。那么如果 r=s=0 呢,显然等式0=0*xxx是成立的,认证通过。
所以,ECDSA算法验证的第一步就是检查 r, s 是否 >=1。
然而Java中的ECDSA签名验证函数却并没有其进行检查,也就是说,可以设置 r=s=0,从而任何 r=s=0 的空白签名将通过认证。
恶意网站使用空白签名的证书,所有访问该网站的用户(使用存在漏洞的java ECDSA验证)都将验证此证书为有效,从而建立会话,进而通信,此漏洞破坏了正常的SSL认证,会导致用户信息被恶意网站收集并利用。
https://github.com/khalednassar/CVE-2022-21449-TLS-PoC
漏洞验证演示
https://neilmadden.blog/2022/04/19/psychic-signatures-in-java/
https://github.com/khalednassar/CVE-2022-21449-TLS-PoC
https://en.wikipedia.org/wiki/Elliptic_Curve_Digital_Signature_Algorithm#Signature_verification_algorithm
https://zhuanlan.zhihu.com/p/97953640
本公众号内的文章及工具仅提供学习用途,由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,本公众号及文章作者不为此承担任何责任。
原文始发于微信公众号(我不是Hacker):Java自带ECDSA签名验证函数存在漏洞,导致认证绕过 (CVE-2022-21449)
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论