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 条目数限制为 10246954817
加固 2引入 maximumDetectionReentryCount,防止深层嵌套对象导致栈溢出。d2ecea1
加固 3为 EBML 和 PNG 解析器添加循环保护,以防止 CPU 耗尽。370ed91

修复步骤

  1. 识别使用情况

    npm ls file-type
  2. 更新依赖

    • package.json 中将版本要求改为 ^21.3.2(或更高)。
    • 运行 npm install 以刷新 package‑lock.json
  3. 测试

    • 将更新后的应用部署到预发布环境。
    • 进行回归测试,特别是文件上传处理相关的功能。
  4. 监控

    • 在生产环境中监视异常的内存峰值或进程重启情况。
  5. 其他缓解措施

    • 将文件解析任务放在 Node.js Worker Threads 中运行,并设置严格的内存限制。
    • 在负载均衡器或 WAF 层强制最大上传大小。
    • 审计完整的依赖树,查找是否有易受影响的 file-type 版本的传递依赖。

参考资料

  • GitHub 安全通报:GHSA‑j47w‑4g3g‑c36v
  • 完整 CVE 报告:CVE‑2026‑32630(可在发布机构网站上获取)
0 浏览
Back to Blog

相关文章

阅读更多 »