Undici CVE-2026-22036: 无界解压链导致资源耗尽 — 补丁已发布

ReactNode.jsDevOps

发生了什么

  • 在2026年1月14日,undici项目发布了一份安全通告(CVE-2026-22036 / GHSA-g9mf-h72j-4rw9):某些带有特制Content-Encoding头的HTTP响应可能会创建无界解压链,允许恶意服务器强迫客户端进行过度的CPU工作和内存分配,这些客户端会自动解压响应。补丁版本已发布。(github.com)

为什么全栈团队必须关注

  • Undici是Node.js的事实上的高性能HTTP/1.1客户端,直接用于许多服务器端服务,并通过打包它的传递依赖和运行时间接使用。远程服务器(或任何你的服务所连接的上游)可以在盲目接受任意长的Content-Encoding链的HTTP客户端中触发资源耗尽——这对边缘服务器和调用第三方API的后端服务构成了可用性(DoS)风险。
  • 该漏洞影响响应处理(可用性),而不是数据机密性。尽管如此,可用性事件会导致停机、扩展风暴和微服务图中的级联故障——因此,对于接受不受信任的上游响应的互联网面对和内部服务,补丁是紧急的。

受影响和修复版本(简短)

  • 受影响:undici版本 < 6.23.0 和 7.0.0 <= 版本 < 7.18.2(请参阅通告以获取确切范围)。
  • 修复:升级到6.23.0或7.18.2(或更高的7.x版本)。(github.com)

团队的实用高影响清单(现在该做什么)

  1. 快速清点

    • 运行:npm/yarn/pnpm的依赖树检查以定位undici(直接和传递)。
      • 示例检查:npm ls undici || pnpm why undici。
    • 检查容器基础镜像和服务器运行时(某些Node构建会打包undici);检查你的Docker镜像是否包含vendored undici或包含它的Node镜像。
  2. 在你控制的依赖项中升级

    • 直接依赖:将undici提升到>= 7.18.2(如果必须保持在6.x,则为6.23.0),然后重新构建和重新部署。
    • 传递依赖:优先更新引入undici的顶级包;如果不可能,使用包管理器覆盖(npm/yarn/pnpm)或解析规则在你的锁定文件中强制使用补丁的undici版本。
  3. 对于打包undici的Node运行时

    • 检查你的Node.js发布说明或供应商构建以获取打包的undici版本。如果打包的undici存在漏洞,请将Node升级到供应商提供的安全补丁运行时(或遵循供应商指导)。
    • 如果你无法立即升级Node,请使用下面描述的应用级缓解措施。
  4. 添加轻量级运行时缓解措施(深度防御)

    • 如果你控制HTTP客户端代码,请添加解压/响应拦截器,拒绝长或不合理的Content-Encoding链(限制编码数量)。
    • 在undici中,你可以添加一个拦截器来检查Content-Encoding头,并在解压运行之前拒绝或截断可疑链。
    • 通过在HTTP响应上应用合理的响应大小限制和超时(例如,maxHeaderSize、响应超时)来限制内存占用和CPU使用。
  5. CI、容器和编排

    • 确保你的CI管道验证锁定文件,并在引入旧版undici时失败。
    • 以受控的节奏(金丝雀 → 部署)重新构建容器镜像并重新部署关键服务,以避免在没有验证的情况下广泛推出破坏性更改。
  6. 检测和监控

    • 添加或审查运行时指标:每请求CPU、请求延迟、在外发HTTP调用后的内存增长。
    • 为与外发获取调用或特定上游主机相关的意外峰值添加警报。在事件窗口期间审计获取目标的日志可以帮助识别恶意上游。

为什么现在采取行动具有高价值

  • 这是一个可用性/DoS向量,可以被任何你的代码调用的服务器远程触发。即使利用相对复杂,微服务架构中的爆炸半径也很大:攻击者或配置错误的上游可能会导致许多调用者持续高CPU/内存。
  • 补丁过程简单(版本升级或简单的拦截器),并提供即时保护;结合监控和锁定文件卫生以避免回归。

一行修复

  • 将undici升级到补丁版本(6.23.0或>=7.18.2),重新构建镜像并部署;如果你不能立即升级,请添加undici拦截器以拒绝长Content-Encoding链,并施加更严格的响应大小/时间限制。(github.com)

来源

  • Undici安全通告:GHSA-g9mf-h72j-4rw9(CVE‑2026‑22036)。 (github.com)

来源

继续阅读