关键漏洞拉响警报!停止使用JSON加密!
Posted 云头条
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关键漏洞拉响警报!停止使用JSON加密!相关的知识,希望对你有一定的参考价值。
广大开发人员根本就不应该在其应用程序中使用JSON Web令牌或JSON Web加密,以免他们的私钥被盗。
一种基于JSON的Web加密协议中的安全漏洞可能让攻击者得以获取私钥。密码学专家在过去早已建议开发人员在应用程序中切勿使用JSON Web加密(JWE),而这个安全漏洞恰恰表明了那些危险。
安东尼奥·桑索(Antonio Sanso)是瑞士Adobe研究部门的高级软件工程师,也是Adobe 体验管理系统(Experience Manager)安全团队的一分子。他撰文道,实施JWE即RFC 7516规范的软件库容易受到一种经典的无效曲线攻击(Invalid Curve Attack),详见http://blogs.adobe.com/security/2017/03/critical-vulnerability-uncovered-in-json-encryption.html。JSON Web令牌(JWT)是OAuth规范系列中定义的一种基于JSON的开放标准,用于创建访问令牌,而JWE是一套面向JWT的签名和加密方法。如果开发人员使用JWE以及采用椭圆曲线Diffie-Hellman Ephemeral Static(ECDH-ES)的密钥协议,会受到影响。
为了了解无效曲线攻击,先有必要简单了解一下椭圆曲线密码学(ECC)。ECC是一种基于针对有限数据集的椭圆曲线的代数结构,计算公钥-私钥对的方法。椭圆曲线的阶数(order)足够大,那样攻击者就很难试图猜出私钥。ECDH-E是一种基于椭圆曲线的密钥交换机制,它被许多网站用来通过SSL提供完美的前向保密性(forward secrecy)。
无效曲线攻击让攻击者得以充分利用曲线公式中的数学错误,从而找到较小的曲线。由于较小椭圆曲线的阶数更易于管理,所以攻击者就能构建恶意的JWE来提取密钥的值,并多次执行这番操作,收集关于密钥的更多信息。
无效曲线攻击在17年前首次刊文发表,荷兰埃因霍温理工大学的密码学教授坦贾·兰格(Tanja Lange)和芝加哥伊利诺伊大学的数学家及研究教授丹尼尔·J·伯恩斯坦(Daniel J Bernstein)在2014年汉堡混沌通信大会上曾发表了关于椭圆曲线加密的一场演讲,演讲中描述了这种攻击。这个问题已经存在了很长时间,但桑索发现,使用RFC 7516的几个著名的库很容易受到攻击。
如果开发人员依赖go-jose、node-jose、jose2go、Nimbus JOSE+JWT或jose4等库以及ECDH-ES,应该更新其现有的应用程序,以便使用最新版本,并确保他们在使用所有新代码的最新版本。更新后的版本号如下:node-jose v0.9.3、jose2go v1.3、jose4 v0.5.5及更高版本、Nimbus JOSE + JWT v4.34.2和go-jose。
桑索写道:“到头来,这里的问题在于,该规范以及我随后检查的所有库都没有验证这一步:接收到的公钥(包含在JWE Protected Header中)在曲线上。”
暴露的这个安全漏洞归咎于RFC 7516规范存在缺陷;通用身份平台Auth0的首席技术官兼联合创始人马蒂亚斯·沃洛斯基(Matias Woloski)表示,由于大多数实施人员会直接遵循规范,他们无意中会将这个安全漏洞带入到其库中。
沃洛斯基说:“缺陷出现在规范设计中,而不是出现在实施中,这是一种罕见情况。”
默认的Java SUN JCA提供程序(版本1.8.0_51之前随带Java)也受到了影响,但后来的Java版本和BouncyCastle JCA提供程序并不受影响。最新版本的Node.js似乎不受此攻击的影响,不过桑索警告,如果使用不支持Web加密的浏览器,仍有可能容易受到攻击。
作为其研究的一部分,桑索在Heroku上构建了一个攻击者应用程序。用户点击该应用程序上的“恢复密钥”按钮后,就能够看到攻击者如何从服务器获取密钥。演示代码和概念证明代码都放在了GitHub上。
幸运的是,影响可能有限,因为JWE以及ECDH-ES并未被广泛使用。
Cryto CodingCollective网站的创始人斯文·斯洛特韦格(Sven Slootweg)表示,决定使用JWT的开发人员在努力使用服务器端存储用于会话,但是他们最后却借助古怪的变通方法,而不是细致的工程技术。若使用JWE,开发人员被迫做出决定:该采用哪种密钥加密和消息加密方法――这个决定不应该扔给不是密码学家的人员。
斯洛特韦格说:“别使用JWT用于会话。JWE标准是个雷区,不应该迫使不是密码学家的人员趟这个雷区。”
相反,开发人员应该坚持使用会话,使用通过HTTPS安全传递的cookie。Libsodium这个库也为广大开发人员提供了一种久经考验的方法:通过crypto_sign()和crypto_sign_open()使用签名,或者通过crypto_secretbox()和crypto_box()API使用加密。
如果库开发人员和工程师在处理面向安全的库,就要确保他们随时了解最新的动向,那样才能够准备好打上补丁、修补问题。沃洛斯基说:“规范设计人员(通常来自业界)应该更主动地与研究人员一起评估规范的安全性,在标准化之前要积极主动,而不是消极被动。”
更多的密码学家需要审查开发人员使用的软件库,确保算法已得到正确实施。设计规范的人员往往与研究人员基本上没有什么联系。
这个问题已上报给了javascript对象签名和加密工作组的邮件列表。这份公告还着重表明了为什么不应该将规范视为一个静态文档:它们必须定期重新考虑和更新,从而体现最初忽视或基于可用的新信息而改变的任何细节。
桑索说:“我们都似乎一致认为,列出具体问题所在的规范勘误表起码受到欢迎。”
相关阅读:
以上是关于关键漏洞拉响警报!停止使用JSON加密!的主要内容,如果未能解决你的问题,请参考以下文章
警报安全 Github - 修复 yarn.lock/package-lock.json 漏洞的正确方法是啥