PAYATHON 2026

Angular 21 的 Undici 7.22.0 漏洞只能通过降级解决吗?

数据小许

保留 Angular 21 并修复漏洞

不必直接降级到 @angular/build@20.3.21。可以先更新 Angular 21 系列的构建工具;如果暂时无法更新,可以用 npm 的 overrides 为 @angular/build 指定修复后的 Undici 版本。

题中列出的六项漏洞,在 Undici 7.x 分支中均从 7.24.0 起得到修复。Angular CLI 官方也已合并 21.2.x 分支的依赖更新,将 Undici 从 7.22.0 更新到 7.24.4。因此,除了降级或继续等待,还可以尝试更新依赖。参见 Angular CLI 官方依赖更新 PR。

上述版本修复的是题中列出的漏洞,不能据此认定某个历史版本不存在后来披露的漏洞。选用版本时仍需结合当前的 npm audit 结果。

为什么 npm audit 会建议降级?

原始日志显示,漏洞通过以下依赖链进入项目:

@angular/build@21.2.2
└── undici@7.22.0

日志将 @angular/build 标记为受影响,是因为它依赖的 Undici 版本存在漏洞。npm audit 给出的自动修复路径涉及将构建工具切换到 20.3.21,但其他修复方式也可能可行。

npm audit fix --force 允许安装超出当前依赖声明范围的版本,包括跨主版本变更。日志已经提示 breaking change,降级又会破坏构建,因此应先检查依赖并手动选择更新方案。具体行为见 npm audit 官方文档。

优先更新 Angular 21 的构建工具

先确认实际安装情况,并查询当前可用的 Angular 21 版本:

npm explain undici
npm ls @angular/build undici
npm view @angular/build@21 version

再检查准备安装的版本所声明的依赖和兼容要求:

npm view @angular/build@<目标版本> dependencies.undici
npm view @angular/build@<目标版本> peerDependencies engines

将 <目标版本> 替换为实际版本号。选择已更新 Undici 且满足项目兼容要求的 Angular 21 版本,并协调更新项目中的 Angular CLI 和相关构建包。官方 PR 的合并记录说明上游已做出修改;项目是否采用了该修改,还要以安装后的依赖树为准。

暂时无法更新时,使用 overrides

在项目根目录的 package.json 中合并以下配置:

{
  "overrides": {
    "@angular/build": {
      "undici": "7.24.4"
    }
  }
}

这里的 7.24.4 是上述 Angular 官方 PR 采用的版本,用于说明如何处理题中的依赖问题。实际使用时,应选择经过当前漏洞检查、并满足 Node.js 和项目兼容要求的修复版本。

这个配置将覆盖范围限定在 @angular/build 的依赖链。npm 要求将 overrides 放在项目根目录的 package.json 中,并支持通过嵌套配置按父依赖限定覆盖范围。参见 npm overrides 官方文档。

保存配置后执行:

npm install
npm ls undici
npm audit
npx ng build

npm install 会重新解析依赖并更新锁文件。检查 package-lock.json 的差异,确认目标依赖已发生变化,再将它与 package.json 一起提交。

如果 npm ls undici 仍显示其他受影响版本,继续用 npm explain undici 查找来源。限定在 @angular/build 下的覆盖规则不会处理所有独立依赖链。

如何确认修复有效?

修复后需要检查依赖,也要验证项目功能:

  • 依赖检查:确认安装后的依赖树不再包含触发题中公告的版本,并重新运行 npm audit 检查其他漏洞。
  • 功能检查:执行项目现有测试和实际使用的构建流程;使用 SSR、预渲染或开发服务器的项目,也应验证对应路径。

在项目顶层单独安装新版 undici,不能保证替换 @angular/build 使用的那一份依赖;判断依据应是最终依赖树。

覆盖依赖后仍需验证兼容性。上游正常更新并满足项目要求后,可以移除临时 overrides,重新安装并验证。仅凭题中的日志,无法保证整个项目的所有漏洞都会随这次调整一并消失。

备注:内容仅供参考。