·6 分鐘供應鏈攻擊SCA開源
開源供應鏈攻擊,我們團隊也不是例外
只要一個npm/PyPI套件遭到感染,使用它的所有專案就會跟著遭殃。供應鏈攻擊實際上是如何發生的,以及3層防禦。
「我又沒寫這段程式碼,為什麼我的服務會被攻破?」——這是供應鏈攻擊的典型疑問。問題不在你自己寫的程式碼,而在你安裝的別人的程式碼。
什麼是供應鏈攻擊
我們的專案通常依賴數十到數百個開源套件(npm、PyPI、RubyGems等)。攻擊者只要感染其中一個套件,所有安裝它的專案就會自動遭到感染。這比直接攻擊你的程式碼有效率得多,因此這種手法近幾年大幅增加。
實際上是這樣發生的
- 打字搶注(typosquatting):上傳與熱門套件名稱相似的假套件(例如
lodash→iodash),等人不小心裝錯 - 維護者帳號遭劫持:攻擊者奪取一個老舊套件的管理員帳號,在原本正常的套件中偷偷加入惡意程式碼並發布新版本
- 相依套件混淆(dependency confusion):把和公司內部套件同名的套件上傳到公開登記處,誘使建置系統抓取公開(惡意)版本而非內部版本
以上三種情況,都只需要開發者像平常一樣執行`npm install`就會中招。並不是做了什麼可疑的操作。
為什麼小團隊更脆弱
大公司通常會有內部登記處鏡像、套件核准流程。相對地,獨立開發者或小型團隊通常裝完相依套件後就再也不會回頭檢查。 再加上AI程式碼生成工具,只要有需要的功能,往往不太驗證就會建議安裝新套件,讓暴露面更大。
3層防禦
- 提交lockfile並以固定版本安裝 — 沒有
package-lock.json/pnpm-lock.yaml的話,同一份程式碼每次可能會安裝到不同版本。 - 自動掃描相依套件漏洞 — 定期,理想上是每次部署,確認是否使用了含已知漏洞(CVE)的版本。
- 升版時先瀏覽一次變更內容 — 尤其是最近換過維護者、或下載量相對歷史很短的套件,更新前先看一眼diff,能防止大事故。
供應鏈攻擊不是因為「我做錯了什麼」而發生,而是信任的別人的程式碼反過來背叛你的事故。所以防禦的對象也不該只是「我的程式碼」,而應該是「我所使用的所有他人程式碼」。
WhiteHat Code會掃描儲存庫的相依套件,找出含有已知漏洞的套件,並告訴你升級路徑。自動掃描是免費的。