技術

惡意程式碼如何藉供應鏈潛入你信任的軟體

Susan Hill

供應鏈攻擊並不會強行闖入你使用的軟體。它毒化構成這款軟體的某個零件,然後等待正常的更新流程把它送到你的裝置上。應用照常順利安裝,簽章依舊通過,更新也依舊從官方管道抵達。惡意程式碼就搭著它一起進來。正是這種反轉讓這種手法如此有效:它把讓軟體得以運轉的信任,變成了被利用的那個點。

你今天執行的幾乎沒有一樣東西,是由螢幕上署名的那家公司從頭寫到尾的。一個應用就可能拉進成百上千個開源套件,每一個都由陌生人維護,每一個背後又拖著更多套件。開發者很少去讀那些程式碼;他們信任程式碼來自的登錄庫,以及隨附的版本號。只要潛入這條鏈條的任意一環,就能一舉觸及下游的所有人,因此一個被毒化的零件,可能在有人察覺之前就影響成千上萬個專案。

入口歸結為幾種套路。仿冒搶註擺出一個名字與熱門套件僅差一個按鍵的惡意套件,等著有人打錯字。相依性混淆利用建置工具解析名稱的方式,誘騙它們抓取一個公開套件,而不是公司的私有套件。帳號劫持奪取真正維護者的憑證,把惡意軟體當作例行更新散布;2026 年初,廣受使用的 axios 套件在其主要維護者的電腦遭社交工程攻破之後,曾短暫發布過一個被植入後門的版本。而建置流水線投毒瞄準的,是組裝並發布軟體的自動系統,那裡一個被破壞的步驟,就會波及每一個依賴它的專案。

建置流水線之所以成為最受覬覦的目標,正因為它位於其他一切的上游。當熱門的 GitHub Actions 元件 tj-actions/changed-files 於 2025 年被攻陷時,攻擊者改寫它的版本標籤,使其指向惡意程式碼,並從兩萬多個儲存庫的建置日誌中抽走機密:存取金鑰、權杖與私鑰,全都以明文出現。後來一場被研究者命名為 Megalodon 的行動,把 GitHub Actions 變成一個自我傳播的後門,約六小時內觸及 5561 個儲存庫。建置你軟體的機器,可以像軟體本身一樣輕易被顛覆。

開發者每天使用的工具同樣在波及範圍之內。2025 年底首次被發現的 GlassWorm,透過 OpenVSX 與微軟市集裡的 Visual Studio Code 擴充功能傳播。它用不可見的 Unicode 字元藏起酬載,於是惡意程式碼行在編輯器裡幾乎無法閱讀,騙過了人工審查。一旦安裝,它就竊取 npm、GitHub 與 Git 的憑證,再用這些憑證自動感染更多套件與擴充功能——這正是蠕蟲的定義性特徵。由於編輯器在背景悄悄更新擴充功能,受害者無需點擊任何東西就收到了被毒化的版本。另一個被投毒的 VS Code 擴充功能,則被用來竊取 GitHub 自家約 3800 個內部儲存庫。

讓這些攻擊如此難以捕捉的,是每個單獨步驟看上去都合法。套件有簽章。更新來自真正的登錄庫。維護者帳號是真的。傳統防禦尋找已知的惡意檔案與明顯的惡意軟體,但供應鏈攻擊藏身於可信、可預期、且往往不可見的程式碼之中,並且恰好在軟體本該抵達的時刻、以本該有的方式抵達。更糟的是:那條一貫的安全建議——立刻更新——恰恰是攻擊者所倚賴的機制。第一次,安裝最新版本不再是毫無保留的安全選擇。

防禦者已經在少數幾項確實有效的做法上達成共識。鎖定檔把每個相依套件固定到一個精確、經過核驗的版本,於是安裝程式只取已審閱的內容,而不是一味取最新的。關閉自動安裝指令稿,切斷了惡意套件一落地就執行程式碼的最常見途徑。把 GitHub Actions 固定到某個特定的提交雜湊,而不是可移動的標籤,能讓改寫標籤的伎倆失效。一份軟體物料清單,也就是建置之中每個元件的詳盡列表,能讓團隊在下一起事件被揭露時,幾分鐘內就知道自己是否受影響。許多躲過近期攻擊的機構並沒有做什麼稀奇之事:他們從已提交的鎖定檔建置,並在一個會隔離新發布套件的登錄庫代理之後工作。

對不寫程式的人來說,保護大多是間接的,但教訓並非如此。軟體供應鏈如今是第一線的戰場,而保護它,是那些製造你手機與筆電上應用的公司的責任。理智的回應既不是恐慌,也不是一有通知就把一切都更新的舊習慣。而是優先選擇那些公開自己交付什麼、又如何建置的團隊的軟體,並把可信來源當成在每一環上都要掙得的東西,而不是一種會自己順著鏈條往下流的屬性。

業界的答案正圍繞來源逐漸成形:用密碼學證明一段程式碼從何而來、如何建置,並在安裝任何東西之前自動核驗。這與一個世代之前保護網路流量的,是同一個思路,如今被用到了軟體自身的組裝線上。在那種證明變得普遍之前,每一次安裝,都仍是對你永遠不會見到的人的一次信任。

討論

共有 0 則留言。