JSON Web加密中的高危漏洞

前言

JSON Web加密容易受到经典的Invalid Curve攻击,这篇文章可以帮助您了解这会对您产生什么影响以及您应该如何应对。

如果您使用的是带有ECDH-ES的go-jose,node-jose,jose2go,Nimbus JOSE + JWT或jose4,请把它更新到最新版本。RFC 7516又称JSON Web加密(JWE),它和实现此规范的软件库曾经遭受经典的Invalid Curve攻击。这可以允许攻击者使用带有Elliptic Curve Diffie-Hellman Ephemeral Static (ECDH-ES)密钥协议的JWE一方的密钥,这样发送方可以从中提取接收方的私钥。

在这篇博文中,我假设您已经了解了elliptic curves以及其在密码学中的应用。如果您想进一步了解的话,您可以访问(https://safecurves.cr.yp.to/) 。另外DJB和Tanja在31c3的讲话中(见第43分钟)也有对这种攻击的解释,此外Juraj Somorovsky等人的研究也为学习者提供了便利。

值得注意的是,这项研究的开始和灵感来自于谷歌的Quan Nguyen,后由Adobe的Antonio Sanso进行了完善。

介绍

JSON Web Token(JWT)是在 OAuth specification family中定义的,基于JSON的一个开放标准(RFC 7519),它用于创建access tokens。该Javascript Object Signing和Encryption (JOSE) IETF专家小组随后为JWT形成了一套正式的签名和加密方法,从而发布了RFC 7515,又名JSON Web Signature (JWS),以及RFC 7516,又名JSON Web Encryption (JWE)。在这篇文章中,我们将重点关注JWE。

典型的JWE是点分隔字符串,它包含五个部分:

1.The JWE Protected Header 2.The JWE Encrypted Key 3.The JWE Initialization Vector 4.The JWE Ciphertext 5.The JWE Authentication Tag

以下是从规范中获取JWE的一个例子:

eyJhbGciOiJSU0EtT0FFUCIsImVuYyI6IkEyNTZHQ00ifQ.OKOawDo13gRp2ojaHV7LFpZcgV7T6DVZKTyKOMTYUmKoTCVJRgckCL9kiMT03JGeipsEdY3mx_etLbbWSrFr05kLzcSr4qKAq7YN7e9jwQRb23nfa6c9d-StnImGyFDbSv04uVuxIp5Zms1gNxKKK2Da14B8S4rzVRltdYwam_lDp5XnZAYpQdb76FdIKLaVmqgfwX7XWRxv2322i-vDxRfqNzo_tETKzpVLzfiwQyeyPGLBIO56YJ7eObdv0je81860ppamavo35UgoRdbYaBcoh9QcfylQr66oc6vFWXRcZ_ZT2LawVCWTIy3brGPi6UklfCpIMfIjf7iGdXKHzg.
48V1_ALb6US04U3b.5eym8TW_c8SuK0ltJ3rpYIzOeDQz7TALvtu6UG9oMo4vpzs9tX_EFShS8iB7j6ji     SdiwkIr3ajwQzaBtQD_A.XFBoMYUZodetZdvTiFvSkQ

此JWE使用RSA-OAEP进行密钥加密,使用A256GCM给内容加密:

一个名为RFC 7518,又称JSON Web算法(JWA)单独列出了所有可用算法。我们今天讨论的是Elliptic Curve Diffie-Hellman Ephemeral Static (ECDH-ES)的关键协议。该算法允许导出暂时的共享密钥(Neil Madden的这篇博文给出了如何进行短暂密钥协议的具体示例)。

在这种情况下,JWE Protected Header还列出了用于密钥协议的elliptic curve:

一旦计算了共享密钥,密钥协商结果可以通过以下两种方式使用:

1.在直接密钥协议模式中,直接作为"enc"算法的内容加密密钥(CEK) 2.在具有密钥包装模式的密钥协议中,作为一种使用A128KW,A192KW或A256KW算法,封装CEK的对称密钥。

这超出了本文的范围,但对于其他算法,JOSE Cookbook展示了如何将ECDH-ES与AES-GCM或AES-CBC加上HMAC结合使用。

原始数据

正如Quan在2017年RWC的演讲中强调的那样:

解密/签名验证输入始终受到攻击者的控制

正如我们将在本文中看到的那样,这个简单的原始数据足以恢复接收者的私钥,但首先我们需要在elliptic curve的片段上挖掘一点。

elliptic curve

elliptic curve是由以下形式的等式定义的解集:

y^2 = x^3 + ax + b

这种方程称为Weierstrass方程。椭圆曲线如下:

y^2 = x^3 + 4x + 20

为了将椭圆曲线理论应用于密码学,我们需要查看那些点在有限域Fq中具有坐标的椭圆曲线。然后,在大小为191的有限域上,相同的曲线将如下所示:

y^2 = x^3 + 4x + 20 (超过有限域191)

对于JWE,椭圆曲线的范围是Suite B和(仅在最近)DJB曲线中定义的曲线。在这两者之间,到目前为止使用量更高的曲线是著名的P-256。

是时候打开Sage了,让我们定义P-256:

曲线的序列非常大,因此攻击者无法利用该曲线(如果软件正确实现了ECDH)猜测协议中使用的私钥。

攻击

这里描述的攻击实际上是经典的无效曲线攻击,这种攻击既简单又强大,它利用了Weierstrass的标量乘法公式没有考虑曲线方程的系数b这一点:

y^2 = ax^ + ax + b。

原版的P-256等式是:

如上所述,这条曲线的序列非常大。因此,我们现在需要为攻击者找到一条更方便的曲线。有了Sage就会非常简单:

从上图中我们可以看到,我们找到了一条更好的曲线(从攻击者的角度来看),该曲线具有许多小因子的序列。然后我们在曲线上找到了一个点P,它的序列非常小(在这个例子中为2447)。

现在我们可以构建恶意JWEs(参见下面的Demo Time部分),并在恒定时间内提取密钥模块2447的值。

攻击成功的关键是让受攻击的对象不断重复自己共同密钥的那一部分。换句话说,这意味着受攻击对象的私钥应该与每个密钥协议相同。这就是Elliptic Curve Diffie-Hellman Ephemeral Static (ECDH-ES))密钥协议运行的工作原理。事实上,ES代表Ephemeral-Static,即Static是受害者共同密钥的那一部分。

在这个阶段,我们可以多次重复这些操作(找到一条新曲线,制作恶意JWE,恢复小序列的密钥),并收集有关密钥的信息。

在最后快要结束的时候,还有一个问题,所有库都忽视了验证接收到的公钥(包含在JWE Protected Header中的曲线),你可以看到下面的Vulnerable Libraries部分来查看各个库如何解决这个问题。

您可以在原始论文中找到攻击的详细信息。

演示时间

demo演示点击这里(https://afternoon-fortress-81941.herokuapp.com/)

说明

为了展示攻击如何运行,我在Heroku中设置了一个实况演示。在(https://obscure-everglades-31759.herokuapp.com/) 中启动并运行一个Node.js服务器应用程序,在这种情况下它将充当受害者对象。假设是这样的:为了与此Web应用程序通信,您需要使用Elliptic Curve Diffie-Hellman Ephemeral Static (ECDH-ES)密钥协议来加密令牌。密钥协议所需的服务器静态公钥位于https://obscure-everglades-31759.herokuapp.com/ecdh-es-public.json:

如果应用程序想要此服务器的POST数据,首先需要使用上面的服务器公钥执行密钥协议,然后加密具有JWE格式的共享密钥的有效负载。一旦JWE到位,就可以发布到https://obscure-everglades-31759.herokuapp.com/secret 如果一切顺利(即如果它可以解密有效载荷内容),则web应用将以200响应状态回应,并且如果由于某种原因,接收到的令牌丢失或无效,则将以400响应状态回应。这对任何潜在攻击者都是一样的,其方式与前一个“攻击”部分中显示的方式相同。

我在https://afternoon-fortress-81941.herokuapp.com/中设置了攻击者应用程序。

您可以单击“恢复密钥”按钮访问它,观察攻击者如何能够逐个从服务器恢复密钥。请注意,这只是一个演示应用程序,因此为了减少等待时间,恢复的密钥会非常小。在实践中,密钥将会更大(因此恢复密钥需要的时间将会更多一些)。

如果你现场演示中遇到了问题,或者只是想看看底下的代码,你可以在Github中找到演示代码:

https://github.com/asanso/jwe-receiver 包含易受攻击的服务器的代码。 https://github.com/asanso/jwe-sender 包含攻击者的代码。

Vulnerable Libraries

在这里,您可以看到这张表,上面列有目前为止易受此特定攻击影响的库:

  • node-jose v0.9.3包括几周前发布的必要修复程序。 这是原始POC的要点。
  • jose2go的修复程序登陆在1.3版本中。
  • Nimbus JOSE+JWT为Maven central推出了一个固定的工件,即v4.34.2。 这是原始POC的要点。
  • 自从v0.5.5起,jose4已经解决了这个问题。这是原始POC的要点。
  • go-jose(这是Quan Nguyen发现的易受攻击的原始库)

一些库是用编程语言实现的,这种编程语言已经阻止了这种攻击,以防这种攻击检查标量乘法的结果是否在曲线上:

最新版本的Node.js似乎不受这种攻击的影响,在没有web加密支持的情况下使用浏览器时仍然可能容易受到攻击。

受影响的是附带1.8.0_51之前版本的Java的Java SUN JCA提供程序。后来的Java版本和BouncyCastle JCA提供程序似乎没有受到影响。

提高JWE标准

我通过邮件将这个漏洞提交给了JOSE工作组。我们一直认为,列出问题的勘误表非常受到欢迎,这篇文章尝试着提高对这一特定问题的意识。

除此之外:使用Auth0保护应用程序

您构建过B2C,B2B或B2E工具吗?Auth0可以帮助您专注于最重要的事项。。Auth0可以通过无密码,破解密码监控和多因素身份验证等最先进的功能帮助您确保产品的安全。 我们将非常慷慨地提供免费套餐,这样就可以使用现代身份验证技术。

鸣谢

作者要感谢go-jose,node-jose,jose2go,Nimbus JOSE + JWT和jose4的维护者对问题的积极响应。Francesco Mari帮助开发演示应用程序,Tommaso Teofili和Simone Tripodi进行故障排除工作,最后,如上所述,我要感谢来自谷歌的Quan Nguyen,如果不是他开了个好头,我们不会有现在的成果。

原文链接:https://auth0.com/blog/critical-vulnerability-in-json-web-encryption/

原文发布于微信公众号 - 安恒网络空间安全讲武堂(cyberslab)

原文发表时间:2019-03-18

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券