CVE-2021-41117
不安全的随机数生成
- 已发布
- 2021年10月11日
- 已更新
- 2024年8月4日
- 分配 CNA
- GitHub_M
- 观察到的证据
- 2026年8月8日
初级CVSS
nvd · CVSS 3.1
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:N低 · 未来 30 天
- 百分位
- 87.1%
- 型号日期
- 2026年9月21日
EPSS 是统计估计,而不是确定性或影响衡量标准。将其与 CVSS、KEV 状态、暴露程度和您的环境相结合。
总结
keypair 是一个用 JavaScript 编写的 RSA PEM 密钥生成器。keypair 自行实现或尽可能借用其他库(包括 node-forge)实现了大量加密原语。该库被发现存在一个问题:它在 SSH 中生成相同的 RSA 密钥。这意味着该库会生成相同的 P、Q(进而 N)值,而就 RSA-2048 密钥而言,这实际上是不可能的。反复生成相同的值通常表明随机数生成不良,或对 CSPRNG 输出的处理不当。问题 1:随机数生成不良(`GHSL-2021-1012`)。该库并不完全依赖平台提供的 CSPRNG,而是使用其自有的基于计数器的 CMAC 方法。问题出在 `defaultSeedFile` 函数中,即使用“真正”的随机数据为 CMAC 实现填充种子。为了为 AES-CMAC 生成器播种,该库会根据 JavaScript 执行环境采取两种不同的方法。在浏览器中,该库将使用 [`window.crypto.getRandomValues()`](https://github.com/juliangruber/keypair/blob/87c62f255baa12c1ec4f98a91600f82af80be6db/index.js#L971)。然而,在 nodeJS 执行环境中,`window` 对象未定义,因此它会采用一种安全性低得多的解决方案,而且该解决方案中还有一个 bug。看起来该库确实尝试在可能的情况下使用 node 的 CSPRNG,但不幸的是,`crypto` 对象为 null,因为一个同名变量被声明并设置为 `null`。因此,node CSPRNG 路径永远不会被采用。然而,当 `window.crypto.getRandomValues()` 不可用时,会使用 Lehmer LCG 随机数生成器为 CMAC 计数器播种,而 LCG 使用 `Math.random` 作为种子。虽然这本身很差劲,可能足以构成一个安全漏洞,但这并不能解释重复密钥出现的极端频率。主要缺陷:Lehmer LCG 的输出编码不正确。存在缺陷的具体 [line][https://github.com/juliangruber/keypair/blob/87c62f255baa12c1ec4f98a91600f82af80be6db/index.js#L1008] 是:`b.putByte(String.fromCharCode(next & 0xFF))`。`putByte` 的 [definition](https://github.com/juliangruber/keypair/blob/87c62f255baa12c1ec4f98a91600f82af80be6db/index.js#L350-L352) 是 `util.ByteBuffer.prototype.putByte = function(b) {this.data += String.fromCharCode(b);};`。简化后即 `String.fromCharCode(String.fromCharCode(next & 0xFF))`。双重 `String.fromCharCode` 几乎可以肯定是无意的,也是弱种子的根源。不幸的是,这并不会导致错误。相反,它会导致缓冲区的大部分内容为零。由于我们使用 0xFF 进行掩码操作,可以确定 LCG 输出的 97% 都会被转换为零。唯一能产生有意义值的输出是 48 到 57(含)之间的输出。其影响是,RNG 种子中的每个字节有 97% 的概率因错误转换而为 0。当不为 0 时,这些字节为 0 到 9。综上所述,存在三个直接问题:1. 该库存在不安全的随机数回退路径。理想情况下,该库应要求使用强 CSPRNG,而不是尝试使用 LCG 和 `Math.random`。2. 即使 NodeJS 中有可用的强 CSPRNG,该库在 NodeJS 中运行时也不能正确使用强随机数生成器。3. 回退路径在实现中存在一个问题,即大部分种子数据实际上将为零。由于随机数生成不良,keypair 生成的 RSA 密钥相对容易被猜测。这可能使攻击者能够解密机密消息或获得对受害者账户的未经授权访问。
来源
1使用易受攻击密钥对版本生成的私钥(CVE-2021-41117)
负责任的使用
仅在您拥有或有权测试的系统上使用漏洞信息。 Kitploit 链接到公共研究元数据,并且不存储漏洞代码或恶意负载。