npm 12 預設停跑依賴套件安裝 scripts:CI 同 node-gyp 升級前點查
Tech News

npm 12 預設停跑依賴套件安裝 scripts:CI 同 node-gyp 升級前點查

圖片:via iThome — https://www.ithome.com.tw/news/177304
TechLab 編輯部(譯)·

先清點安裝 scripts,再用乾淨 CI 重跑原生依賴

npm install 一直方便到令人容易忘記,拉套件嗰刻其實可以順手執行第三方程式。iThome 報道將焦點放喺三項預設改動:npm 12 會截停未獲批准嘅依賴套件安裝 scripts,Git 同 remote URL 依賴亦唔再預設解析。功能仲喺度,只係改成要明確開綠燈,所以唔應該理解成 npm 完全刪走安裝 scripts。

安裝成功,都可能未代表冇事

受管制嘅包括依賴套件入面嘅 preinstallinstallpostinstall,連 npm 自動補做嘅 node-gyp rebuild 都計。官方文件話,未審批嘅 script 預設會跳過,安裝完成時再列出清單。換句話講,CI 未必即刻紅燈;套件可以裝入 node_modules,到 build、測試或者程式載入 native binding 嗰刻先出錯。所以除咗睇 npm ci 有冇成功,亦要繼續跑 build、測試同啟動檢查,先知安裝 scripts 有冇被跳過。

點解 npm 而家先收緊

安裝 script 拎到嘅權限,同執行 npm 嗰個帳戶差唔多,可以讀環境變數、改檔案同連出網。GitHub 2025 年交代 Shai-Hulud 事故時,提到攻擊者入侵套件維護者帳戶,再用惡意 postinstall 偷取秘密同自行散播;GitHub 當時移除咗超過 500 個受影響套件。官方冇話 npm 12 呢項改動只係為嗰宗事故而做,不過整體方向好清楚:npm 12 改為由專案團隊先審批,獲准嘅依賴先可以喺安裝期間執行 scripts。

專案 scripts 同依賴 scripts 要分清

你主動執行嘅 npm run buildnpm testnpm start 仲會照常叫起指定 script;今次重點係安裝依賴期間自動跑嘅 lifecycle scripts。Git、file 同 link 來源嘅 prepare 亦受管制。另外,--allow-git--allow-remote 係另一層限制,會截住直接或間接拉入嘅 Git repo 同網上 tarball。Git 依賴甚至可以用 .npmrc 改寫 Git executable 路徑,避過 --ignore-scripts,所以 npm 12 先要連來源一齊收緊。

原生模組、舊專案同 monorepo 最易漏

風險最高係靠安裝 script 下載預編譯 binary,或者失敗後用 node-gyp 即場編譯嘅模組。就算套件冇明寫 install,只要有 binding.gyp,npm 過往可能自動跑 node-gyp rebuild,npm 12 同樣會攔。內部套件仍然指向 Git commit 或 remote tarball、沿用多年冇清過依賴嘅舊專案,都要特別檢查。跨平台 CI 亦要逐個 OS 同 CPU 跑,因為唔符合而家平台嘅 optional dependency 唔會出現喺待審清單。官方亦寫明審批命令唔識 workspaces,monorepo 要按每個實際 install 入口核對,唔好假設掃一次就涵蓋晒成個 repo。

approve 同 deny 要分兩步做

最穩陣係先喺獨立分支用 npm 11.16.0 或以上版本跑平時嘅安裝,睇清楚警告,再執行 npm approve-scripts --allow-scripts-pending。呢個模式只會列出未處理項目,唔會修改 package.json。查清套件點解入咗 dependency tree、實際版本同 script 做咩之後,用 npm approve-scripts <套件名> 批准;npm 預設會將批准鎖到已檢查版本。唔應該執行嘅就用 npm deny-scripts <套件名> 明確拒絕,個 false 記錄日後亦唔會俾 --all 蓋過。最後將產生嘅 allowScripts 連同其他改動 commit 入 repo,唔好為求快手直接批准全數候選。

CI 要由乾淨環境驗一次

將批准清單 commit 入 repo 之後,固定 CI 使用嘅 npm 版本,再用 npm 12 由乾淨 checkout 跑 npm ci、build、測試同啟動檢查,唔好沿用舊 node_modules。有 native 依賴就要確認 binary 真係成功載入,Linux、macOS 或唔同 CPU runner 亦要各自覆蓋。團隊可以喺 .npmrcstrict-allow-scripts=true,等新出現而未審批嘅 script 即場令 CI 失敗;明確 deny 嘅項目仍然只會跳過。升級後每次更新依賴都一併 review allowScripts,間中用 npm install-scripts prune --dry-run 清點過期記錄,先可以長期守住呢個安全預設。


參考來源

本文根據原文及公開資料整理;資料有出入時,以原文及官方資料為準。

分享:WhatsAppThreadsTelegramFacebook