SSH 登录慢了 0.5 秒:一个工程师意外拦下潜伏两年多的 xz 后门
目录
配图:AI 生成的概念示意图,非论文原图、真实现场或实验数据。
TL;DR:2024 年 3 月,工程师 Andres Freund 因为 SSH 登录变慢、CPU 占用异常,发现压缩库 xz 的 5.6.0 和 5.6.1 版本被植入后门(CVE-2024-3094)。这个后门挂在 sshd 的认证环节上,出自一个长期参与项目、最终拿到维护权限的账号“Jia Tan”。已经确认的是后门存在及其植入机制;幕后是谁,至今没有公开定论。
这是 2024 年的旧事,不是今天的新闻,但它仍是开源供应链安全的经典案例。
一个没人想管的小库
xz Utils 是 Linux 世界里几乎无处不在的压缩工具,其中的 liblzma 库被大量系统组件间接依赖。它长期由 Lasse Collin 一人维护,精力有限。据公开的时间线梳理,2021 年 10 月起,名为 Jia Tan 的账号开始提交补丁;2022 年前后,另外几个账号在邮件列表里不断抱怨补丁进展太慢,暗示维护者不称职。Collin 公开表示自己资源有限,并提到可能让 Jia Tan 分担更多工作。此后 Jia Tan 逐渐拿到提交权限,甚至负责制作发布包。
这套“先帮忙、再施压、最后接班”的剧本,常被视为典型的长期社会工程。不过,施压账号与 Jia Tan 是否同一团伙,目前只是推测。
后门藏在哪
恶意代码并不在 Git 仓库的显眼位置,而是通过伪装成测试文件的二进制数据,加上只存在于发布压缩包里的一个构建脚本,在编译时才被拼装出来。运行时,它借助 ifunc 机制接管 liblzma 的函数,再劫持 sshd 中用于 RSA 验证的 RSA_public_decrypt。Freund 的报告认为它在认证之前就会运行,“很可能”允许未授权访问或远程执行代码,但当时并未完整分析。
之所以牵涉到 sshd,是因为一些发行版给 sshd 打了 systemd 补丁,而 libsystemd 依赖 liblzma。
靠 0.5 秒穿帮
Freund 在 Debian sid 上发现,SSH 登录异常吃 CPU,valgrind 还报错。他测得一次失败的登录从约 0.3 秒涨到约 0.8 秒。他顺藤摸瓜,查到问题出在 xz 上,并于 2024 年 3 月 29 日把结果发到 oss-security 邮件列表。据报道,他是在微软工作的工程师。
出事的 5.6.0 和 5.6.1 主要进入了测试版和滚动更新的发行版,尚未广泛进入稳定版,所以实际受害面被大幅限制。
为什么值得后怕
这次没有人在代码审查里看出破绽,是一次性能异常歪打正着。如果再晚几个月,它可能已经进入主流发行版。攻击者耐心地经营了两年多,目标不是某个服务器,而是“信任”本身。事后,业界开始更认真地讨论:谁在维护关键的小型开源项目、发布包是否应能与源码仓库逐一对照,以及不该让一个人孤独地扛着全世界的基础设施。
- 背景与时间线:Wikipedia:XZ Utils backdoor