隱藏相依套件
隱藏相依套件是指建置會下載並使用,卻沒有列在任何鎖定檔或清單檔中的程式碼、套件或檔案,因此大多數 SBOM 都會遺漏它。
最後更新:2026年11月11日
隱藏相依套件(hidden dependency)是指建置會下載並使用,卻沒有列在任何鎖定檔或清單檔中的程式碼、套件或檔案。由於大多數 SBOM 工具都以這些清單為依據,隱藏相依套件不會出現在大多數 SBOM 中,而近期好幾起供應鏈攻擊正是經由這裡發動。在一般軟體工程中,這個詞也指模組之間未宣告的耦合;這裡指的是供應鏈方面的意義。
常見的隱藏相依套件
- 安裝 hook。 npm 會執行套件的
preinstall、install與postinstall腳本,時間點在npm install期間(npm 文件)。這些腳本下載的任何內容都不會出現在package-lock.json中。Shai-Hulud 蠕蟲走的就是這條路徑。 - 建置腳本。 Cargo 會在建置 crate 之前編譯並執行該 crate 的
build.rs(Cargo book)。有些建置腳本會在這個時間點下載 C 函式庫或預先編譯的二進位檔,而Cargo.lock不會記錄這些內容。 - 基礎映像檔。 在容器建置中,基礎映像檔及其作業系統層來自容器登錄庫,而不是來自任何程式語言的鎖定檔。請參閱 Docker 映像檔 SBOM。
- CI 步驟。 工作流程中的設定用 action 與
curl | sh安裝程式會直接從 URL 下載工具,除非作者自行加上,否則沒有鎖定檔、版本鎖定或雜湊值。
提交到儲存庫中的程式碼(vendored 相依套件)是元件脫離清單檔的另一種方式,但它不是在建置期間下載的。「幽靈相依套件」(phantom dependency)則又是另一回事:在 JavaScript 中,指的是您的程式碼使用卻未宣告、只能透過 hoisting 取得的套件。
SBOM 工具為何會遺漏它們
以鎖定檔為基礎的工具讀取的是鎖定檔中宣告的清單,因此只看得到已宣告的內容。輸出掃描器則檢視完成的建置產物,推算其中包含了什麼,對於 Rust 這類編譯後的程式碼而言,這只是猜測。兩者都看不到建置在過程中下載的內容。每種方法遺漏內容的完整清單(包括快取與建置工具),請參閱開源 SBOM 產生工具。隱藏相依套件是 SBOM 完整性中的缺口,而 SBOM 本身無法揭露這個缺口。
鎖定版本也無法解決這個問題:鎖定檔可以完美無缺,但它所鎖定的安裝 hook 仍可能下載新的內容。在建置時下載內容的建置,也是可重現建置難以達成的原因之一。
如何找出它們
- 閱讀建置日誌中的下載紀錄:
npm install與cargo build的輸出,以及來自curl或wget的行。 - 比較從鎖定檔產生的 SBOM 與安裝步驟回報的套件。
- 在 SBOM 中搜尋您確定位於基礎映像檔中的套件,例如
libc6。如果找不到,表示映像檔層遺漏了。 - 在您的工作流程中以 grep 搜尋
curl與wget。
可靠的做法是記錄建置實際透過網路取得的內容,而不是事後重建。
CRACI
CRACI 能看到進入每次建置的流量,因此會記錄以鎖定檔為基礎的工具所遺漏的隱藏相依套件。當它無法看見全部內容時,例如作業允許了繞過其套件感知代理的流量,該作業的完整性狀態就會明確標示。它的對外連線政策也決定了建置究竟能連線到哪些主機,因此對政策不允許的主機執行 curl | sh 將會失敗。請參閱建置時 SBOM。