npm 12默认禁用安装脚本,斩断供应链攻击命脉
npm 12默认禁用安装脚本、Git和远程依赖,大幅降低开源供应链攻击风险。GitHub同时限制绕过2FA的细粒度令牌(GATs),要求人工审批发布。pnpm 11.10引入安全认证配置。本文详解变更细节、攻击链阻断原理及开发者迁移指南,助力DevSecOps加固软件供应链。
⛓️ High 供应链攻击
GitHub发布npm 12,默认禁用安装脚本和Git/远程依赖,显著降低开源软件供应链攻击面;同时限制绕过2FA的细粒度访问令牌(GATs),防止自动化发布被滥用。配套的pnpm 11.10也引入了更安全的认证配置方式,阻止恶意项目文件劫持令牌。
来源:The Hacker News | 2026-07-09 | 原文链接
🔍 关键发现
- npm 12默认关闭install scripts(allowScripts=false),preinstall/install/postinstall及node-gyp构建不再自动执行,改为需用户手动审批白名单。
- --allow-git和--allow-remote默认均为none,直接或传递性Git依赖及远程tar包依赖不再自动解析,必须显式授权。
- npm 12引入`npm approve-scripts`命令,引导开发者生成并提交可信任脚本白名单(存储于package.json)。
- 绕过2FA的细粒度访问令牌(GATs)将被逐步限制:2026年8月起无法执行敏感账户/包/组织管理操作;2027年1月起无法直接发布,仅能通过人工2FA审核的“暂存发布”模式进行。
- pnpm 11.10新增`_auth`设置,将凭据与主机URL绑定,且只从环境变量或全局配置读取,防止项目文件(如pnpm-workspace.yaml、.npmrc)被篡改后重定向令牌。
⚔️ 攻击链分析
攻击者通过构造恶意npm包,在postinstall脚本中执行挖矿、信息窃取或后门植入操作;或利用Git依赖/远程tar包引入恶意代码。若开发者未显式审批,npm 12默认阻止此类自动执行,从源头截断攻击链。此外,GATs绕过2FA曾允许攻击者窃取令牌后直接发布恶意版本;新规要求人工2FA审批,增加攻击成本。
🛡️ 缓解建议
- ✅ 升级至npm 12(或npm 11.16.0+),运行`npm install`后检查警告并运行`npm approve-scripts --allow-scripts-pending`,审核并提交可信脚本白名单。
- ✅ 停止使用绕过2FA的GATs进行敏感操作,改为交互式2FA完成;自动化发布迁移至OIDC可信发布或含人工审批的暂存发布模式。
- ✅ 使用pnpm 11.10+,通过环境变量或全局配置设置`_auth`,避免项目文件中存储凭据。
- ✅ 定期审计package.json中的allowScripts白名单,仅保留必要脚本。
涉及漏洞:[]
⚠️ 本文仅供安全研究与学习,IOC 信息请勿用于非法目的。
🤖 常见问题解答(FAQ)
❓ 升级npm 12后现有项目会报错吗?如何适配?
会因默认禁止脚本导致依赖安装失败。需运行`npm install`查看警告,再执行`npm approve-scripts --allow-scripts-pending`,将可信脚本加入package.json的allowScripts白名单并提交。
❓ GATs绕过2FA被禁后,CI/CD如何发布npm包?
推荐迁移至OIDC可信发布(如GitHub Actions OIDC)或暂存发布:先用令牌暂存,再通过人工2FA审批后正式发布。2027年1月起直接发布功能将被移除。
❓ pnpm的_auth设置如何防止令牌劫持?
`_auth`将凭据与registry URL绑定,且只从环境变量或全局配置读取,不读取项目内pnpm-workspace.yaml或.npmrc。即使攻击者篡改项目文件,也无法重定向令牌到其他主机。