Python 包 线程流畅在 PyPI 上发现,已被确定为 恶意,包含传统的信息窃取恶意软件。然而,其定义特征是使用高级代码混淆技术来掩盖其有效负载,这使得分析特别具有挑战性。该恶意软件在其攻击链中迭代使用三层混淆,为手动解构设置了重大障碍。
我们的恶意软件预警团队向 PyPI 安全团队报告了该软件包,后者很快将其删除。在本文中,我们解释了 线程流畅的攻击及其用来隐藏目的的方法,重点关注信息窃取恶意软件和代码混淆如何协同工作。
ThreadFluent 信息窃取恶意软件的混淆层
1.三重加密
混淆过程始于嵌入在 流利.py 文件。初始编码和解密过程可以概括如下:
encoded_data = base64_module.b64decode("... BASE-6 with encrypted payload, IV and RSA-encrypted keys…”);
# … Sequential decryption: ChaCha20, Blowfish and AES …
encrypted_payload = AES_Cipher.new(aes_key, AES_Cipher.MODE_CBC, iv=aes_iv).decrypt(encrypted_payload[16:])
final_payload = unpad_function(encrypted_payload, AES_Cipher.block_size)
exec( zlib_module.decompress(bz2_module.decompress(final_payload)) )
这个混淆过程包括:
- 压缩:使用 gzip 和 bzip。
- 对称加密:使用ChaCha20、Blowfish 和 AES 进行链式加密。
- 非对称加密:使用 RSA 加密对称密钥。
结果以 Base64 编码并插入为 编码数据每次迭代都建立在前一次迭代的基础上,从而创建一个嵌套的加密结构,如果不进行逆向工程,就很难发现实际的有效载荷。
2. Gzip 解压缩
在许多中间步骤中,恶意软件采用了一种简单但有效的混淆方法:Gzip压缩与Base64编码相结合。
import base64, zlib; eval(zlib.decompress(base64.b64decode(<STR>).decode('utf-8'))
该技术可确保混淆的有效载荷在各个阶段保持隐藏。
3. 代码连接和动态编译
最后一层涉及将混淆的有效载荷拆分到多个变量中,这些变量在执行过程中动态连接和解码:
import base64, zlib
FEQXCBDOZKHVIhT = '...'
# ....(111 other variables with base-64 encoded values) ...
zZytWuvuEdBXSrO =
eval(<FEQXCBDOZKHVIhT' encoded with '\x>) +
eval(<next variable, encoded>) +
eval( ' zlib.decompress(base64.b64decode(<VAR>)).decode('utf-8') ') + ...
eval(compile(base64.b64decode(eval(zZytWuvuEdBXSrO)).decode('utf-8'), ‘<app>', 'exec'))
这个阶段对于手动进行逆向工程来说特别麻烦,因为必须解码并重新组合每个变量才能显示下一个有效载荷。
通过结合这些混淆技术, 信息窃取恶意软件 in 线程流畅 逃避检测,展示了 代码混淆 在现代网络攻击中。
ThreadFluent 的多阶段攻击链
此 线程流畅 信息窃取恶意软件 包括四个不同的阶段,每个阶段都会引入额外的层次 代码混淆.这些阶段不仅用于传递有效载荷,而且还保护它免受检测和分析。
阶段 0:初始代码执行
入口点是 __init__.py 文件,启动混淆的有效载荷的执行 流利.py该文件使用多层混淆(如步骤 1-3 所述)来生成第 1 阶段植入程序:
import os,threading
def main():
if os.name == 'nt':
from . import fluent
fluent.main()
thread = threading.Thread(target=main , daemon=True)
thread.start()
第一阶段:初始投放器
第一个植入程序一旦被反混淆,就会下载并嵌入其他恶意代码, 放置.py,来自 GitHub 存储库 红发香克斯-1337/请求 (警告:此处可能存在恶意代码)。
植入器嵌入 放置.py 进入本地安装的流行 要求 库,修改其 __init__.py 文件运行反混淆并执行下一阶段。此反混淆包括逆转混淆层 1 … 3 的许多应用。
第二阶段:第二个 Dropper
第二个植入程序在经过相同过程的反混淆后,会下载另一个有效载荷, ssl.py 来自 GitHub 存储库,将其重命名为 udp.py并生成一个锁文件以确保恶意软件不会重复安装。然后运行它来对其进行反混淆,从而执行最终的信息窃取负载。
第三阶段:最终信息窃取者
最后阶段是一个功能齐全的信息窃取程序,它采用了先进的规避技术:
- 反分析功能:
- 检测反恶意软件工具,如果检测到任何黑名单进程、IP、主机名或虚拟环境则终止。
- 数据渗漏:
- 捕获详尽的信息。包括 IP、Mac 地址、VPN 数据、浏览器 cookie/历史记录、信用卡数据和加密钱包凭证等,还包括屏幕截图。
- 使用此处显示的模板,通过 Telegram 频道发送被盗数据(加密):
反混淆策略
为了分析类似的软件包,研究人员必须系统地逆向其混淆层:
- 模拟混淆步骤: 编写脚本来模拟转换(例如解密,解压缩),而无需执行有效负载。
- 逆向加密层: 使用嵌入的密钥和算法提取并解密有效负载。
- 迭代分析: 迭代处理每个中间阶段以重建最终的有效载荷。
自动化工具和沙盒环境对于简化此分析至关重要。
威胁行为者
显然这个包是由两个 PyPI 账户发布的, 阿比尔侯赛因10 以及 anomilano785,目前已删除。
有一个名为(当前活跃)的 GitHub 帐户 阿比尔侯赛因10,这可能与该活动有关。 红发香克斯-1337 拥有用于下载第 2 阶段和第 3 阶段有效负载的存储库的 GitHub 用户也正在接受分析。
尽管归因始终很复杂,而且有可能是红队成员,但泄露的信息种类和数量暗示着存在恶意行为者。
结论:代码混淆在恶意软件演化中的作用
此 线程流畅 该软件包在多阶段交付过程中体现了现代恶意软件的混淆技术。结合所采用的规避技术,该软件包明显表现出规避检测和抵抗分析的意图。
这项分析强调了协作和自动化工具在对抗此类威胁方面的重要性。通过分析和理解这些方法,安全专业人员可以在未来开发出更好的防御措施来抵御类似的恶意软件。
Xygeni 的 MEW 系统如何阻止恶意 threadfluent 包进入生产环境
Xygeni 的 恶意软件预警 (MEW) 该系统有助于阻止 线程流畅 Python 包,包含高级内容的恶意依赖项 代码混淆 以及多阶段 信息窃取恶意软件,以免危及生产环境。具体方法如下:
- 通过静态分析进行检测
MEW 发现 线程流畅的隐藏代码,发现分层加密和不寻常的依赖活动等可疑迹象。 - 运行时可达性评估
系统发现该软件包的代码可以在使用过程中运行,因此无需实际运行它,就将其标记为严重威胁。 - CI/CD Pipeline 保护性能
MEW 受阻 线程流畅 实时阻止其被纳入构建,并阻止其进入生产环境。它向开发人员发送可操作的警报,从而节省宝贵的时间。 - 威胁情报共享
Xygeni 迅速向 PyPI 报告了该软件包,并与其全球安全网络分享了其发现,阻止了其进一步传播。
通过捕捉 线程流畅 早期,Xygeni 的 MEW 系统确保恶意代码不会损害软件供应链或 CI/CD 工作流程。
保护你的 CI/CD Pipelines 免费
预防以下威胁 线程流畅 使用 Xygeni 的恶意软件预警系统。开始您的 免费试用 立即保护您的软件供应链。
路易斯·罗德里格斯
Luis Rodriguez 是一名物理治疗师cist + 数学家和 CISSP。目前是 Xygeni Security 的联合创始人兼首席技术官。他在软件安全领域拥有 20 多年的经验,并参与过以下项目: SAST 以及 SCA。他目前专注于 software supply chain security.
丹尼尔·马丁
Daniel Martín 是网络安全专家,也是 Xygeni 研究安全团队的成员,专门研究 SDLC 安全和应用程序漏洞缓解。





