npm 12 默认禁用依赖脚本执行,应对 Shai-Hulud 供应链攻击
GitHub 宣布,自 npm 12 版本起(预计 2026 年 7 月发布),npm install 将不再默认执行来自依赖的 preinstall、install、postinstall 脚本,除非用户在项目中显式允许。这一调整直接回应了近期针对 npm 生态的供应链攻击浪潮,尤其是 TeamPCP 和 Shai-Hulud 自复制蠕虫利用默认脚本自动执行机制感染了数千名开发者。
受影响的范围还包括原生 node-gyp 构建(例如仅包含 binding.gyp 且无显式 install 脚本的包),以及来自 git、file 和 link 依赖的 prepare 脚本。此前 Shai-Hulud Miasma 攻击正是通过武器化的 binding.gyp 文件实施入侵。
开发者可先运行以下命令测试当前项目受影响的情况:
npm approve-scripts --allow-scripts-pending
该命令会将信任的包加入白名单并写入 package.json,其余包的脚本将被阻止。提交该 JSON 后,使用 npm 11.16.0 及以上版本的用户会在安装过程中看到警告。
此外,npm 12 还收紧了 Git 依赖和远程 URL 依赖的处理:Git 依赖(直接或传递)默认不再在 npm install 时解析,除非显式允许——此举堵住了以往即使加 --ignore-scripts 也能通过 .npmrc 覆盖 Git 可执行文件的代码执行路径。远程 URL 依赖(包括 HTTPS tarball)同样默认不解析,但可通过 --allow-remote 标志放行(该标志自 11.15.0 已可用)。
GitHub 建议开发者:先升级到 npm 11.16.0 或更高版本,运行正常安装并检查警告,使用 approve-scripts 命令批准信任的脚本并提交更新后的 package.json,这样在升级到 12 后只有已批准的脚本会继续运行。
Re: npm 12 默认禁用依赖脚本执行,应对 Shai-Hulud 供应链攻击
感谢分享!这个改动确实很有必要,Shai-Hulud 这类供应链攻击已经让 npm 生态吃尽苦头。默认禁用脚本执行能从根源上阻断很多危险路径,虽然开发体验上会多一步审批操作,但安全账显然更重要。另外,收紧 Git 依赖解析这点也补上了不少老漏洞,之前用 --ignore-scripts 还能绕过的隐患总算被堵住了。Re: npm 12 默认禁用依赖脚本执行,应对 Shai-Hulud 供应链攻击
感谢分享这个重要更新!npm 12 这个改变确实很有必要,Shai-Hulud 供应链攻击的影响范围看起来不小,尤其是那些利用 binding.gyp 和默认脚本自动执行的漏洞,让很多开发者防不胜防。提前用 approve-scripts 把信任的脚本白名单化,再配合新版 npm 的强制阻断,感觉能大大降低类似攻击的风险。不过我也在想,对于需要依赖脚本编译原生模块的项目,迁移到 npm 12 后会不会增加一些配置工作量?希望官方能出一份更详细的迁移指南。Re: npm 12 默认禁用依赖脚本执行,应对 Shai-Hulud 供应链攻击
这个改动很及时。之前Shai-Hulud那波攻击确实让人后怕,好多项目都是因为依赖安装时自动执行脚本中了招。默认关闭脚本执行,虽然可能会让一些依赖安装方式需要调整,但安全上的收益是实打实的。建议团队尽快试用 `npm approve-scripts` 把信任的脚本列出来,早适配早安心。
页:
[1]