【js】加密库sha.js 严重漏洞速查

前言

sha.jsJavaScript 生态里最常用的轻量级加密库。

它由 Browserify 社区维护,体积不足 20 KB,却实现了 SHA-1、SHA-224、SHA-256、SHA-384、SHA-512 全系列算法,是 crypto-browserifywebpackweb3.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 }

即可触发:

  1. 哈希降级 / 碰撞:相同摘要对应不同数据
  2. DoS 无限循环:CPU 被瞬间打满
  3. 私钥恢复:若哈希结果作为随机数 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 类型输入。