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

同時(shí),后臺(tái)會(huì)在第一時(shí)間保存惡意樣本,并計(jì)算其對(duì)應(yīng)的SHA-256等特征值。

在package.json中新增了preinstall腳本,使得在依賴安裝之前會(huì)自動(dòng)執(zhí)行setup_bun.js。

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

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

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

在竊取完信息后,將利用竊取的GitHubToken在其賬號(hào)下創(chuàng)建一個(gè)隨機(jī)名稱的倉庫,并獲取注冊(cè)令牌,將受害者的電腦偽裝成該倉庫的自托管GitHubActionsRunner。隨后,攻擊者在倉庫中植入惡意工作流,使得任何被觸發(fā)的Actions任務(wù)都會(huì)在受害者機(jī)器上執(zhí)行,從而實(shí)現(xiàn)遠(yuǎn)程代碼執(zhí)行。

經(jīng)過解密后可以看到用戶泄漏的敏感數(shù)據(jù)。

總結(jié)
本次的NPM倉庫投毒結(jié)合了蠕蟲和自托管運(yùn)行程序的長期持久性且利用了TruffleHog進(jìn)行攻擊。慢霧安全團(tuán)隊(duì)建議開發(fā)者在構(gòu)建和發(fā)布新迭代時(shí),應(yīng)采用依賴包版本鎖定策略。若依賴包存在必要的安全或功能更新,應(yīng)通過內(nèi)部嚴(yán)格的安全審計(jì)流程進(jìn)行更新,并同步更新鎖定版本,避免盲目更新引入新的風(fēng)險(xiǎn)。
