差点瘫痪半个互联网:2024 年 XZ Utils 后门案,一个黑客如何用两年"熬"成核心维护者

2024 年 3 月,一名微软工程师因 SSH 登录慢了 500 毫秒,意外揪出潜伏两年多的 XZ Utils 后门(CVE-2024-3094,CVSS 满分 10.0)。本文复盘 Jia Tan 如何用社工攻击渗透开源项目、劫持 sshd,并聊透开源维护者倦怠与软件供应链安全(SBOM、SCA)为何成为安防焦点。

2024 年 3 月底,互联网安全圈差点经历一场"世界末日"。一名在微软做 PostgreSQL 的工程师 Andres Freund,本来只是在排查一台 Debian 测试机上 SSH 登录为什么莫名其妙变慢,结果发现了一个藏在压缩库 liblzma 里的后门。这个后门要是再晚几周进入各大 Linux 发行版的稳定版,攻击者就能拿着一把"万能钥匙",远程、免登录、以 root 权限控制全球无数台 Linux 服务器。漏洞编号 CVE-2024-3094,CVSS 评分直接拉满到 10.0——满分,意味着最严重。而整件事最让人后背发凉的地方在于:它不是靠某个技术漏洞钻进来的,而是靠"熬"进来的。

延伸阅读

更多相关攻略推荐:Ollama AI系列(2):VPS上的AI推理与API应用Ollama AI系列(2):VPS上的AI推理与API应用【CPU选型 01】搭载 AMD Ryzen 9950X 的 VPSARM / Ampere 席卷 VPS:性价比真香还是兼容陷阱?Ollama AI系列(2):VPS上的AI推理与API应用

一、一个 500 毫秒的延迟,救了半个互联网

故事的开头一点都不惊险。Andres Freund 在自己维护的一台 Debian sid(不稳定版)机器上,发现 SSH 登录比平时慢了大约半秒,同时内存调试工具 Valgrind 还报了一堆奇怪的错误。正常人可能骂一句"这破机器又抽风"就过去了,但 Freund 是个较真的人,顺着线索一路追到 liblzma 这个库,最终在 2024 年 3 月 29 日把发现发到了开源安全邮件列表 oss-security 上。

这一发,整个开源世界炸了锅。各大发行版连夜回滚:Debian、Fedora、Arch、openSUSE、Kali 纷纷把受影响的 5.6.0 和 5.6.1 版本撤下,退回干净的 5.4.x。GitHub 一度冻结了 xz-utils 仓库和那个可疑账号。事后大家才回过神:幸亏 Freund 没有放过那 500 毫秒。用安全研究者们的话说,我们"跟核弹擦肩而过,只差几周"。

  • 披露时间:2024 年 3 月 29 日,由 Andres Freund 公开。
  • 漏洞编号:CVE-2024-3094,CVSS 10.0(最高分)。
  • 受影响版本:xz / liblzma 5.6.0 与 5.6.1。
  • 实际落地范围:仅少数滚动/测试版(Fedora Rawhide、Debian sid、Kali 等),主流稳定版大多幸免。

二、xz 到底是什么?为什么全世界都离不开它

要理解这事的份量,得先知道 xz 是干嘛的。xz 是一套压缩工具和库,核心组件叫 liblzma,用的 LZMA 算法能把文件压到比 gzip 还小大约 30%。从 2005 到 2008 年间由 Lasse Collin 等人设计出来后,.xz 格式逐渐被几乎所有 Linux 发行版采用:tar 包、内核镜像、软件包管理器背后的压缩,处处都是它。换句话说,几乎所有 Linux 系统都装着 liblzma。

关键转折在依赖链上:很多基于 systemd 的发行版(Debian、Ubuntu、Fedora 等)给 OpenSSH 的 sshd 打了补丁,让它与 libsystemd 链接,而 libsystemd 又依赖 liblzma。于是"我装个压缩库"这件事,阴差阳错地把后门和被攻击面最大的 SSH 服务连在了一起。这也解释了为什么有人感叹:全球 90% 的互联网基础设施,其实就压在少数几个"免费、开源、没人管"的项目上。

三、Jia Tan 的"两年长征":从热心贡献者到后门制造者

攻击者用的化名是 "Jia Tan"(GitHub 昵称 JiaT75)。根据事后重建的时间线,这场渗透前后耗时约三年(2021 年 11 月到 2024 年 2 月)。它的高明之处,是根本不急着动手。

2021 年 10 月 29 日,Jia Tan 在邮件列表上提交了第一个无害补丁——加一个 .editorconfig 文件。之后两年里,他持续提交看起来完全正常的代码:修可复现构建的问题、补 NULL 检查、写测试。这些贡献都是真的、有用的,也都经过了审查。社区对他的评价从"热心新人"慢慢变成"靠谱主力"。到 2023 年初,他已经拿到了提交权限,成了 xz 的联合维护者,甚至可以自己签名发布版本。

真正的恶意载荷直到 2024 年 2 月 24 日发布的 5.6.0 才出现,3 月 9 日的 5.6.1 又做了"优化"。换句话说,前两年半的苦劳,全是为了最后这两步能顺利合进去。安全圈里有人评价:别的供应链攻击都从偷令牌、钓鱼、投毒构建步骤开始,这一个是"从干活开始"——耐心本身就是它的创新点。

四、影子军团:社工攻击里的舆论施压

光靠自己还不够。时间线里最耐人寻味的一段,是一批"群众演员"的配合。从 2022 年起,邮件列表上出现了几个账号——Jigar Kumar、Dennis Ens、krygorin4545、misoeater91——反复抱怨 xz 发布太慢、维护者不干活,公开施压要求加入新的联合维护者。事后调查普遍认为,这些多半是同一个团伙控制的"马甲号"(sock puppet)。

而当时 xz 唯一的维护者 Lasse Collin,是个长期独自、无偿维护项目的志愿者。他在邮件里坦承自己有长期心理健康问题,"照顾这件事的能力非常有限",还强调"这只是个不拿钱的爱好项目"。马甲号的持续施压,精准命中了他的疲惫。2022 年 6 月,Collin 松口说 Jia Tan"实际上已经是联合维护者了";到 2023 年,Jia Tan 正式拿到发布权。攻击者算准了:一个累到极限、没人接手的志愿者,正是整个供应链上最软的那块骨头。

五、后门藏在哪?为什么代码审查没发现

这可是整起事件最"反常识"的教科书级手法:恶意代码根本不在人能读到的 Git 源码里,而是藏在发布用的 tarball(发行压缩包)里。具体说,是一个叫 build-to-host.m4 的混淆构建脚本,加上几个伪装成"测试文件"的二进制数据。发行版实际拿来编译的正是这个 tarball,而不是 Git 仓库里的源码。

构建时,这段机器才懂的逻辑会解包、拼装,把后门注入 liblzma。而且它有很强的"选择性":只在 x86-64 架构、用 glibc、用 GCC 编译、并且打包成 Debian 或 RPM 包的环境下才激活。所以在别的环境里,它表现得人畜无害。换句话说,你对着 Git 仓库做一百遍代码审查,也找不到它——因为那里面本来就没有。这直接戳破了一个幻觉:你以为"我审过源码就等于我用的软件安全",而供应链攻击要的,正是源码和成品之间的那道缝。

六、它是如何劫持 SSH 的

运行时,后门利用了 glibc 的一个叫 IFUNC 的特性(本来是用来根据 CPU 选最优函数实现的)。它把钩子挂进 sshd 的认证路径,拦截了 RSA_public_decrypt 这个函数。当有人连接 SSH 时,后门会检查客户端证书里有没有一段用攻击者 Ed448 私钥签名的隐藏标记。

如果签名对得上,后门就从中提取命令,以 sshd 当时的 root 权限直接执行——而且发生在登录日志写下来之前,神不知鬼不觉。如果签名对不上(也就是 99.999% 的正常登录),后门就乖乖调用原来的函数,用户照常登录,系统一切如常。这种"失败即放行"的设计让它能在生产环境潜伏很久而不崩溃、不报错,唯一的破绽就是 Freund 注意到的那点 CPU 占用和约 500 毫秒的延迟。

七、开源的阿喀琉斯之踵:一个人的无偿维护

XZ 事件最该被记住的,不是技术本身,而是它暴露的结构性问题。一个支撑着全球服务器的关键库,长期由一个人免费、孤独地维护,社区还不断催更。这不是 xz 一个项目的特例——想想 2014 年差点搞垮 HTTPS 的 Heartbleed(OpenSSL 也长期靠几个志愿者),再想想 2021 年让全世界加班的 Log4j(Log4Shell)。

现实很扎心:无数市值百亿的公司,在 xz、ImageMagick、OpenSSL 这类库上盖起千亿帝国,却往往一毛不拔地白嫖维护,既不捐钱也不做安全审计。攻击者要的也正是这个:他们没有攻击代码,他们攻击的是"人"。当一个疲惫的志愿者成了关键基础设施的单点故障,"维护者倦怠"本身就成了安全风险。可持续的资金、合理的共同维护者审查机制、最小权限原则——这些本来是管理问题,现在都是安全控制。

八、软件供应链安全:SBOM 与 SCA 走上台前

XZ 之后,行业把"软件供应链安全"提到了前所未有的高度。两个概念频繁出现:一是 SBOM(软件物料清单),相当于给你软件的"成分表",把项目用到的每一个依赖、版本都列清楚;二是 SCA(软件成分分析),用工具自动扫描你的依赖树,一旦发现某个库出问题(比如 liblzma 5.6.0/5.6.1),立刻在全公司的容器镜像、构建环境、部署产物里定位。

这背后还有政策推动:2021 年美国行政命令 14028 就要求联邦软件供应商提供 SBOM;XZ 之后,可复现构建(reproducible builds)、发布物来源证明、对"发布 tarball 是否真的由审查过的源码编译而来"的验证,都成了热门议题。一句话总结行业教训:你构建出来的东西,不一定等于你能读到的源码;能证明"它从哪来",比能读它更重要。

#XZ后门 #软件供应链 #开源安全 #CVE-2024-3094 #SSH #SBOM #运维安全