CVE-2026-32630: CVE-2026-32630: 通过数据放大导致的拒绝服务(file-type npm 包)
发布: (2026年3月14日 GMT+8 11:40)
4 分钟阅读
原文: Dev.to
Source: Dev.to
漏洞概述
- 漏洞编号: CVE‑2026‑32630
- CVSS v3.1 评分: 5.3(中等)
- 发布时间: 2026‑03‑13
- 攻击向量: 网络
- 影响: 拒绝服务(内存耗尽)
- CWE: CWE‑409(对高度压缩数据处理不当)
- CISA KEV 状态: 未列出
file‑type npm 包(版本 20.0.0 至 21.3.1)在解压内部 ZIP 条目时未始终强制执行内存分配限制。未经身份验证的远程攻击者可以提供一个精心构造的高度压缩 ZIP 档案(“ZIP 炸弹”),触发大量内存分配,导致 Node.js 进程因内存耗尽(OOM)而崩溃。
受影响的版本
- 易受攻击的范围:
>= 20.0.0, < 21.3.2 - 已修复于:
21.3.2
任何使用以下方式的 Node.js 应用程序:
- 使用
file-type版本 20.0.0 至 21.3.1,或 - 使用受影响的库对用户上传的文件进行 MIME‑type 验证
均可能受到此问题的影响。
技术细节
- 该库在解压 ZIP 条目时未进行可靠的大小检查。
- 当 ZIP 条目的大小未知(
hasUnknownFileSize条件)时,解压限制被绕过。 - 精心构造的 ZIP 条目可以在内存中膨胀至数十 GB,耗尽进程堆并导致 OOM 崩溃。
这是一种经典的 ZIP 炸弹 攻击,归类于 CWE‑409,因为软件未能正确处理高度压缩的数据。
修复与加固(21.3.2)
| 更改 | 描述 | 提交 |
|---|---|---|
| 主要修复 | 通过移除 hasUnknownFileSize 条件,强制对 ZIP 条目解压施加 1 MiB 限制。 | a155cd7 |
| 加固 1 | 将最大 ZIP 条目数限制为 1024。 | 6954817 |
| 加固 2 | 引入 maximumDetectionReentryCount,防止深层嵌套对象导致栈溢出。 | d2ecea1 |
| 加固 3 | 为 EBML 和 PNG 解析器添加循环保护,以防止 CPU 耗尽。 | 370ed91 |
修复步骤
识别使用情况
npm ls file-type更新依赖
- 在
package.json中将版本要求改为^21.3.2(或更高)。 - 运行
npm install以刷新package‑lock.json。
- 在
测试
- 将更新后的应用部署到预发布环境。
- 进行回归测试,特别是文件上传处理相关的功能。
监控
- 在生产环境中监视异常的内存峰值或进程重启情况。
其他缓解措施
- 将文件解析任务放在 Node.js Worker Threads 中运行,并设置严格的内存限制。
- 在负载均衡器或 WAF 层强制最大上传大小。
- 审计完整的依赖树,查找是否有易受影响的
file-type版本的传递依赖。
参考资料
- GitHub 安全通报:GHSA‑j47w‑4g3g‑c36v
- 完整 CVE 报告:CVE‑2026‑32630(可在发布机构网站上获取)