github近日發布了一則技術公告,正式確認 npm v12 將引入一系列重大的安全政策變更——這些更新並非功能迭代,而是針對供應鏈風險的主動防禦措施。開發者必須立即評估現有專案如何依賴自動化腳本與遠端依賴,並提前完成必要的調整;否則,一旦 v12 全面啟用,建構流程將會中斷、依賴無法安裝,甚至 ci/cd 管道可能失效,或本地開發環境陷入癱瘓。
npm v12 的核心安全機制大修聚焦於三個關鍵控制點:
1. 預設禁用腳本執行(allow-scripts = false)
`npm install` 將完全停止自動執行任何生命週期腳本,包括 `preinstall`、`install`、`postinstall`,以及隱式觸發的 `node-gyp` 編譯工作流程——即使僅存在一個 `binding.gyp` 檔案也會被阻擋。`prepare` 腳本同樣受到此限制。任何需要執行的腳本都必須經由明確授權——先透過 `npm approve-scripts --allow-scripts-pending` 確認待審核的套件,再以 `npm approve-scripts` 個別加入白名單,
kg> 或以 `npm deny-scripts` 加入黑名單。
kg> 授權紀錄將永久儲存在 `package.json` 的 `scripts-allowlist` 欄位中,強烈建議將這些條目納入版本控制管理的提交紀錄。
2. 預設封鎖 git 依賴(--allow-git = none)
所有透過 git 協議取得的依賴——如 `git+ssh://` 或 `git+https://`——不論是直接宣告還是間接傳遞,都將不再解析。若要啟用,必須明確加上 `--allow-git` 選項,並支援如 `--allow-git=github.com` 等細粒度設定。
3. 預設禁用遠端資源存取(--allow-remote = none)
http(s) 形式的 tarball 以及存放於 cdn 或私人倉庫的遠端軟體包——例如 `https://example.com/pkg.tgz`——均禁止載入。若要允許此類存取,開發者必須明確指定 `--allow-remote`,並可進一步透過定義域名白名單來限制存取範圍。
這項變革直指 npm 生態系統供應鏈面臨日益嚴峻的威脅。近期,沙蟲組織釋出一款被稱為「沙蟲」的惡意程式,已透過竊取憑證在各倉庫間進行橫向擴散,感染了數千個公開套件,具備極強的隱蔽性與快速傳播能力。v12 引入的「預設拒絕、明確授權」模式,實際上將執行控制權交還給開發者:即便未經授權的套件遭到入侵,其惡意的 `preinstall` 腳本也無法自動觸發,從根本上切斷載荷注入的連鎖,大幅提高生態系統整體對攻擊的抵禦能力。