近日,国资国企在线监管安全运营中心(以下简称“安全运营中心”)监测发现APT组织“海莲花”针对Python官方软件仓库——PyPI(Python Package Index)平台“投毒”事件。该组织利用PyPI平台高开放性、高可信性及开发者高依赖性,通过仿冒合法软件模块投递后门程序。经安全运营中心研判,为“海莲花”组织定向针对软件开发从业人员发起的新一轮供应链攻击。
PyPI平台是Python的官方软件仓库,承担组件分发、检索下载、协作集成、版本管理等核心功能,与Python深度绑定,其上托管的软件安装包超过60万,月均访问量达数十亿量级。
2025年4月初,安全运营中心即监测发现“海莲花”APT组织尝试利用PyPI平台进行“投毒”活动,“投毒”模块名称为“libtest”,最终释放的载荷执行效果是弹出计算器,无恶意功能。根据释放载荷部分代码,安全运营中心将相关活动与“海莲花”组织相关联,研判应为正式“投毒”攻击前的测试行为。
7月,安全运营中心再次捕获到“海莲花”APT组织针对PyPI“投毒”的载荷,本次“投毒”模块名称为“uuid32-utils”,作者名称为“lazyrok”,用户创建时间为2025年5月7日,说明在模块“libtest”完成测试后不久,“海莲花”组织就着手开始了正式“投毒”模块的构建。
截至发文,攻击组织仍在持续上传、更新恶意文件,疑似正在搭建更多攻击设施,模块版本号由1.0.4升级到了1.1.0,增加了linux和windows的64位版本。经分析,样本的执行方式和最终载荷的C2地址没有发生变化,仅是释放的文件夹名称由obsHub变成了vcpackage,同时白加黑载荷中的白文件名称由obs-check-update.exe变为了vcpkgsrc.exe,其他部分基本无变化,因此本文中仍以1.0.4版本为例进行分析。
图1 恶意模块项目主页
图2 攻击者用户主页
用户在使用PyPI平台时只需要一行简单的命令(如pip install ),即可完成指定软件包及其依赖项的安装。PyPI平台不限制第三方用户上传和发布,即任何一个用户都可以向该平台上传自己编写的软件安装包。
“海莲花”组织利用了PyPI平台该特性,仿冒名称高度相似的合法软件模块“uuid”和“uuid32”,发布“投毒”软件模块“uuid32-utils”。其中“uuid”模块拥有千万量级级用户,用于生成随机的UUID,即通用唯一标识符(128位的数字,通常以32个十六进制数字的形式表示,并用连字符分隔,例如550e8400-e29b-41d4-a716-446655440000),相关功能在数据库、云服务、云存储等广大场景下被频繁使用。
利用PyPI的开放性和开发者对其的信任,攻击者能够设计多种攻击手段完成恶意载荷投递,结合“海莲花”组织的历史活动(例如利用GitHub的投毒活动),列举可能的攻击方式:
(一)手动安装与拼写劫持
这是最直接也最常见的攻击方式,利用用户可能出现的选择错误、拼写错误来诱导下载。此次事件中,一旦用户在命令行中手动输入合法模块“uuid”、“uuid32”时,错误输入了“投毒”模块“uuid32-utils”,并执行安装,恶意代码便会在安装过程中被执行。
(二)创建开源项目进行调用(依赖注入)
攻击者通过在GitHub等平台创建开源项目,在项目依赖文件(如requirements.txt)中,明确指向访问“投毒”模块“uuid32-utils”下载软件安装包,从而实现自动解析恶意文件,在用户几乎无感知的情况下成功植入后门程序。
(三)依赖混淆
这是一种更为高级和隐蔽的攻击方式。许多企业内部会使用私有的PyPI仓库来管理自研的软件包。攻击者可以扫描企业在公开代码中意外泄露的内部包名,然后在公共的PyPI上注册一个同名的恶意包,并设置一个比内部版本更高的虚假“新版本”。当开发者的包管理工具同时配置了公共和私有仓库时,根据pip等工具的默认行为,它会优先选择版本号更高的包进行下载,因此会从公共PyPI拉取并安装恶意包,导致内部开发环境被污染。
“投毒”模块的执行逻辑和攻击路径还原如下:
图3 攻击路径还原
| uuid32_utils-1.0.4-py3-none-win32.whl |
|
8524E3D0ADA54957B5A12 F87424A8358899F44B8 |
| |
本次“投毒”攻击所使用的wheel文件中的python代码结构与之前的测试模块“libtest”大体相同,但是代码看起来更加“正式”和规范,py文件中的函数数量更多,且包含注释。
负责执行恶意逻辑的python文件为__compressed__.py,该文件中名为“x32bitAPI”的函数负责加载名为“Backward.dll”的动态链接库,并执行其中的恶意逻辑,该dll的主要逻辑在名为“IsNotOlderOS”的导出函数中,这一点和之前的测试仓库“libtest”基本一致。
图4 模块初始化
| |
| 06ADABCB962B5CF5D9FB6 3542518A5B80B5A9AD4 |
|
|
| |
恶意样本的核心功能是解密释放白加黑载荷到路径“%LOCALAPPDATA%\obsHub”目录下,解密算法为AES-128,解密密钥为字符串“x32bitOSplatform”,由python文件调用时通过参数进行传递。
所释放的带有签名的白文件名为“obs-check-update.exe”,恶意dll载荷文件名为“libcef.dll”。
图7 恶意dll释放后门dll(2)
图8 恶意dll释放后门dll(3)
释放完成后,样本通过修改注册表以设置该路径为开机启动项,注册表项名称为“obs-update”,以此完成对用户的持久化控制。
图9 恶意dll为后门程序创建持久化(1)
图10 恶意dll为后门程序创建持久化(2)
| |
| 2A6D0E457B852419685893BA 179D7D9CF29CFAF1 |
| |
| |
样本的功能是作为本次“投毒”的核心远控载荷,其逻辑较为简单。样本执行后首先收集受害者计算机的基本信息,包括:计算机名、用户名、操作系统版本。
图11 后门程序获取计算机名
图12 后门程序获取用户名
图13 后门程序获取系统信息
随后样本将收集到的信息字符串以如下格式进行拼接(其中CPU架构为编译后门时预定义的字符串),以待后续发送给C2服务器。攻击组织利用境外聊天工具Zulipchat作为与其控制的服务器之间的通信桥梁,完成命令执行和数据回传等远程控制操作,将通信流量隐藏在Zulipchat聊天工具合法流量中,规避检测。
随后样本连接Zulipchat聊天软件的服务器地址,攻击者创建的聊天组织名称为“helper”,使用的电子邮箱为“safnic_take-bot@helper.zulipchat.com”。
图14 后门程序连接聊天频道
攻击者利用Zulipchat的API将前文收集到的用户信息发送到了聊天频道中,然后持续接收消息,等待攻击者发送“shellcode”后创建线程执行。
图15 后门接收频道内的Shellcode执行
“海莲花”APT组织策划利用PyPI“投毒”并通过第三方聊天软件Zulipchat来实施C2通信的攻击活动,其恶意载荷的执行方式依旧为该组织惯用的“白加黑”加载手法,相关活动最早从4月份进入测试阶段,并在7月中旬正式投入了使用,从当前投毒仓库的更新情况来看,后续“海莲花”组织可能还会利用这一手段进行进一步的钓鱼和供应链攻击。
安全运营中心将持续关注相关情况,呼吁广大开发者引起重视并加以防范,安装软件包前仔细核实软件包名称的拼写,确认其发布来源是否合法,警惕不法分子利用公共平台实施的供应链攻击。安全运营中心将切实履行职责使命,不断强化供应链安全专项保障能力,持续开展供应链全链路监测,坚决为中央企业供应链安全保驾护航。

沈传宁:落实《网络数据安全管理条例》,提升全员数据安全意识






