暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle Java中的密码学错误使“psychic paper”伪造成为可能

原创 通讯员 2022-04-25
532

使用较新版本的 Oracle Java 框架的组织发现一个令人不安的警告:一个严重的漏洞可以让攻击者轻松伪造 TLS 证书和签名、双因素身份验证消息以及由一系列广泛使用的开放协议生成的授权凭证标准。

甲骨文周二修补的该漏洞影响了该公司在 Java 15 及更高版本中实施椭圆曲线数字签名算法。ECDSA 是一种算法,它使用椭圆曲线密码学原理对消息进行数字身份验证。与 RSA 或其他加密算法相比,ECDSA 的一个关键优势是它生成的密钥更小,使其非常适合用于包括基于 FIDO 的 2FA安全断言标记语言OpenIDJSON在内的标准。

神秘博士psychic paper

发现该漏洞的安全公司 ForgeRock 的研究员 Neil Madden将其比作科幻剧《神秘博士》中经常出现的空白身份证卡片是由psychic paper成的,使观看它的人看到主角想让他们看到的任何东西。

“事实证明,在实施广泛使用的ECDSA签名时,最近发布的一些 Java 版本容易受到类似类型的欺骗,”Madden 写道。“如果您运行的是易受攻击的版本之一,那么攻击者可以轻松伪造某些类型的 SSL 证书和握手(允许拦截和修改通信)、签名的 JWT 、SAML 断言OIDC id 令牌,甚至是WebAuthn身份验证消息。所有这些都使用了相当于一张白纸的数字版本。”


他继续:

“很难夸大这个漏洞的严重性。如果您将 ECDSA 签名用于这些安全机制中的任何一个,并且如果您的服务器在2022 年 4 月重要补丁更新 (CPU)之前运行任何 Java 15、16、17 或 18 版本,那么攻击者可以轻而易举地完全绕过它们就上下文而言,现实世界中几乎所有的 WebAuthn/FIDO 设备(包括 Yubikey 都使用 ECDSA 签名,许多 OIDC 提供商使用 ECDSA 签名的 JWT。”

该漏洞被跟踪为 CVE-2022-21449,其严重性等级为 7.5(满分为 10 分),但 Madden 表示,根据他的评估,他将严重程度评为完美的 10 分,“因为对访问管理上下文中的不同功能。” 以最严重的形式,该漏洞可能被易受攻击的网络之外的人利用而根本没有验证。

其他安全专家也有强烈反应,其中一位称其为“年度加密漏洞”。


韦尔普。这是今年的加密错误。把它标记为四月。Java 15-18 ECDSA 不会检查随机 x 坐标和签名证明是否非零;(0,0) 签名验证任何消息。破坏 JWT、SAML 等。https://t.co/t2WgnS0g3A

— Thomas H. Ptacek (@tqbf) 2022 年 4 月 20 日


一个缓解因素是 Java 版本 15 及更高版本似乎不像早期版本那样广泛使用。安全公司 Snyk 在 2021 年 2 月和 3 月收集的数据显示,当时的最新版本 Java 15 占部署的 12%。尽管 Madden 表示特定的 ECDSA 实施缺陷仅影响 Java 15 及更高版本,但 Oracle 也将版本 7、8 和 11 列为易受攻击的版本。Madden 表示,这种差异可能是由早期版本中修复的单独加密错误引起的。

a/0 = 有效签名

ECDSA 签名依赖于一个伪随机数,通常表示为 K,用于派生两个附加数字 R 和 S。要验证签名是否有效,一方必须检查涉及 R 和 S 的等式,即签名者的公钥,以及消息的加密哈希。当等式两边相等时,签名有效。


周三发表的一篇文章中,安全公司 Sophos 进一步解释了这一过程:

S1。选择一个介于 1 和 N-1 之间的密码健全的随机整数 K。
S2。使用椭圆曲线乘法从 K 计算 R。
S3。万一 R 为零,请返回步骤 1 并重新开始。
S4。从 K、R、要签名的哈希和私钥计算 S。
S5。万一 S 为零,请返回步骤 1 并重新开始。

为了使过程正常工作,R 和 S 都不能为零。这是因为等式的一侧是 R,另一侧乘以 R 和 S 中的一个值。如果值都是 0,则验证检查转换为 0 = 0 X(来自私钥和散列的其他值),无论附加值如何,这都是正确的。这意味着对手只需提交一个空白签名即可成功通过验证检查。

马登写道:

猜猜Java忘记了哪个检查?

这是正确的。Java 的 ECDSA 签名验证实现不检查 R 或 S 是否为零,因此您可以生成一个签名值,其中它们都是 0(适当编码),Java 将接受它作为任何消息和任何公共的有效签名钥匙。空白身份证的数字等价物。

下面是一个由 Madden 创建的交互式 JShell 会话,它显示了在验证消息和公钥时接受空白签名作为有效的易受攻击的实现:

|  Welcome to JShell -- Version 17.0.1
|  For an introduction type: /help intro
jshell> import java.security.*
jshell> var keys = KeyPairGenerator.getInstance("EC").generateKeyPair()
keys ==> java.security.KeyPair@626b2d4a
jshell> var blankSignature = new byte[64]
blankSignature ==> byte[64] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ... , 0, 0, 0, 0, 0, 0, 0, 0 }
jshell> var sig = Signature.getInstance("SHA256WithECDSAInP1363Format")
sig ==> Signature object: SHA256WithECDSAInP1363Format<not initialized>
jshell> sig.initVerify(keys.getPublic())
jshell> sig.update("Hello, World".getBytes())
jshell> sig.verify(blankSignature)
$8 ==> true
// Oops, that shouldn't have verified...
复制

使用任何受影响的 Java 版本来验证签名的组织应高度重视修补。监控来自应用程序和产品制造商的建议以查看他们的任何产品是否易受攻击也很重要。虽然来自 CVE-2022-21449 的威胁似乎仅限于新的 Java 版本,但其严重性足以引起警惕。


文章来源:https://arstechnica.com/information-technology/2022/04/major-crypto-blunder-in-java-enables-psychic-paper-forgeries/

最后修改时间:2022-04-25 10:22:26
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论