NPM 投毒分析 — Shai-Hulud 攻擊重現
作者:Joker&Ccj背景
近日,NPM社區再次爆發大規模 NPM包投毒事件,本次事件與2025年9月的Shai-Hulud攻擊事件高度相關,本次的NPM包中的惡意代碼竊取開發者密鑰和API密鑰以及環境變量等敏感信息,利用密鑰創建公開倉庫并上傳這些竊取的敏感信息。
慢霧(SlowMist)自主研發的Web3威脅情報與動態安全監控工具MistEye第一時間響應,迅速推送相關威脅情報,為客戶提供關鍵的安全保障。

同時,后臺會在第一時間保存惡意樣本,并計算其對應的SHA-256等特征值。

在package.json中新增了preinstall腳本,使得在依賴安裝之前會自動執行setup_bun.js。

經過將惡意腳本的部分代碼反混淆后,可知aL0()是整個惡意腳本的主入口函數,大概的可以看出此惡意腳本進行了敏感信息的竊取,會先對運行環境進行檢查是否存在NPM或GitHub等憑據,若檢測到這些憑據,它會利用NPM憑據進行供應鏈傳播,并且所有收集到的系統信息和敏感數據最終會被打包并上傳到攻擊者控制的GitHub倉庫,用于后續利用。
憑據竊取
AWS:該惡意腳本實現runSecrets()和listAndRetrieveAllSecrets()方法,runSecrets()方法會遍歷所有能找到的云訪問憑據以及所有可能的區域,最大化掃描范圍;而listAndRetrieveAllSecrets()則在指定憑據與區域內進行“深度挖掘”,遍歷出所有Secret,并獲取其最新明文內容。兩者配合后,攻擊者能夠將受害者AWS賬號中可訪問的所有SecretString和SecretBinary一次性全部導出。

GCP:該惡意腳本中實現的另一個listAndRetrieveAllSecrets()方法主要是針對GCP模塊,它會先根據指定的ProjectID列出該GCP項目下所有的Secret,然后直接定位每個Secret的最新版本,并調用accessSecretVersion讀取其明文內容。最終將所有獲取到的機密(如APIKey、數據庫密碼等)逐一收集起來。

在竊取敏感信息的實現中,還使用合法的安全工具來攻擊受害者。在extractAndInstall()方法中,解壓并提取出TruffleHog的二進制文件,TruffleHog本是用于在代碼庫中檢測和驗證泄漏的機密信息,如API密鑰和憑證,則被攻擊者使用來對受害者的整個文件系統進行掃描。

在竊取完信息后,將利用竊取的GitHubToken在其賬號下創建一個隨機名稱的倉庫,并獲取注冊令牌,將受害者的電腦偽裝成該倉庫的自托管GitHubActionsRunner。隨后,攻擊者在倉庫中植入惡意工作流,使得任何被觸發的Actions任務都會在受害者機器上執行,從而實現遠程代碼執行。

經過解密后可以看到用戶泄漏的敏感數據。

總結
本次的NPM倉庫投毒結合了蠕蟲和自托管運行程序的長期持久性且利用了TruffleHog進行攻擊。慢霧安全團隊建議開發者在構建和發布新迭代時,應采用依賴包版本鎖定策略。若依賴包存在必要的安全或功能更新,應通過內部嚴格的安全審計流程進行更新,并同步更新鎖定版本,避免盲目更新引入新的風險。
