3月27日,PyPI仓库里两个版本的telnyx包被确认植入恶意代码。这个每月平均下载超过100万次的Python库,在4.87.1和4.87.2版本中暗藏了一个精心设计的后门——攻击者把第二阶段载荷藏进了WAV音频文件里。
供应链攻击的剧本正在加速迭代。
telnyx是什么?官方描述很直白:一个让Python应用方便调用Telnyx REST API的库。Telnyx本身是一家提供语音AI代理和全球电信基础设施的公司,开发者用这个库来集成通话、短信、号码管理等功能。简单说,它是企业通信系统的关键连接器。
SafeDep的安全团队发现了这次投毒。攻击者修改了telnx/_client.py文件,注入的代码会连接远程服务器,下载伪装成WAV音频文件的二进制载荷。Windows系统上,它会释放一个持久化可执行文件;Linux和macOS上,则直接收割系统凭证。
把恶意代码藏进音频文件,这招不算新但够隐蔽
WAV文件作为载体有几个好处。首先,它通过了基础的内容审查——很多安全工具会跳过"正常"的媒体文件。其次,音频文件的二进制结构天然适合隐藏可执行代码,攻击者可以把shellcode嵌入到音频数据块的间隙里。
这次攻击的有趣之处在于针对性。Windows用户被当作长期资产来经营,植入持久化程序意味着攻击者打算反复利用这台机器;Linux和macOS用户则被当作一次性目标,直接偷完凭证就走。这种区分说明攻击者对不同平台的防御机制有清晰认知。
telnyx的下载数据值得细品。日均3万次下载,意味着在问题版本被撤下前的窗口期内,可能有数千台开发机或生产服务器已经中招。Python生态的依赖解析机制会默认拉取最新版本,很多CI/CD管道在3月27日当天就自动完成了"自我感染"。
PyPI的安全模型又一次暴露结构性缺陷。
包管理平台的核心矛盾在于:它要同时服务开源的透明度和企业的安全性。PyPI没有强制代码签名,上传者的身份验证也相对宽松。一个被入侵的开发者账号,或者一次成功的钓鱼攻击,就能让恶意代码进入全球数百万台机器的信任链。
这次事件里,攻击者选择了特定的小版本号(4.87.1和4.87.2)进行投毒,而不是直接劫持最新主版本。这种策略降低了被快速发现的概率——很多用户会锁定主版本号,但允许自动更新补丁版本,而4.87.x看起来就是一个"安全"的补丁更新。
供应链攻击的ROI(投资回报率)正在变得离谱。攻击者只需要攻破一个被广泛依赖的包,就能触达成千上万的企业代码库。相比之下,传统的定向渗透需要逐个攻破目标网络,成本高、痕迹重。
开发者现在该做什么?现实很骨感
检查你的依赖锁定文件。如果你或你的团队在3月27日之后安装过telnyx,且版本恰好是4.87.1或4.87.2,那台机器需要被当作已失陷处理。不只是重装Python包,要查进程、查网络连接、查启动项。
更麻烦的是间接依赖。你的项目可能不直接依赖telnyx,但某个上游包可能依赖它。Python的依赖树在大型项目里往往深不见底,手动审计几乎不可能完成。现有的工具如pip-audit可以帮你扫描已知漏洞,但针对这种"零日投毒",检测窗口永远滞后于攻击窗口。
一些团队开始采用私有PyPI镜像和延迟同步策略——官方仓库更新后,先在隔离环境观察24-48小时,确认无异常再同步到内部镜像。这牺牲了部分更新及时性,换取了供应链的缓冲带。
代码签名和可重现构建是更长远的方向,但Python生态的碎片化让大规模推行困难。PyPI在2023年启动了2FA强制要求,2024年测试了Trusted Publishers(让CI系统直接发布而不需要长期有效的API token),但这些措施针对的是账号层面的安全,而非代码层面的审查。
攻击者已经证明,他们比防御者更懂开发者的心理。
选择WAV作为载荷载体,利用的是开发者对"正常文件类型"的信任惯性。区分Windows和Linux/macOS的处理逻辑,说明攻击者对目标环境的运维习惯有研究。甚至版本号的选择,都透露出对语义化版本控制(Semantic Versioning)心理的精准把握——人们信任补丁版本。
这次事件没有公开披露攻击者的身份或动机。是加密货币挖矿团伙?是国家背景的组织?还是单纯的凭证倒卖产业链?目前都是未知数。SafeDep的博客只确认了技术细节,没有归因分析。
Telnyx官方尚未就此事发布公开声明。对于依赖这个库的企业客户来说,沉默本身就是一种信息。
热门跟贴