2026 年每日通報的 CVE 數量比前一年多 131%。
← 返回術語表

隱藏相依套件

隱藏相依套件是指建置會下載並使用,卻沒有列在任何鎖定檔或清單檔中的程式碼、套件或檔案,因此大多數 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。