🎯 CVE-2026-71851 深度技术分析:漏洞根因 · PoC/EXP · 检测指纹

🎯 CVE 全聚合深度分析

CVE-2026-71851 深度技术分析

📊 聚合 3 来源🧪 含 PoC
NVD-LatestGitHub-AdvisoryPoC-in-GitHub

摘要:CVE-2026-71851 是知名 JavaScript 加密库 crypto-js 在 4.0.0 之前版本中出现的一个严重随机数安全缺陷。其 CryptoJS.lib.WordArray.random() 没有使用密码学安全伪随机数生成器(CSPRNG),而是采用了一个由 Math.random() 播种的自定义 Multiply-With-Carry(MWC)伪随机生成器。攻击者不需要攻击整个 128 位或 256 位密钥空间,只需枚举约 239 或 247 个有效种子状态,即可恢复利用该函数生成的 BIP39 助记词并控制相关区块链资产。NVD 给出的 CVSS 评分为 9.0,属于严重(Critical)级别。

📌 漏洞概述

CVE 编号:CVE-2026-71851
CVSS 分数:9.0(Critical)
NVD 影响版本:crypto-js < 4.0.0
修复版本:4.0.0
漏洞类型:CWE-338(使用密码学弱伪随机数生成器)/ CWE-330(使用不充分随机值)
受影响接口:CryptoJS.lib.WordArray.random()

crypto-js 是 JavaScript 生态中最广泛使用的密码学工具库之一,用于 Hash、HMAC、AES、RSA 等标准算法。本次漏洞并非针对某个具体算法,而是针对其随机数生成入口。在 3.x 版本中,WordArray.random() 被很多安全敏感场景调用,例如生成加密密钥、Token 以及 BIP39 助记词熵源。该函数名义上返回 128 位或 256 位随机数据,但实际熵远低于预期,导致攻击者可以在普通计算设备上暴力枚举并预测输出。

🔬 漏洞根因分析

WordArray.random() 的设计目标是产生不可预测的随机字节序列。在 3.1.2-4 版本之前,该函数直接或间接地基于 Math.random() 填充数据。作为一种典型的非密码学随机源,Math.random() 由 JavaScript 引擎内部的 LCG 或类似的 PRNG 实现,其状态通常只有 32 到 53 位熵,根本不能满足安全场景的需求。

为了回应社区对安全随机数的质疑,开发者于 2014 年在 commit brix/crypto-js@ff1f003 中引入了一个自定义的 Multiply-With-Carry(MWC)伪随机数生成器。MWC 算法由 George Marsaglia 提出,其递推关系本质上是一个带进位的乘法线性同余生成器。在 crypto-js 的实现中,内部状态由 32 位乘数和进位组成,并通过 Math.random() 的输出来初始化这些状态。

问题在于,MWC 生成器的安全性完全依赖于种子状态的质量和状态空间的大小。而 crypto-js 的自定义实现存在三个致命弱点:

  • 非密码学随机源播种:所有状态都来自 Math.random(),而 Math.random() 不允许用于密码学目的,其内部状态可能被恢复或预测。
  • 状态空间坍缩:尽管该函数对外声称返回 128 位或 256 位随机数据,但生成的随机字并非独立熵源,而是由同一个 MWC 生成器从初始种子序列展开得到。攻击者只需要枚举初始状态即可重放整个输出。
  • 有效搜索空间极小:经过逆向分析和实际 POC 验证,当请求 128 位熵时,该生成器的可枚举初始状态空间只有约 239 种;请求 256 位熵时,搜索空间也只增加到约 247 种。这与名义上的 128/256 位安全强度相差了数十个数量级。

从攻击者的角度看,即使不知道目标输出,也可以按以下方式攻击:

  1. 基于已知或假设的时间点,确定 Math.random() 可能的种子范围;
  2. 枚举当前 MWC 生成器的所有可达状态(约 239 或 247);
  3. 对每个状态生成 WordArray.random(16)WordArray.random(32) 的输出;
  4. 将该输出映射为 BIP39 助记词、派生私钥并与目标钱包地址匹配。

PoC 仓库 weakrng-sweep 正是采用了类似思路:该工具枚举多种 PRNG 方案与 uint32 种子矩阵,并针对 crypto-js 3.3.0 的 MWC 实现做了逐字节验证(schemes 14-15),证明攻击者可以在现代 GPU/CPU 上完成碰撞。

值得注意的是,即使某些 3.x 版本尝试回退或调整该 MWC 实现,任何 Math.random() 派生的方案都不具备密码学安全性。因此 NVD 将所有 4.0.0 之前版本标记为受影响,修复必须升级到 4.0.0。

💥 影响与危害

该漏洞最严重的下游危害是区块链钱包失窃。Coinspect 团队的 “Ill Bloom” 调查已确认,有真实钱包应用将 CryptoJS.lib.WordArray.random() 作为 BIP39 助记词的熵源。由于助记词直接派生私钥,攻击者枚举出有限的随机输出空间后,可以批量恢复私钥并转移目标地址中的资金。

除 BIP39 之外,所有使用该接口生成安全敏感数据的场景同样受影响:

  • 对称加密密钥(如 AES 密钥)生成;
  • 密码重置 Token / 会话 ID;
  • JWT HMAC 签名密钥;
  • 任何将 WordArray.random() 当作 CSPRNG 使用的业务逻辑。

从生态影响来看,crypto-js 是一个依赖链底层的库,众多 npm 包传递依赖它会放大漏洞影响。但需要明确的是:仅仅安装 crypto-js < 4.0.0 并不等于可利用,只有当期代码真正调用 WordArray.random() 来生成安全关键值时才可被利用。然而,这种滥用可能非常隐蔽,许多开发者误以为 crypto-js 的 random 函数与 Node.js 的 crypto.randomBytes 具备同等安全性。

此外,CISA KEV 尚未收录该 CVE,也暂未见公开的高质量 Exploit 模块。但 PoC 工具的出现证明该漏洞的技术可行性极高,且目标价值巨大(数字货币钱包)。一旦攻击者将枚举过程做成自动化服务,基于该漏洞的批量资窃取攻击将迅速蔓延。

🛡️ 修复与缓解

  • 升级到 crypto-js 4.0.0 或更高版本:4.0.0 使用 Web Crypto API / Node.js 的 crypto.getRandomValues 作为后端,这是真正的 CSPRNG,彻底修复了熵不足问题。
  • 替换随机数调用:对于无法立即升级的旧项目,请立即将 CryptoJS.lib.WordArray.random() 全部替换为 crypto.getRandomValues(浏览器)或 crypto.randomBytes(Node.js)。例如:Uint8Array 配合 CryptoJS.lib.WordArray.create() 转换。
  • 轮换所有密钥与助记词:凡是可能通过旧版本 WordArray.random() 生成的 BIP39 助记词、私钥、Token、密钥对,都应视为已泄露,必须立即重新生成并迁移资产。
  • 审计依赖链:使用 npm audit、Snyk、JFrog Xray 等工具扫描全量依赖,确认是否存在 crypto-js 低版本传递依赖;对使用的钱包 SDK 进行代码审计,确保底层没有调用脆弱的随机函数。
  • 避免自定义加密随机方案:不要尝试在 crypto-js 3.x 上“发明”修复补丁,也不要继续使用任何基于 Math.random() 的替代方案。标准做法是调用平台原生 CSPRNG。

安全团队应将该 CVE 列为最高优先级处理,尤其是涉及数字资产托管、钱包生成、签名服务和高价值密钥管理的业务,必须在补丁完成后进行完整的安全复审与密钥迁移。

🧪 PoC 复现

从 GitHub 公开仓库抓取的实际 PoC 代码(仓库)。

📋 代码元数据语言md来源brendonlee20042004-sys/weakrng-sweep针对性✅ 已验证与漏洞相关(代码含 CVE 引用)依赖见代码注释/README用法详见代码注释中的使用说明

# weak-rng sweep (CVE-2026-71851 class)

Research tool: enumerates PRNG schemes x uint32 seeds,derives BIP39 wallets,checks membership against a victim address set (defensive research,illbloom-style).

Schemes: 0-10 (illbloom: MT19937/glibc/Java/LCG/xorshift),11-13 (glibc-31 LCG),14-15 (crypto-js 3.3.0 WordArray.random MWC port,byte-verified vs node).

Run: Actions ->mwc-sweep ->
Run workflow.

⚔️ EXP 利用代码

截至分析时,Exploit-DB 未收录该 CVE 的公开利用代码。可利用上述 PoC 进行验证,或关注 Exploit-DB 更新。

🕵️ 检测指纹

当前规则库未收录针对该 CVE 的专用检测规则。建议:

  • 根据漏洞根因编写 Nuclei 检测模板
  • 在 WAF/IDS 中配置针对漏洞特征的规则
  • 关注漏洞指纹库更新

🤖 本文由漏洞情报系统自动聚合生成 · 2026-08-31 22:07 · 数据源: NVD/GitHub-Advisory/OSV/CISA-KEV/Exploit-DB/PoC-in-GitHub + 检测规则库

[!] CONTACT_CHANNELS

如需商务合作、技术咨询或漏洞反馈,请通过以下离岸节点联系作者。

> PING_AUTHOR (@A1RedTeam)