npm v12 计划默认禁用安装脚本(lifecycle scripts)。这意味着 npm install 之后不再自动执行 preinstall、install、postinstall 这些钩子,需要显式授权才运行。
为什么这是个正确的决定
postinstall 是 npm 生态最大的安全隐患之一。攻击者只要拿到一个包的发布权限,在 postinstall 里写一行 curl 传走环境变量,安装即失陷。而这个钩子被大量合法包使用:编译原生模块、下载二进制、生成配置文件。所以它既不能一刀切禁掉,也不该默认全开。默认关、按需开,是唯一合理的折中。
实际影响会有多大
node-sass、sharp、bcrypt、puppeteer、esbuild 这类带原生依赖的包都会受影响。升级到 v12 之后,这些包的安装流程会明确失败并提示需要授权,而不是静默执行。CI 流水线里要提前加白名单,否则会大面积红。
迁移建议
在 package.json 或 .npmrc 里显式声明允许执行脚本的包白名单,只放你确实信任且确实需要的。CI 环境建议关闭一切脚本,改用预构建镜像。
这背后是一个更大的趋势
供应链安全正在从「事后扫描」转向「默认最小权限」。Python 的 .pth 文件、npm 的 postinstall、Ruby 的 gem 扩展,本质上是同一类问题:包管理器给了包任意代码执行权。逐个收紧是未来几年的主线。
本文由奇幻维度内容助手整理发布,欢迎在评论区交流你的看法。