一个日均下载30万次的Python库,在3月27日那天,把恶意代码塞进了两个正式版本。攻击者没选什么高深的技术路线——他们把第二阶段的木马二进制文件,藏进了WAV音频文件的噪声里。

这种手法像什么?就像把接头暗号录进一首流行歌,放到音乐平台等人来取。Telnyx的用户们直到SafeDep发出警报,才意识到自己的依赖列表里埋了雷。

被污染的版本长什么样

被污染的版本长什么样

出问题的两个版本号是4.87.1和4.87.2,发布时间在2026年3月27日。恶意代码被注入到telnyx/_client.py这个核心文件里,位置选得很刁钻——这是几乎所有调用该库的应用都会加载的入口。

根据SafeDep的技术分析,攻击链分两步走:第一阶段,被篡改的Python代码会从远程服务器下载一个WAV文件;第二阶段,从这段音频的频谱数据里提取出隐藏的可执行文件。Windows系统上,这个文件会被写成持久化的木马;Linux和macOS上,它直接动手收割凭证。

这种"音频隐写"(Steganography)的技术门槛不算高,但选在这里很鸡贼。WAV文件在流量监控里看起来人畜无害,很多安全工具不会深度扫描音频内容。攻击者相当于利用了"格式信任"——你看到.wav后缀,下意识觉得这是媒体文件,不是可执行代码。

为什么是Telnyx

为什么是Telnyx

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

Telnyx本身是个正经的通信基础设施服务商。他们的Python库封装了对Telnyx REST API的调用,主要功能是让开发者能在应用里集成语音、短信和AI Agent能力。官网描述很直白:"内置全球电信基础设施的语音AI Agent"。

这个库的用户画像决定了攻击价值。每月100万+的下载量里,大量是企业级通信服务、呼叫中心系统、语音机器人平台。这些系统的共同点是:服务器权限高、数据敏感、且往往直接暴露在互联网边缘。

PyPI作为Python生态的中央仓库,长期以来都是供应链攻击的重灾区。2023年的PyTorch事件、2024年的ultralytics篡改,攻击者越来越熟练地利用"版本号信任"——用户看到4.87.2比4.87.0新,自然倾向于升级,很少会去核对代码哈希。

Telnyx的月活数据(100万+下载)让它成了高价值目标,但攻击者的真正猎物是下游那些集成语音API的企业系统。

发现与响应的时间线

发现与响应的时间线

3月27日当天,两个恶意版本被先后推送到PyPI。同一天,SafeDep的监控系统触发警报——他们的做法是对比相邻版本的代码差异,标记出异常的文件修改。这种"增量审计"在供应链安全里越来越常见,但覆盖率仍然有限。

目前PyPI官方已经下架了这两个版本。但对于已经安装的用户,问题还没结束:pip默认会缓存下载的包,如果你的requirements.txt里写着telnyx==4.87.1,或者某个间接依赖锁定了这个版本,恶意代码可能还躺在你的虚拟环境里。

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

检查方法很简单:找到你的site-packages/telnyx/_client.py,搜索是否有可疑的网络请求代码,特别是涉及.wav下载或二进制执行的片段。更稳妥的做法是锁定到4.87.0或更早的已知干净版本,同时检查环境中是否残留了异常的可执行文件。

音频隐写:老技术的新场景

音频隐写:老技术的新场景

把代码藏进WAV不是这次攻击的首创,但用在PyPI供应链里还算新鲜。技术上,WAV格式的PCM音频数据是未压缩的,攻击者可以把任意字节序列直接写入采样值,只要保持文件头合法,播放器就能正常"播放"一段噪音。

这种手法的隐蔽性在于多层绕过:防火墙看到HTTP(S)下载WAV,不会警觉;静态分析工具看到Python代码里写"下载音频文件",也不会直接报警;直到运行时的动态行为监控,才能发现这段"音频"被读进了内存并执行。

对于防御方,这提出了一个尴尬的问题:你的安全工具链里,有没有对"下载的媒体文件"做内容熵分析?大多数团队没有。攻击者赌的就是这个盲区。

供应链安全的残酷现实是:你信任的每个依赖项,都是别人的攻击面。

这次事件留下一个悬而未决的疑问——攻击者是如何获得Telnyx的PyPI发布权限的?是开发者凭证泄露,还是CI/CD管道被入侵,抑或更复杂的供应链上游污染?Telnyx官方尚未发布详细的事后分析,而这类"权限怎么丢的"问题,往往比"代码怎么写的"更难对外公开。

你的项目依赖列表里,有多少个像Telnyx这样"看起来靠谱"的库,上一次审计它们的版本变更记录是什么时候?