Security2 min
CVE-2017-16007 — node-jose (npm) ECDH-ES Invalid Curve Attack
Analyzes the node-jose vulnerability where the peer's public-key curve is not validated during ECDH-ES key agreement, allowing an attacker to recover the shared secret.
node-jose是 Cisco 出品的 JOSE(JWT/JWE)纯 JS 实现。其 JWE 的 ECDH-ES 密钥协商存在无效曲线攻击,攻击者可恢复服务端私钥。这是同类漏洞里最早被公开、并引发「无效曲线攻击」进入大众视野的 JS 案例之一。
1. 基本信息
| 项 | 值 |
|---|---|
| CVE | CVE-2017-16007 |
| 影响包 | node-jose(npm) |
| 漏洞类型 | CWE-200(敏感信息泄露) |
| 严重度 | CVSS 3.0:AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:N/A:N(5.9,Medium) |
| 发布时间 | 2018-06-04(漏洞存在于 < 0.9.3) |
受影响版本 & 修复
| 版本区间 | 修复版本 |
|---|---|
< 0.9.3 | 0.9.3 |
2. 漏洞成因
当使用 JWE + ECDH-ES(Ephemeral-Static 密钥协商)时,服务端会用自身静态私钥 与客户端发来的临时公钥 计算共享密钥:
问题在于:node-jose 没有校验客户端公钥 是否真的位于约定的曲线上。于是攻击者可以像其它无效曲线攻击一样,发送低阶子群上的恶意点,逐次泄漏 ,再 CRT 还原私钥。
3. 利用原理
- 攻击者构造位于低阶子群(阶为小整数 )的恶意公钥 ,放入 JWE 的
epk头; - 服务端计算 ECDH-ES 共享密钥 ;
- 因 , 只泄漏 ;
- 攻击者通过观察「解密是否成功 / 返回的密文」等信息确认 的候选值,恢复 ;
- 换不同 重复,CRT 合并还原完整私钥。
该漏洞的公开分析(Antonio Sanso 的《Critical Vulnerability in JSON Web Encryption》与 Gist)详细展示了这套攻击,是「无效曲线攻击 + CRT」在 JS/JOSE 场景的经典教材。
4. 攻击流程
flowchart TD
A["JWE 中放入恶意 epk(低阶点 Q)"] --> B["服务端 ECDH-ES:S = [d]Q"]
B --> C["S 只泄漏 r = d mod l"]
C --> D["观察解密结果确认 S 候选"]
D --> E["换不同 li 重复 → CRT 还原 d"]
5. 影响
- 使用
node-jose做 JWE/ECDH-ES 的服务端,其静态私钥可被远程恢复; - 后续大量 JOSE/JWT 相关 JS 库都以此为鉴,补上了曲线点校验。
6. 修复
- 升级到
node-jose@0.9.3及以上; - 通用原则:任何 ECDH 实现,都必须先
validate对方公钥点,再参与标量乘法。