![]()
npm倉(cāng)庫(kù)上周被塞進(jìn)36個(gè)"李鬼"插件,全部瞄準(zhǔn)同一個(gè)開(kāi)源CMS。攻擊者沒(méi)搞廣撒網(wǎng),而是盯著一家加密貨幣支付平臺(tái) Guardarian 反復(fù)測(cè)試——從Redis遠(yuǎn)程執(zhí)行到直取數(shù)據(jù)庫(kù)熱錢(qián)包,整套攻擊鏈在13小時(shí)內(nèi)迭代了8個(gè)版本。
這不是普通的供應(yīng)鏈投毒。SafeDep團(tuán)隊(duì)在4月3日捕獲樣本時(shí)發(fā)現(xiàn),攻擊者像是在用生產(chǎn)環(huán)境當(dāng)沙盒:每過(guò)一小時(shí)就推一個(gè)新變種,看哪種能摸到核心資產(chǎn)。
三文件結(jié)構(gòu)+固定版本號(hào):偽裝成"官方社區(qū)插件"
惡意包全部掛在四個(gè)賬號(hào)下:umarbek1233、kekylf12、tikeqemif26、umar_bektembiev1。安全團(tuán)隊(duì)判斷是同一人操作。
每個(gè)包的結(jié)構(gòu)完全一致,版本號(hào)鎖死3.6.8——這個(gè)細(xì)節(jié)很狡猾。Strapi社區(qū)插件確實(shí)有大量3.x版本遺留,開(kāi)發(fā)者看到熟悉的版本號(hào)容易放下戒心。
包名更是精心設(shè)計(jì):strapi-plugin-cron(定時(shí)任務(wù))、strapi-plugin-events(事件系統(tǒng))、strapi-plugin-seed(數(shù)據(jù)種子)……全是Strapi生態(tài)里真實(shí)存在的功能類(lèi)別。有開(kāi)發(fā)者評(píng)論,"我掃一眼名字根本不會(huì)懷疑,太像官方命名規(guī)范了"。
攻擊觸發(fā)點(diǎn)藏在postinstall腳本里。npm install執(zhí)行完畢、控制臺(tái)還沒(méi)清空時(shí),惡意代碼已經(jīng)跑完第一輪偵察——不需要開(kāi)發(fā)者調(diào)用任何API,甚至不需要import。
第八個(gè)變種才露出獠牙:主機(jī)名白名單+針對(duì)性數(shù)據(jù)庫(kù)探測(cè)
SafeDep的動(dòng)態(tài)分析管道最先報(bào)警的是strapi-plugin-events。這個(gè)樣本在文件系統(tǒng)里翻找密鑰文件,同時(shí)向外連了24次,目標(biāo)IP 144[.]31[.]107[.]231。
但真正的狠活在后面。研究團(tuán)隊(duì)還原了13小時(shí)內(nèi)的8個(gè)變種演進(jìn):
前兩個(gè)版本還在試探:Redis遠(yuǎn)程代碼執(zhí)行、Docker容器逃逸——典型的"能拿到shell就算贏"思路。
中間三個(gè)版本轉(zhuǎn)向信息收集:環(huán)境變量、私鑰文件、Redis內(nèi)存轉(zhuǎn)儲(chǔ)、Kubernetes服務(wù)賬戶令牌,全部明文HTTP外傳,連TLS都懶得套。
第六個(gè)變種strapi-plugin-seed開(kāi)始精準(zhǔn)打擊。它用硬編碼憑據(jù)連PostgreSQL,專(zhuān)門(mén)找四個(gè)數(shù)據(jù)庫(kù)名:guardarian、guardarian_payments、exchange、custody。Guardarian是一家提供法幣-加密貨幣通道的支付服務(wù)商,這套組合拳等于直接問(wèn)"熱錢(qián)包在哪"。
最后兩個(gè)變種升級(jí)到"環(huán)境感知":第七版只在主機(jī)名精確匹配prod-strapi時(shí)激活,第八版進(jìn)一步收緊條件——既要是生產(chǎn)環(huán)境,又要滿足特定內(nèi)部網(wǎng)絡(luò)標(biāo)識(shí)。
這種"白名單觸發(fā)"機(jī)制解釋了為什么攻擊者敢在公開(kāi)倉(cāng)庫(kù)反復(fù)迭代:大部分沙盒分析環(huán)境根本觸發(fā)不了最終載荷,只有真實(shí)生產(chǎn)服務(wù)器能解鎖完整攻擊鏈。
供應(yīng)鏈攻擊正在從"撒網(wǎng)"轉(zhuǎn)向"蹲點(diǎn)"
傳統(tǒng)認(rèn)知里,npm惡意包追求曝光量——名字起得越通用,撞上的開(kāi)發(fā)者越多。這次 campaign 反其道而行:36個(gè)包全部圍繞Strapi生態(tài),命名高度垂直,甚至早期版本里就嵌著Guardarian的硬編碼引用。
SafeDep分析師指出,攻擊者顯然提前研究了目標(biāo)架構(gòu)。"他們知道Guardarian用Strapi做后臺(tái),知道數(shù)據(jù)庫(kù)命名規(guī)范,知道生產(chǎn)環(huán)境的主機(jī)名規(guī)則。這不是隨機(jī)撞庫(kù),是拿著藍(lán)圖施工。"
更值得警惕的是迭代速度。8個(gè)變種在13小時(shí)內(nèi)推送,平均不到兩小時(shí)一次更新。安全團(tuán)隊(duì)對(duì)比時(shí)間戳發(fā)現(xiàn),每次更新都對(duì)應(yīng)前一次載荷被某臺(tái)服務(wù)器執(zhí)行后的幾分鐘——攻擊者在實(shí)時(shí)監(jiān)控反饋,當(dāng)場(chǎng)修bug。
這種"開(kāi)發(fā)-部署-觀測(cè)-迭代"的閉環(huán),以往只在APT級(jí)別的定向攻擊里見(jiàn)過(guò)。現(xiàn)在被用在了開(kāi)源供應(yīng)鏈上,成本幾乎為零。
明文HTTP外傳:技術(shù)粗糙但意圖明確
所有竊取的數(shù)據(jù)都走明文HTTP,這在2026年顯得格格不入。安全研究者通常把這解讀為"攻擊者不在乎被發(fā)現(xiàn)"——畢竟流量一抓包就露餡。
但另一種可能是刻意簡(jiǎn)化。TLS證書(shū)需要注冊(cè)、需要維護(hù)鏈路上下的兼容性,而HTTP只需要一個(gè)IP。對(duì)于"測(cè)試-迭代-撤退"的短期campaign,能省則省。
被盜數(shù)據(jù)清單本身說(shuō)明了攻擊者的優(yōu)先級(jí):環(huán)境文件(.env)排第一,里面是數(shù)據(jù)庫(kù)連接串和API密鑰;私鑰文件第二,可能涉及區(qū)塊鏈錢(qián)包;Redis dump第三,內(nèi)存里常緩存著會(huì)話令牌;Kubernetes service account token第四,用于橫向移動(dòng)。
如果Guardarian的生產(chǎn)環(huán)境被攻破,攻擊者將直接拿到熱錢(qián)包憑據(jù)、完整交易流水、用戶資金托管記錄。對(duì)于一家支付平臺(tái),這等于核心業(yè)務(wù)裸奔。
目前四個(gè)惡意賬號(hào)已被npm封禁,相關(guān)包版本下架。但SafeDep提醒,這類(lèi)"精準(zhǔn)供應(yīng)鏈蹲點(diǎn)"的模式可能復(fù)制到其他開(kāi)源生態(tài)——攻擊者已經(jīng)證明,針對(duì)特定企業(yè)的開(kāi)發(fā)依賴投毒,ROI遠(yuǎn)高于廣撒網(wǎng)。
Guardarian尚未公開(kāi)回應(yīng)是否遭受實(shí)際入侵。如果你所在團(tuán)隊(duì)使用Strapi,最近兩周有沒(méi)有安裝過(guò)名字帶cron、events、seed、api的社區(qū)插件?
特別聲明:以上內(nèi)容(如有圖片或視頻亦包括在內(nèi))為自媒體平臺(tái)“網(wǎng)易號(hào)”用戶上傳并發(fā)布,本平臺(tái)僅提供信息存儲(chǔ)服務(wù)。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.