xz-utils 后门事件总结
xz-utils 的后门行为暴露后,已经分配 CVE ID: CVE-2024-3094。
先说结论:这不是技术不够或粗心大意导致的漏洞,这是特意撰写的后门程序;后门使用了对抗逆向分析的手段来尝试藏匿恶意行为。始作俑者在事件暴露后未曾出现过。
投毒
投毒事件离不开 Jia Tan @jiaT75
这个人物。
2021 年,Jia Tan(下称为 Jia)在 GitHub 建立了 @JiaT75 帐号。
之后两年间,陆陆续续的开始给 libarchive
和 xz
等项目提交代码(例如 libarchive/libarchive#1609),得到社区的信任,最终得到了 GitHub 上托管的 xz 项目的控制权以及发版权限。
2023 年,Jia 尝试在代码库引入 GCC 的 ifunc
特性1,来优化 crc64 计算代码。一个月后,提交“构建时禁用 ifunc
特性”的更改至 google/oss-fuzz#10667 来通过自动测试程序的检测;不过据 oss-fuzz
维护者所说,即便 fuzz 程序支持 ifunc 也不会提前检测到。
Jia 自 2024 年 2 月 开始准备后门投毒工作2,并于 2 月 24 日发布带有后门的 5.6.0 版本3。就在一周后的 2 月 29 日,有贡献者提议 systemd
应动态隐式加载而非显式依赖各个压缩库4,并在 3 月 9 日接受了该合并请求。注意此时但尚未正式发布新版本。该更改将破坏 xz 后门所利用的后门路径,即从「启动 sshd
➜ 自动引入 systemd
➜ 自动引入 liblama
」变成「sshd
➜ 自动引入 systemd
」。
或许是因为这个原因,Jia 开始加速,并赶在 3 月 9 日发布了 5.6.1 版本5,且用户 Hasn 在 3 月 25 日请求 Debian 包含该版本6。当然,此时并不能确认该用户是否为 Jia 建立的小号。
发现
最初发现该问题的是 Postgres 数据库的维护者之一 Andres Freund。他在 Debian 测试版本测试 Postgres 时发现了 openssh-server 的性能问题7,深入研究后发现了 liblzma 的逆向分析对抗行为。
目前已知的信息是可以在连接 OpenSSH 服务器时提供特定的公钥信息来实现远端代码执行(RCE)8。目前对该恶意代码的分析尚不完全,过两周或许会有新的信息更新。
后续
因为 Ubuntu、Debian、Fedora 在 xz 5.6.0 后尚未发布新的正式版,因此生产环境是没有问题的。
Arch Linux 的稳定版本包含了该有问题的版本,但其 OpenSSH 服务器包并未加入 systemd 集成补丁而逃过一劫。
上述的发行版均已剔除有问题的 xz 5.6.0 和 5.6.1 版本。
一些其它项目也开始讨论是否应当减少第三方依赖来避免此类供应链攻击9。
参考资料
@thesamesam
的总结: xz-utils backdoor situation (CVE-2024-3094) · GitHub- Evan Boehs: Everything I Know About the XZ Backdoor
- Openwall 邮件列表: oss-security - backdoor in upstream xz/liblzma leading to ssh server compromise
- The Tukaani Project: XZ Utils backdoor
@smx-smx
对后门二进制文件进行逆向分析: [WIP] XZ Backdoor Analysis and symbol mapping · GitHub
首次提交
bad-3-corrupt_lzma2.xz
的日期为 Fri, 23 Feb 2024。 ↩︎参考 Web Archive 缓存 - xz 5.6.0 发布信息 ↩︎
参考 Web Archive 缓存 - xz 5.6.1 发布信息 ↩︎
oss-security - backdoor in upstream xz/liblzma leading to ssh server compromise ↩︎
binutils 邮件列表: Remove dependency on libjansson ↩︎