此篇文章探討近期針對NPM生態系統發動的供應鏈攻擊,並將焦點放在開發團隊經常使用的GitHub Actions持續整合與持續部署平台。NPM套件廣泛應用於Node.js開發,許多開發者會直接從NPM下載並匯入套件,因此一旦攻擊者取得套件發布權限,就可能將惡意程式散布至大量開發環境。文章指出,攻擊者不一定要直接入侵NPM平台,也可能先尋找開發團隊在CI/CD流程中的設定錯誤,再透過自動化工作流程取得高權限憑證,將原本看似單一的程式碼管理問題,擴大為影響整個軟體供應鏈的資安事件。
資安公司Aikido Security、Cloudsmith與Wiz指出,攻擊者於7月14日針對AsyncAPI產生器的GitHub儲存庫發出37次拉取請求。多數請求試圖新增虛假的慈善捐款網頁,用來掩飾真正的攻擊意圖,但其中一次請求利用了GitHub Actions工作流程的組態缺陷。攻擊者藉此竊取高權限的個人存取權杖,進一步取得NPM發布權杖,最後入侵4款AsyncAPI相關NPM套件,並在執行環境模組中植入經過混淆處理的下載器,前後發布5個惡意版本。當開發人員在電腦中匯入或使用受影響的套件時,惡意程式會透過P2P分散式檔案傳輸協定IPFS下載Node.js載入工具,將檔案寫入磁碟後,以獨立處理程序在背景啟動。
此篇文章特別提醒,這起事件並非源自完全未知的安全漏洞,而是開發團隊早已收到警告、卻遲遲未完成修補的GitHub Actions配置不當問題。該問題最早在4月29日由一名貢獻者提出,並於5月17日進一步建議修正方式,包括將工作流程拆分為兩個獨立工作,隔離不受信任的程式碼與機密資料存取。然而,開發團隊未採納這項方案,使問題在58天後遭到攻擊者利用。這段時間差凸顯開源專案維護者不僅要處理程式功能,也必須持續追蹤安全通報、檢視自動化流程與落實修補。
最早揭露此事的Wiz將其歸類為GitHub Actions的「Pwn Request」問題。AsyncAPI產生器的工作流程使用pull_request_target觸發拉取請求,但檢查的程式碼來源不是基礎儲存庫,而是由提出請求的攻擊者控制。由於pull_request_target會在基礎儲存庫的環境中執行,通常能存取其中的機密資料;一旦工作流程直接執行攻擊者提交的程式碼,個人存取權杖、NPM發布權杖等敏感資訊便可能外洩。此篇文章藉此提醒開發團隊,使用GitHub Actions時應嚴格區分不受信任程式碼與機密資料,避免讓外部拉取請求直接觸發具高權限的工作流程,並定期檢查權杖權限、發布流程與套件版本,降低供應鏈攻擊風險。