黑客在PyPI上后门化Telnyx Python SDK 以窃取云和开发凭证

2026-03-31 09:39:56 1 42

2026年3月27日,一个名为TeamPCP的威胁行为者向PyPI(Python开发者下载软件包的主要仓库)上传了两个恶意的Telnyx Python SDK版本。被入侵的版本4.87.1和4.87.2在PyPI介入并将其隔离前,大约存活了四个小时。



一个广泛使用的Python软件包被悄然武器化,而大多数遭遇攻击的开发者对此毫不知情。

2026年3月27日,一个名为TeamPCP的威胁行为者向PyPI(Python开发者下载软件包的主要仓库)上传了两个恶意的Telnyx Python SDK版本。被入侵的版本4.87.1和4.87.2在PyPI介入并将其隔离前,大约存活了四个小时。

在那短短的时间窗口内,任何运行了简单软件包安装命令的开发者或系统都可能被悄然感染,没有任何警告、错误或可见的异常迹象。

Telnyx软件包并非一个小众或冷门库。其月下载量约为75万次,这意味着此次攻击的潜在影响范围远超直接用户,波及到所有依赖它的项目、流水线和服务。此次攻击之所以尤其令人担忧,在于其精确性。

软件包内仅有一个文件被更改。包内其他所有内容与干净版本逐字节相同。

恶意代码在应用程序导入该库的瞬间即会运行,无需任何点击、配置或用户交互。

Hexastrike分析师确认,此次攻击是TeamPCP(一个与更早的TeamTNT威胁行为者有关联的组织)发起的一场快速移动的供应链攻击活动的一部分。研究人员指出,该组织在短短九天内已经攻击了来自Aqua Security的Trivy、Checkmarx、LiteLLM以及超过46个npm包。

每一次新的攻击都比上一次更加复杂,而Telnyx入侵事件是他们迄今为止分析过的最完整的版本。

此次攻击采用三阶段结构。首先,被木马化的软件包触发一个平台特定的加载器。其次,该加载器从远程服务器获取一个隐藏的有效载荷,该载荷通过隐写术隐藏在一个WAV音频文件中。第三,解码后的有效载荷部署一个完整的凭据窃取程序,悄悄收集SSH密钥、云服务商凭据、Kubernetes密钥、数据库配置、加密货币钱包和环境文件,然后将所有数据加密并发送至攻击者控制的服务器。

该恶意软件可运行于所有主流操作系统,并能通过在Kubernetes集群的每个节点上部署特权Pod来在整个集群中传播。

感染机制如何实现隐蔽
整个攻击的入口点是对一个名为_client.py的文件的修改。当Python加载Telnyx库时,会自动运行该文件中的代码。



TeamPCP在文件底部添加了两个函数调用:针对Windows系统的setup()和针对Linux及macOS的FetchAudio()。这两个函数首先检查操作系统,如果在错误的平台上运行则会静默停止。

所有可能发生的错误都被一个通用的异常处理程序捕获并静默忽略,这意味着运行该库的应用程序永远不会崩溃或发出警报。

为了隐藏这些函数的实际功能,攻击者将每个敏感字符串都包裹在一个base64编码辅助函数中。URL、文件夹路径、文件名和标头均被编码,因此粗略查看代码不会发现攻击痕迹。

一旦解码,Windows路径会从命令与控制服务器83.142.209.203:8080下载一个名为hangup.wav的文件。该文件实际上并非音频。它是一个有效的WAV容器,利用隐写术在其音频帧中隐藏了一个可执行二进制文件。

该二进制文件被提取出来,使用XOR密钥解码,并写入Windows启动文件夹,命名为msbuild.exe,该名称借用自合法的微软工具以避免怀疑。它以无可见窗口的方式静默启动,并在用户每次登录时自动运行。



在Linux和macOS上,攻击方法不同但同样隐蔽。该代码并未释放文件,而是解码存储在变量中的一个大型Python有效载荷,并在一个分离的子进程中运行它。

即使父应用程序关闭,该进程仍会继续运行。它会下载第二个名为ringtone.wav的WAV文件,从音频数据中提取隐藏的Python窃取程序,并完全在内存中运行,绝不将脚本写入磁盘。

一旦窃取程序完成凭据收集,结果将使用AES-256-CBC加密,会话密钥使用硬编码的RSA-4096公钥进行封装。这意味着只有攻击者才能解密被盗数据。

随后所有内容被捆绑成一个文件,通过HTTP POST请求发送到攻击者的服务器,其中包含标头X-Filename: tpcp.tar.gz,该签名出现在每个已知的TeamPCP攻击活动中,并可作为强有力的网络级检测指标。

组织应将任何4.87.1或4.87.2版本的安装视为已确认的入侵事件,并立即启动事件响应。必须轮换受影响系统可访问的所有凭据,包括SSH密钥、AWS、GCP和Azure凭据、Kubernetes令牌、Docker凭据、数据库密码、API密钥以及存储在环境文件中的任何密钥。

仅卸载该软件包并不能移除持久性后门。在Linux上,必须手动删除文件~/.config/sysmon/sysmon.py及其关联的systemd服务。在Windows上,必须删除启动文件夹中的msbuild.exe和隐藏的.lock文件。在Kubernetes环境中,应审计并删除kube-system中任何名为node-setup-*的Pod,并检查每个节点是否存在名为sysmon.service的意外systemd服务。

开发人员还应将所有依赖项锁定到精确版本,使用锁文件,在PyPI账户上启用双因素认证,尽可能使用短期凭证,避免将密钥存储在磁盘上的.env文件中,并在防火墙层面阻止指向83.142.209.203、checkmarx.zone以及更广泛的83.142.209.0/24子网的出站连接。

关于作者

socsoc121篇文章136篇回复

评论1次

要评论?请先  登录  或  注册
  • 1楼
    4 小时前

    这波操作确实很干净,4小时就撤了,但月下载75万次这个量级,擦屁股都得擦一阵。 说说我的看法: **攻击面选得刁钻。** Python生态依赖链长且乱,大多数项目直接`pip install`完事,谁会去校验包完整性?改一个`_client.py`这种边角文件,一行代码不动主逻辑,review都未必能扫出来。隐写术藏在WAV里过静态扫描更是常规操作。 **实操建议:** 1. **依赖锁定是基本功**。requirements.txt + pip-compile 或者 poetry.lock 用起来,别裸着`pip install xxx`。有条件的搭个内部PyPI镜像,先过一遍再放行。 2. **网络层先把黑名单加上**。`83.142.209.203`、checkmarx.zone、整个`83.142.209.0/24`网段先封了再说。HTTP POST带`X-Filename: tpcp.tar.gz`这个特征太明显,WAF/IDS规则加上去。 3. **已经中招的别只删包**。Windows去Startup文件夹找msbuild.exe,Linux/macOS看`~/.config/sysmon/sysmon.py`有没有,有K8s集群的直接`kubectl get pods -A | grep node-setup`全扫一遍。中招机器的凭据全部轮一遍,别抱侥幸心理。 4. **下载量不等于感染量**。别慌,75万是月下载,不是4小时内中招数。PyPI有安装统计,但实际落地到生产环境的比例没那么夸张。优先排查最近一周更新过Telnyx的项目。 这种供应链攻击会越来越常见,盯住依赖包的hash和来源才是长久之计。