打开网易新闻 查看精彩图片

3月27日,PyPI仓库里一个每月被下载75万次的Python包,在4小时内完成了从正常工具到间谍软件的蜕变。

攻击者TeamPCP上传了两个恶意版本——4.87.1和4.87.2。没有弹窗,没有报错,开发者执行pip install的瞬间,后门就已经就位。这种攻击的阴险之处在于:它看起来完全正常,运行起来也完全正常,直到你的SSH密钥、云凭证、数据库密码全部流向境外服务器。

一场只改动了2个函数调用的精准手术

一场只改动了2个函数调用的精准手术

Hexastrike的研究人员拆解后发现,整个攻击只动了一个文件:_client.py

这是Telnyx SDK的核心模块,Python导入库时会自动执行其中的代码。TeamPCP在文件末尾添加了两行:Windows系统调用setup(),Linux和macOS调用FetchAudio()。两个函数都会先检查操作系统,跑错平台就静默退出——绝不打草惊蛇。

所有异常都被一个兜底的异常处理器吞掉,应用程序不会崩溃,不会报警,日志里干干净净。

打开网易新闻 查看精彩图片

为了掩盖真实意图,攻击者把函数体塞进了多层混淆和加密。静态分析几乎看不出问题,动态调试也会被反调试技巧干扰。这种手法不像临时起意的脚本小子,更像一个熟悉Python生态、懂逆向工程的老手。

更讽刺的是,包的其余部分与干净版本字节级一致。哈希校验、签名验证、依赖扫描——这些常规安全检查全部失效。

藏在WAV文件里的"语音"其实是窃密代码

藏在WAV文件里的"语音"其实是窃密代码

攻击分三阶段展开,每一步都比上一步更难察觉。

第一阶段,被感染的SDK根据操作系统释放对应的加载器。第二阶段,加载器向远程服务器请求一个WAV音频文件——表面上是普通的音频资源,实际用隐写术(steganography)嵌入了加密载荷。第三阶段,解码后的载荷展开为完整的凭证收割机。

这个收割机的胃口大得惊人:SSH私钥、AWS/Azure/GCP云凭证、Kubernetes secrets、数据库配置文件、加密货币钱包、环境变量文件——全部读取、加密、外传。

打开网易新闻 查看精彩图片

如果运行在Kubernetes环境里,它还会尝试以特权模式在每个节点部署Pod,把整个集群变成跳板机。跨平台、横向移动、持久化——一个Python包安装完成了APT级别的渗透。

TeamPCP的身份已被关联到更老牌的TeamTNT组织,后者以攻击云原生基础设施闻名。Hexastrike的追踪显示,在袭击Telnyx之前的9天里,同一批人已经攻陷了Trivy、Checkmarx、LiteLLM,以及46个npm包。每一次都比上一次更精细,Telnyx是他们目前分析得最完整的样本。

供应链攻击正在进入"微差异化"时代

供应链攻击正在进入"微差异化"时代

PyPI在4小时后下架了这两个版本,但窗口期已经足够长。CI/CD流水线、Docker镜像构建、开发环境初始化——这些场景下的包安装往往是自动化的,没人会盯着终端看输出。

更麻烦的是版本号陷阱。4.87.1和4.87.2看起来是合理的补丁更新,语义化版本规范(SemVer)训练开发者信任这种数字递增。攻击者深谙此道:不用突兀的大版本号,不制造心理负担,让升级显得"理所当然"。

这种"微差异化"攻击正在成为供应链安全的新常态。2023年的XZ Utils后门事件(CVE-2024-3094)花了两年才植入,Telnyx只花了几个小时。区别在于,前者追求极致隐蔽,后者追求极致效率——在被发现前最大化感染面。

开源生态的脆弱性在于:一个被攻破的维护者账号、一个被绕过的双因素认证、一次被社会工程化的提交,就能让数百万下游项目暴露在风险中。而检测这种攻击的成本极高:你需要监控每一个依赖的每一个版本的每一个文件,对比字节级差异,还要理解混淆代码的真实意图。

目前PyPI已经加强了上传审核,但这场猫鼠游戏的本质没有改变。当你的构建脚本运行pip install时,你信任的是什么?是版本号?是下载量?还是某个你从未谋面的维护者凌晨三点按下发布键时的清醒程度?