2024 年 3 月 29 日,Openwall OSS-security 邮件列表上的一条消息标志着信息安全、开源和 Linux 社区的一个重要发现:在 XZ 中发现了恶意后门。XZ 是集成到许多流行 Linux 发行版中的压缩工具。
后门库的特殊危险在于其被 OpenSSH 服务器进程 sshd 使用。在包括 Ubuntu、Debian 和 RedHat/Fedora Linux 在内的几个 systemd 基础发行版中,OpenSSH 被修补以使用 systemd 功能,因此依赖此库(注意 Arch Linux 和 Gentoo 不受影响)。攻击者的最终目标很可能是向 sshd 引入远程代码执行功能,而其他人无法使用。
后门在 liblzma 库中分两个层次引入。生成最终包的构建基础设施的源代码被稍微修改(通过引入额外的文件 build-to-host.m4),以提取隐藏在测试用例文件(bad-3-corrupt_lzma2.xz)中的下一阶段脚本。这些脚本又从另一个测试用例文件(good-large_compressed.lzma)中提取恶意二进制组件,该文件在编译过程中与合法库链接并发送到 Linux 存储库。主要供应商随后在测试版和实验版中发送了恶意组件。XZ Utils 的妥协被分配为 CVE-2024–3094,最高严重程度得分为 10。
事件时间表
2024.01.19:XZ 网站由新维护者(jiaT75)移至 GitHub 页面
2024.02.15:“build-to-host.m4”被添加到.gitignore
2024.02.23:引入包含恶意脚本阶段的两个“测试文件”
2024.02.24:XZ 5.6.0 发布
2024.02.26:CMakeLists.txt 中的提交破坏了 Landlock 安全功能
2024.03.04:后门导致 Valgrind 出现问题
2024.03.09:两个“测试文件”更新,CRC 函数修改,Valgrind 问题“修复”
2024.03.09:XZ 5.6.1 发布
2024.03.28:发现漏洞,通知 Debian 和 RedHat
2024.03.28:Debian 将 XZ 5.6.1 回滚到 5.4.5-0.2 版本
2024.03.29:在 OSS-security 邮件列表上发布电子邮件
2024.03.29:RedHat 确认在 Fedora Rawhide 和 Fedora Linux 40 测试版中发送了被植入后门的 XZ
2024.03.30:Debian 停止构建并开始重建过程
2024.04.02:XZ 主要开发人员承认后门事件
被植入后门的源发行版
xz-5.6.0、xz-5.6.1
初始感染分析
XZ git 存储库包含一组测试文件,用于在测试压缩/解压缩代码时验证其是否正常工作。名为 Jia Tan 或“jiaT75”的账户提交了两个最初看似无害的测试文件,但作为植入后门的引导程序。
相关文件为:
- bad-3-corrupt_lzma2.xz
good-large_compressed.lzma
这些文件本应包含 shell 脚本和后门二进制对象本身,但隐藏在格式错误的数据中,攻击者知道何时需要正确提取它们。第一阶段 - 修改后的 build-to-host 脚本
XZ 发布准备好后,官方 Github 存储库分发项目的源文件。最初,存储库上的这些发布除了包含恶意测试文件外是无害的,因为它们没有机会执行。但攻击者似乎只在从 https://xz.tukaani.org 源获取发布时添加了引导感染的恶意代码,该网站由 Jia Tan 控制。
此 URL 被大多数发行版使用,下载时带有一个名为 build-to-host.m4 的文件,其中包含恶意代码。
build-to-host.m4 中的代码在构建过程中执行,执行一行代码来修复和解压缩添加到测试文件夹中的第一个文件。第二阶段 - 注入的 shell 脚本
恶意.m4 文件注入的恶意脚本验证它在 Linux 机器上运行,并且在预期的构建过程中运行。
它使用 good-large_compressed.lzma 来执行下一阶段,该文件使用 XZ 正确压缩,但在解压缩数据中包含垃圾数据。
最后阶段的 shell 脚本执行许多检查,以确保在预期环境中运行,例如项目是否配置为使用 IFUNC。它还提取后门二进制代码本身,一个隐藏在 same good-large_compressed.lzma 文件中的对象文件,但在不同的偏移量处。二进制后门分析
隐身加载场景
在原始 XZ 代码中,有两个特殊函数用于计算给定数据的 CRC:lzma_crc32 和 lzma_crc64,它们都以 IFUNC 类型存储在 ELF 符号表中。IFUNC 允许开发人员动态选择要使用的正确函数,选择在动态链接器加载共享库时发生,后门利用此机会加载自己。
后门代码分析
后门代码初始时被调用两次,实际恶意活动在 lzma_crc64 IFUNC 调用_get_cpuid 时开始,它初始化一些结构,找到 GOT 地址,交换主恶意函数的指针并调用它。
核心行为
后门的主要目标是成功挂钩特定函数,以监控到感染机器的每个连接,包括 RSA_public_decrypt、EVP_PKEY_set1_RSA、RSA_get0_key 等,但挂钩这些函数并不简单,需要访问许多内部结构并避免被分析。
执行环境检查
它解析 ld-linux(动态链接器),提取环境信息并验证当前进程是否为/usr/bin/sshd 以及是否存在 kill 开关。
字典树结构
后门使用字典树结构进行字符串操作,通过 trie 查找来匹配特定常量。
符号解析器
后门使用至少三个符号解析器例程来定位 ELF 符号结构,搜索许多来自 libcrypto 的函数,并使用 fake allocator 结构进行符号解析。
Symbind 挂钩
后门利用 rtdl-audit 功能,对内存中已注册的接口进行运行时补丁,劫持符号解析例程,实现挂钩。
结论
本文涵盖了对 liblzma(XZ)的后门植入过程,并深入分析了二进制后门代码,达到了挂钩的主要目标,此后门复杂且采用多种方法逃避检测,Kaspersky 产品可检测相关恶意对象。
妥协指标
Yara 规则
规则 liblzma_get_cpuid_function 用于查找恶意 get_cpuid 函数 CVE-2024-3094
已知被植入后门的库
Debian Sid 中的 liblzma.so.5.6.0 和 liblzma.so.5.6.1 及相关文件
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。