前言
sha.js 是 JavaScript 生态里最常用的轻量级加密库。
它由 Browserify 社区维护,体积不足 20 KB,却实现了 SHA-1、SHA-224、SHA-256、SHA-384、SHA-512 全系列算法,是 crypto-browserify、webpack、web3.js 等数百个流行包的“根依赖”。
而就在前几天,美国 NVD(国家漏洞库)正式发布 CVE-2025-9288,指向 JavaScript 加密库 sha.js。
事件概述
美国 NVD(国家漏洞库)正式发布 CVE-2025-9288
指向 JavaScript 加密库 sha.js。该漏洞被评定为 严重级(CVSS 9.1),影响 每周 1 400 万次下载 的 Node.js 与浏览器端项目,堪称 2025 年波及面最广的前端供应链事件之一。
- 官方修复版本:sha.js 2.4.12(已推送 npm)
- 受影响版本:≤2.4.11
漏洞原理
sha.js 在处理输入时 未校验数据类型与长度,攻击者通过构造畸形对象:
{ length: -1 }
即可触发:
- 哈希降级 / 碰撞:相同摘要对应不同数据
- DoS 无限循环:CPU 被瞬间打满
- 私钥恢复:若哈希结果作为随机数 nonce,可反向推导私钥
波及面
35 个库 / 框架 / 工具链
15 个高频直接依赖库
# | 典型受感染版本 | 备注 | |
1 | browserify | ≤17.0.0 | 打包器 |
2 | create-hash | ≤1.2.0 | 被大量加密库二次封装 |
3 | create-hmac | ≤1.1.7 | HMAC 封装 |
4 | crypto-browserify | ≤3.12.0 | Web 环境 crypto polyfill |
5 | crypto-js | ≤4.1.1 | 重新打包 sha.js 旧代码 |
6 | elliptic | ≤6.5.4 | 椭圆曲线运算 |
7 | ethers | ≤4.0.47 / 5.6.8 | 以太坊 JS SDK |
8 | ganache-cli | ≤6.12.2 | 本地区块链 |
9 | hash.js | ≤1.1.7 | sha.js 的别名发布 |
10 | keccak | ≤3.0.2 | 以太坊 Keccak 封装 |
11 | merkle-patricia-tree | ≤4.2.4 | 以太坊状态树 |
12 | mocha | ≤9.2.2 | 测试框架(开发依赖) |
13 | parcel-bundler | ≤2.8.3 | 零配置打包器 |
14 | web3 | ≤1.7.0 | 以太坊官方 JS SDK |
15 | webpack | ≤4.46.0 / ≤5.74.0 | 构建工具 |
20 个间接或场景级受影响库 / 框架 / 工具链
# | 包名 / 组件 | 场景说明 |
16 | @solana/web3.js | Solana 链 JS SDK(历史版本锁定) |
17 | @truffle/contract | Truffle 测试套件 |
18 | @vue/cli-service | Vue CLI 打包链 |
19 | @angular-devkit/build-angular | Angular CLI |
20 | @react-native-community/cli | React Native CLI |
21 | hardhat | 以太坊本地开发框架 |
22 | remix-dev | Remix 全栈框架 |
23 | next | Next.js SSR 框架 |
24 | nuxt | Nuxt.js SSR 框架 |
25 | expo-cli | Expo RN 开发工具 |
26 | serverless | Serverless Framework |
27 | electron-builder | Electron 打包器 |
28 | @babel/preset-env | Babel 转译链 |
29 | jest-environment-jsdom | Jest 测试环境 |
30 | ts-node | TypeScript 运行时 |
31 | lerna | Monorepo 管理 |
32 | gulp-cli | 流式构建工具 |
33 | rollup-plugin-node-polyfills | Rollup Node Polyfill |
34 | vite | Vite 构建工具(部分插件) |
35 | astro | Astro 静态站点生成器 |
自查清单
# 1. 查看本机 / CI 是否存在旧版本npm ls sha.js# 2. 全局搜索 lock 文件grep -E 'sha\.js@2\.4\.(1[0-1]|[0-9])' package-lock.json yarn.lock pnpm-lock.yaml# 3. 使用 SCA 工具(推荐)npx audit-ci --moderate
一键修复方案
# 升级到官方修复版npm install sha.js@2.4.12 --save-exact# 自动修复所有依赖链npm audit fix --force# 重新构建并测试npm run build
临时缓解(无法立即升级时):
在调用 sha.js 前加入类型校验,仅允许 string 或 Buffer 类型输入。