供應鏈
什麼是相依性混淆?
相依性混淆(dependency confusion)是一種攻擊:建置安裝了攻擊者的公開套件,而不是您同名的私有套件。過程中沒有任何人打錯字。攻擊者只需得知某個內部套件名稱,再以很高的版本號將它發布到公開登錄庫,設定不當的建置就會完成剩下的事。
更新日期
相依性混淆攻擊如何運作
- 找出內部名稱。私有套件名稱會經由公開程式碼、JavaScript 套件包、錯誤訊息,以及遺留在儲存庫中的資訊清單檔外洩。
- 以相同名稱公開發布。攻擊者在 npm、PyPI 或其他公開登錄庫註冊該名稱,並使用非常高的版本號。
- 等待建置。設定為同時檢查內部與公開登錄庫的套件管理工具會找到兩個候選套件,並優先選擇版本較高的那一個。
- 在企業內部執行。套件的安裝腳本會在開發人員的電腦或 CI 執行器上執行,並能存取其中的一切。
為這種攻擊命名的研究
2021 年 2 月,資安研究員 Alex Birsan 公開了這項手法。他曾透過漏洞獎勵計畫或在取得許可的情況下,利用此手法在超過 35 個組織內部執行程式碼,其中包括 Apple、Microsoft 與 PayPal。這項手法在他測試的三種語言中都能奏效,而且公開後短短幾天內,攻擊者就開始仿效。
為什麼會發生
根本原因在於套件管理工具將多個登錄庫視為同等。典型的例子是 Python:pip 的
--extra-index-url 會在 PyPI 之外加入第二個來源,而 pip 若找到同名的公開套件,就可能安裝它。
# Unsafe for private packages: both indexes are candidates
pip install --extra-index-url https://pypi.internal.example/simple my-internal-lib
# Safer: one index you control, which proxies public packages
pip install --index-url https://pypi.internal.example/simple my-internal-lib
npm 的未加範圍(unscoped)內部名稱也有同樣的問題,而綁定到您登錄庫的範圍(scope)則可避免。
# .npmrc: everything under @acme comes only from your registry
@acme:registry=https://npm.internal.example/
如何防範相依性混淆
- 使用單一可信來源。讓建置指向一個代理公開套件的內部登錄庫,並設定成內部名稱絕不會從公開來源解析。
-
使用範圍或命名空間。在公開登錄庫上擁有一個範圍,例如
@acme,並將它對應到您的私有登錄庫。 - 預先保留名稱。在公開登錄庫上註冊您的內部套件名稱,讓其他人無法搶先註冊。
-
鎖定並驗證。提交 lockfile 並使用雜湊檢查,例如 pip 的
--require-hashes,讓不同的套件導致安裝失敗。請參閱 lockfile 能做什麼、不能做什麼。 - 限制建置可連線的對象。如果建置只能連到您的登錄庫,就完全無法取得攻擊者的套件。請參閱 GitHub Actions 對外連線政策。
- 檢查外洩情況。在公開程式碼與用戶端套件包中搜尋您的內部套件名稱。
相依性混淆與錯字搶註套件的差異
錯字搶註套件仰賴使用者打錯公開套件的名稱。 相依性混淆則使用私有套件的確切名稱,並利用建置的設定方式。兩者的結果相同:攻擊者的程式碼在您的建置中執行。請參閱 什麼是供應鏈攻擊,了解它們與其他攻擊的關係。
如何判斷是否受到影響
留意是否有內部套件名稱是從公開登錄庫解析而來,或是否出現內部登錄庫中不存在的版本。僅憑 lockfile 很難判斷,因為問題在於建置期間套件實際從哪裡取得。
CRACI 如何協助
CRACI 在套件被取得的那一刻發揮作用。作為您的 GitHub Actions 執行器,它會執行具備登錄庫類型化來源的對外連線政策,讓建置只能使用您允許的登錄庫。它也會把每個作業取得的每個套件記錄到 SBOM 中,讓您看到有哪些東西進入了建置。CRACI 不會偵測套件是否為惡意,因此請將登錄庫設定作為第一道防線。請參閱 軟體供應鏈安全最佳實務。
相依性混淆:常見問題
什麼是相依性混淆攻擊?
一種與私有套件同名的公開套件遭誤裝的攻擊,原因是套件管理工具會同時檢查兩個登錄庫,並優先選擇版本較高者。
相依性混淆與錯字搶註套件有何不同?
錯字搶註套件仰賴有人打錯公開套件名稱。相依性混淆則使用私有套件的確切名稱,並利用會檢查公開登錄庫的建置設定。
如何防範相依性混淆?
使用單一內部登錄庫、加上範圍的套件名稱、搭配雜湊檢查的 lockfile,以及限制建置可連線登錄庫的規則。在公開登錄庫預先保留內部名稱也有幫助。
--extra-index-url 安全嗎?
對私有套件而言並不安全。它會讓兩個索引都成為候選,因此可能安裝到同名的公開套件。請改用 --index-url 並搭配一個您能控管的索引。
相依性混淆是誰發現的?
資安研究員 Alex Birsan 於 2021 年 2 月公開這項手法,在此之前,他已透過漏洞獎勵計畫或在取得許可的情況下,對超過 35 個組織使用過此手法。