3月27日,两个看似平常的版本更新,让Python开发者圈炸开了锅。SafeDep监测发现,telnyx库的4.87.1和4.87.2版本被植入恶意代码,而这款库的月均下载量超过100万次——按每天3万次的速度,意味着大量生产环境可能在不知情的情况下"中招"。
攻击者的手法堪称狡猾。他们没有直接把木马写在显眼处,而是将第二阶段的恶意二进制文件伪装成WAV音频格式,藏在远程服务器里。当开发者安装这两个版本时,telnyx/_client.py里的 payload 会自动下载这些"音频文件",解压出真正的攻击载荷。
Windows和Linux"待遇"不同:一个留后门,一个偷密钥
这套攻击脚本会根据操作系统差异化执行。Windows用户会被植入一个持久化可执行文件,重启后依然存活;Linux和macOS用户则面临更隐蔽的威胁——系统凭证被直接收割。
telnyx是什么来头?这是Telnyx公司官方维护的Python SDK,用来对接其云通信API。Telnyx本身是一家提供全球电信基础设施的服务商,主打"语音AI代理+内置全球运营商网络"。简单说,如果你的Python应用需要打电话、发短信、做语音交互,很可能在用这个库。
企业级通信SDK的受众画像很明确:客服系统、呼叫中心、AI语音助手——全是数据敏感型业务。攻击者选择这里下手,相当于在快递公司的分拣中心安插了眼线,包裹内容一览无余。
供应链攻击的"标准作业流程"正在成型
这次事件的手法并不新鲜,但执行得相当老练。回顾近几年PyPI的安全事件,一条清晰的攻击链条正在固化:
第一步,窃取合法开发者的PyPI账号,或者通过社会工程学渗透。第二步,发布带有补丁版本号的更新(4.87.1、4.87.2这种增量更新最不容易引起怀疑)。第三步,在核心模块里植入轻量级loader,把真正的恶意代码托管在第三方服务器,既减小包体积,又能随时更换payload。
![]()
WAV音频容器的选择颇有深意。音频文件在流量分析中属于"正常"内容类型,不会触发大多数安全设备的告警;文件体积可以做得很大而不引人注意;二进制数据藏在音频帧里,静态扫描很难识别。
SafeDep的分析师打了个比方:这就像是把密信写在乐谱的空白处,安检人员看到的是一本普通的音乐书。
100万月下载量背后,有多少人在看changelog?
telnyx的下载数据揭示了一个尴尬的现实。月均100万次安装,意味着大量依赖是间接引入的——你的项目可能根本没直接引用telnyx,但某个上游依赖把它带了进来。
Python生态的嵌套依赖问题由来已久。一个中型项目的lock文件里动辄几百个包,逐行审计版本变更对大多数团队来说不现实。自动化工具能扫出已知漏洞,但对于这种"零日"式的恶意投毒,检测窗口期往往以小时计算。
3月27日发现问题,PyPI管理员当日下架了这两个版本。但供应链攻击的杀伤半径从来不只是"问题存在的时长"。持续集成系统的缓存、内部镜像站的同步延迟、生产环境的冻结版本策略,都会让恶意代码的存活周期远超官方仓库的清理速度。
Telnyx官方尚未发布详细的事后分析报告。开发者目前能确认的是:4.87.0及之前的版本未受影响,4.87.3已清理恶意代码。如果你在过去72小时内部署过依赖telnyx的应用,现在该检查的是容器镜像层和虚拟环境的site-packages目录。
一个值得玩味的细节是,攻击者选择了4.87这个接近小版本号末尾的数字发布。是巧合,还是刻意避开会引起广泛关注的整数版本?
你的CI流水线里,上次完整审计间接依赖是什么时候?
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.