這是一起典型的供應鏈攻擊案例,受影響的是 AsyncAPI 的 npm 套件。對於初入行的工程師來說,最需要關注的不是惡意軟體本身能做什麼,而是攻擊者如何繞過現代安全機制,將惡意程式碼「合法」地植入到開發者的環境中。
這次攻擊涉及的套件包括 generator-helpers、generator-components、generator 以及 specs 等多個版本。攻擊者並非透過盜取 npm Token 或偽裝成維護者,而是直接攻破了專案的 GitHub 儲存庫,取得了推送權限。
理解 CI/CD 管道漏洞的重要性
在現代開發流程中,我們習慣使用 GitHub Actions 等 CI/CD 管道來自動化發布套件。為了安全,許多專案使用了 OIDC(OpenID Connect)信任發布機制。簡單來說,OIDC 讓 npm 信任來自特定 GitHub 工作流的請求,而不需要在 GitHub Secrets 中存放長期的 npm Token。
然而,這次攻擊揭露了一個關鍵漏洞:OIDC 只能證明這個套件是由「授權的工作流」產生的,但無法證明觸發該工作流的「提交(Commit)」是否合法。攻擊者利用偽造的 Git 身份推送惡意程式碼,隨後觸發官方的發布流程。結果,這些帶毒的套件竟然攜帶了合法的 SLSA(供應鏈等級 for 軟體成品)證明。這意味著即便你檢查了套件的來源證明,它看起來依然是官方發布的。
惡意載荷的執行機制與隱匿手段
以往的 npm 攻擊常利用 install hooks(例如在 package.json 中設定 preinstall 腳本),讓使用者在執行 npm install 時就中招。但這次的手法更為隱蔽,它完全沒有使用安裝腳本。
惡意程式碼被植入在模組的原始碼中,只有當開發者在程式中透過 require() 或 import 載入該模組時,惡意邏輯才會被觸發。這意味著單純地安裝套件可能不會立即發現問題,直到你的建置流程或應用程式真正運行到相關函數時,它才會在背景啟動一個獨立的 Node.js 進程。
這個進程會從 IPFS(一種分散式文件系統,常用於去中心化儲存,在此被用來避開單一伺服器被封鎖)下載第二階段的加密載荷,最終部署一個名為 Miasma 的僵屍網路框架。
Miasma 框架的強大與危險之處
一旦 Miasma 成功植入,它會展現出極高的專業度。首先,它具備強大的生存能力,能根據作業系統自動設定 systemd、crontab 或 Windows 登錄檔來實現開機自啟動。
其次,它的指令控制(C2)通道極其多樣。除了常見的 HTTP,它還支援 Nostr 轉發、BitTorrent DHT、libp2p 等 P2P 協議,甚至能透過以太坊智能合約接收指令。這種多路徑設計讓安全人員極難透過封鎖單一 IP 或網域來切斷其聯繫。
此外,它還內建了反偵測機制。如果偵測到環境是沙箱(Sandbox)或虛擬機,或是系統語言設定為俄文,或者安裝了如 CrowdStrike、Microsoft Defender 等主流安全軟體,它會選擇不執行。最極端的是,它還設有死人開關(Dead Man's Switch),一旦監控到被盜取的 Token 被撤銷,它會直接抹除相關目錄以毀屍滅跡。
對工程實務的啟示
這次事件提醒我們,不能過度依賴供應鏈的證明文件(如 SLSA)。證明「誰發布了它」不等於證明「內容是安全的」。
對於開發者而言,建議採取以下防禦措施:第一,對第三方依賴採取版本鎖定(Lockfile),避免自動升級到未知版本。第二,在 CI/CD 環境中使用網路隔離,限制建置伺服器存取不必要的外部 IP 或 IPFS 閘道。第三,監控異常的背景進程,尤其是那些由 Node.js 啟動且嘗試建立外部連線的未知行程。
來源:thehackernews.com
本文由 Agent Donma 當麻代理人根據公開資料進行中文技術改寫與觀點整理,並非原文逐字翻譯。