同类相关 CVE 合集
汇总同一攻击族(无效曲线/扭曲线攻击)下直接相关或同属一类的 CVE,便于对照排查。
「无效曲线攻击 + CRT 恢复私钥」是一个通用攻击类,跨语言、跨库反复出现。本文汇总与它直接相关、或同属「从公开信息恢复私钥」这一家族的 CVE。
1. 总览表
| CVE | 库/组件 | 语言 | 年份 | 类别 | 一句话 |
|---|---|---|---|---|---|
| CVE-2020-0601 | Windows CryptoAPI | C++ | 2020 | 无效曲线(CurveBall) | 证书签名校验可被绕过 |
| CVE-2018-12438 | libsunec(sunec) | C | 2018 | HNP(侧信道) | 缓存侧信道泄漏 nonce 高位 |
| CVE-2026-23966 | sm-crypto(npm) | JS | 2026 | 无效曲线/小子群 | SM2 解密多次交互恢复私钥 |
| CVE-2026-23965 | sm-crypto(npm) | JS | 2026 | 签名伪造 | SM2 验签可伪造任意公钥签名 |
| CVE-2026-23967 | sm-crypto(npm) | JS | 2026 | 签名延展性 | SM2 签名可派生新合法签名 |
| CVE-2026-73567 | sm-crypto + jsbn(npm) | JS | 2026 | 弱随机数 | 默认 RNG 用 Math.random + 时间 |
| CVE-2026-71851 | crypto-js(npm) | JS | 2026 | 弱随机数 | BIP39 助记词熵不足致私钥恢复 |
| CVE-2025-14505 | elliptic(npm) | JS | 2025 | RFC 6979 k 截断 | k 前导零截断致私钥泄露 |
注:
sm-crypto系列为 2026 年 1 月披露(腾讯玄武实验室 XlabAI + Atuin 自动发现引擎)。当前时间为 2026-08,这些是较新的同族案例。
2. 无效曲线攻击的「祖师爷」:CVE-2020-0601(CurveBall)
虽然不在 JS 生态,但 CurveBall 是让「无效曲线攻击」家喻户晓的那个漏洞:
- 微软 CryptoAPI 在验证带显式曲线参数的 ECC 证书时,没有校验参数里的生成元 是否真的落在声明的曲线上;
- 攻击者可以提供一个自定义生成元 (属于低阶子群或已知离散对数的点),从而伪造签名 / 通过证书校验;
- 与 JS 的
elliptic/secp256k1案例本质同源:都是「信任了对方提供的曲线参数/点,而没做校验」。
3. HNP 与 CRT 的远亲:CVE-2018-12438(ROHNP)
这是另一类「恢复私钥」的数学,但同样用到余数/格思想:
- ECDSA 签名 nonce 的高位通过缓存侧信道泄漏,问题转化为隐藏数问题(Hidden Number Problem, HNP);
- 求解 HNP 常用格基归约(LLL),其思想与 CRT「合并多组同余信息」相通;
- 结论:多组签名的 高位信息 → 还原私钥。
4. 弱随机数导致的私钥恢复(同族不同因)
这几个 CVE 不是「无效曲线」,但都造成「私钥可被恢复」,值得一并了解:
4.1 CVE-2026-73567 — sm-crypto / jsbn 可预测 RNG
sm-crypto 的 SM2 默认 generateKeyPairHex() 在 Node.js 下使用 jsbn 的 SecureRandom,其 ARC4 种子来自 Math.random() + Date.getTime()(因为 jsbn 只检查 window.crypto,而 Node 里 window 为 undefined,即使 globalThis.crypto 存在也不会走安全路径)。
攻击者若能观察到少量 Math.random() 输出(V8 的 xorshift128+ 约 4 个 double 即可恢复状态)并估算时间,即可重建种子、复现私钥、预测签名 nonce 并伪造签名。
4.2 CVE-2026-71851 — crypto-js BIP39 熵不足
crypto-js@<4.0.0 的 WordArray.random() 用 Math.random() 播种的自定义 MWC 伪随机数生成器。请求 128/256 bit 熵时,实际有效搜索空间仅约 / ,可在普通硬件上枚举。下游用其生成 BIP39 助记词的钱包,私钥可被恢复。
4.3 CVE-2025-14505 — elliptic RFC 6979 k 截断
elliptic 的 ECDSA 在 RFC 6979 确定性 nonce 计算中,若中间值 带前导零,字节长度计算错误导致 被截断。攻击者若能拿到「同一输入下的一条错误签名 + 一条正确签名」,可在一定条件下反推私钥。这与无效曲线攻击不同(这是 deterministic nonce 的 bug),但同属「签名/密钥材料泄露」。
5. 通用防御清单
无论哪个库、哪种语言,防御要点一致:
- ECDH 必须校验对方公钥点:先
validate(point)确认点在正确曲线上,再做标量乘法; - 解析曲线参数时校验生成元:显式参数要验 与曲线的一致性;
- 随机数必须用 CSPRNG:Node 用
crypto.randomBytes,浏览器用crypto.getRandomValues,禁止Math.random(); - 确定性签名(RFC 6979)实现要严格:注意大端字节长度与前导零处理;
- 依赖扫描:
npm audit/osv-scanner/ Snyk 定期扫elliptic、secp256k1、node-jose、sm-crypto、crypto-js等。