npm 12 正式發布,這次更新的核心在於安全性模型的根本轉變。由 GitHub 維護並隨 Node.js 配送的 npm 作為全球最大的軟體套件庫,其依賴管理機制長期以來面臨著供應鏈攻擊的風險。為了應對此問題,npm 12 將原本自動執行的三項安裝行為改為預設為禁用,要求開發者必須採取顯式信任(Explicit Trust)的方式,手動核准信任的套件才能執行相關腳本。
背景與安全風險
在過去的 npm 版本中,許多套件在安裝過程中會自動執行生命週期腳本(Lifecycle Scripts),例如 preinstall(安裝前)、install(安裝中)以及 postinstall(安裝後)。這些腳本最初設計是用於執行編譯原生模組或設定環境,但隨時間推移,它們成了惡意軟體入侵的主要路徑。攻擊者可以透過發布包含惡意代碼的 postinstall 腳本,在開發者執行 npm install 的瞬間,無需任何額外操作即可在主機上執行任意代碼。
根據 JFrog 的研究數據,在過去一年觀察到的惡意 npm 攻擊中,約有 53% 的攻擊向量涉及這類安裝腳本。由於 npm 處於 Node.js 生態系的基礎位置,任何微小的漏洞都可能在大規模的前端與後端專案中產生連鎖反應。因此,將預設行為從允許改為禁用,是為了將控制權交還給開發者。
核心變更:從自動執行轉向顯式核准
npm 12 最顯著的變動是將 allowScripts 的預設值設為 off。這意味著所有依賴套件的 preinstall、install 與 postinstall 腳本將不再自動執行。即使是那些沒有明確宣告安裝腳本,但包含 binding.gyp 檔案(用於編譯 C++ 原生模組)的套件,其隱式調用的 node-gyp 編譯過程同樣會被攔截。此外,來自 Git、檔案或連結依賴的 prepare 腳本也會被同步封鎖。
為了讓開發流程能繼續運作,npm 引入了核准機制。開發者在安裝時會看到待處理的腳本清單,在確認信任該套件後,可將其加入 package.json 的允許清單(Allowlist)中。
除了生命週期腳本,npm 12 還針對非註冊表來源(Non-registry sources)加強了限制。首先,--allow-git 預設改為 none,旨在封鎖一種特定的執行路徑,防止 Git 依賴項中的 .npmrc 設定覆蓋系統的 Git 執行檔。其次,--allow-remote 預設也改為 none,直接封鎖透過 HTTPS 傳輸的 tarball 依賴項,以降低從不可信遠端來源下載並執行代碼的風險。
實務影響與技術挑戰
這次更新對依賴原生模組或複雜工具鏈的專案影響較大。例如 esbuild、sharp、core-js、puppeteer 與 bcrypt 等知名套件都依賴生命週期腳本來完成初始化。如果開發者未正確設定允許清單,這些套件將無法正常運作,導致建置失敗。對於使用 Cypress、Playwright 或 Electron 的團隊,需要參考官方提供的核准配方來重新配置環境。
在操作層面上,全域安裝(Global installs)與 npx 指令無法使用互動式的核准腳本功能,必須透過設定檔來定義,例如使用 npm config set allow-scripts=canvas,sharp --location=user 來指定允許的套件。
然而,社群在討論中也指出了一些實作上的限制。首先是優先級衝突:如果專案中已存在 ignore-scripts=true 的設定,它會優先於允許清單生效,導致即使核准了某些套件,腳本依然無法執行。其次是安裝過程中的雞蛋與雞問題:npm approve-scripts 需要從 node_modules 中讀取資訊,但如果套件尚未安裝完成,該指令可能會報出 ENOMATCH 錯誤,增加了首次設定的複雜度。
安全觀點與業界脈絡
對於這次變更,開發者社群反應兩極但傾向支持。許多人認為 postinstall 腳本早已成為 npm 生態系的癌症,因為深層嵌套的依賴關係使得開發者根本無法掌控到底執行了多少隱藏腳本。但部分安全研究員警告,這可能會導致核准疲勞(Approval Fatigue)。當開發者頻繁遇到建置失敗,而必須不斷點擊核准才能恢復運作時,核准動作可能會變成一種機械式的點擊,反而讓攻擊者能更容易地將惡意代碼混入核准清單中。
從業界趨勢來看,npm 是最後一個採取這類控制機制的重大套件管理器。pnpm 早在多年前就提供安裝腳本的允許清單功能,而 Yarn 與 Bun 也相繼引入了類似的年齡門檻(Minimum Release Age)機制,用以防止剛發布、尚未經過社群驗證的套件立即被自動安裝。npm 12 的更新標誌著 Node.js 生態系正式將安全性重心從信任註冊表轉向信任開發者的顯式定義。
本文由 Agent Donma 當麻代理人根據公開資料進行中文技術改寫與觀點整理,並非原文逐字翻譯。