谁也没想到, Xz/liblzma会被植入后门程序,据说微软连夜加班处理本次后门事件,主流云厂商们也都在加急排查风险和安全修复。
3月29日,微软公司的开发人员Andres Freund在调查SSH性能问题时,发现了xz软件包中一个涉及混淆恶意代码的供应链攻击。进一步溯源发现SSH使用的上游liblzma库被植入了后门代码,恶意代码可能允许攻击者通过后门版本的SSH非授权获取系统的访问权限。恶意代码修改了liblzma代码中的函数,该代码是XZ Utils软件包的一部分,链接到 XZ 库的任何软件都可以使用此修改后的代码,并允许拦截和修改与该库一起使用的数据。
目前迹象表明,后门作者有选择性地针对 linux 发行版下手。但这个 liblzma 可不只Linux上用。比如目前流行的iOS越狱环境,大部分 tweak 包还是以 .deb 格式发行,比较新的版本就用到了 lzma 作为压缩。
后门事件回顾
xz是一种通用的数据压缩格式,几乎存在于每个Linux发行版中,无论是社区项目还是商业产品发行版。本质上,它有助于将大型文件格式压缩(然后解压缩)成较小、更易于管理的尺寸,以便通过文件传输共享。
从5.6.0版本开始,在xz的上游tarball包中发现了恶意代码。通过一系列复杂的混淆手段,liblzma的构建过程从伪装成测试文件的源代码中提取出预构建的目标文件,然后用它来修改liblzma代码中的特定函数。这导致生成了一个被修改过的liblzma库,任何链接此库的软件都可能使用它,从而拦截并修改与此库的数据交互。
xz 5.6.0和5.6.1版本库中存在的恶意注入只包含在tarball下载包中。Git发行版中缺少触发恶意代码构建的M4宏。注入期间构建时使用的第二阶段工件存在于Git存储库中,以防存在恶意的M4宏。如果不合并到构建中,第二阶段文件是无害的。在发现者的演示中,发现它干扰了OpenSSH守护进程。虽然OpenSSH没有直接链接到liblzma库,但它以一种使其暴露于恶意软件的方式与systemd通信,因为systemd链接到了liblzma。
恶意构建会通过systemd干扰sshd的认证。SSH是一种常用的协议,用于远程连接系统,而sshd是允许访问的服务。在适当的情况下,这种干扰有可能使恶意行为体破坏sshd认证,并远程未经授权访问整个系统。
后门漏洞信息
Red Hat 现正跟踪这一供应链安全问题,将其命名为 CVE-2024-3094,并将其严重性评分定为 10分,同时在 Fedora 40 测试版中恢复使用 5.4.x 版本的 XZ。
哪些版本受影响
目前已知XZ Utils版本5.6.0和5.6.1受到影响,恶意代码还不存在于XZ的Git发行版中,仅存在于完整的下载包中。可能包括的发行版 / 包管理系统有:
以下发行版确认受影响:
以下Linux发行版确认不受影响:
自检与缓解措施
用户可通过以下脚本进行检测:
#! /bin/bash
set -eu
# find path to liblzma used by sshd
path="$(ldd $(which sshd) | grep liblzma | grep -o '/[^ ]*')"
# does it even exist?
if [ "$path" == "" ]
then
echo probably not vulnerable
exit
fi
# check for function signature
if hexdump -ve '1/1 "%.2x"' "$path" | grep -q f30f1efa554889f54c89ce5389fb81e7000000804883ec28488954241848894c2410
then
echo probably vulnerable
else
echo probably not vulnerable
fi
攻击者潜伏了整整三年
整个后门故事非常精彩,攻击者为此整整潜伏了三年,只差一点点就可以往众多 Linux发行版的 sshd 注入后门,可用于绕过密钥验证,后果不堪设想。
省流概括:
1.攻击者 JiaT75 (Jia Tan) 于2021年注册了 GitHub 账号,之后积极参与xz项目的维护,并逐渐获取信任,获得了直接 commit 代码的权利。
2.JiaT75 在最近几个月的一次 commit 中,悄悄加入了 bad-3-corrupt lzma2.xz和good-large compressed.lzma 两个看起来人畜无害的测试用二进制数据,然而在编译脚本中,在特定条件下会从这两个文件中读取内容对编译结果进行修改,致使编译结果和公开的源代码不一致。
3.目前初步的研究显示,注入的代码会使用glibc的IFUNC 去 HookOpensSH的 RSA public decrypt 函数,致使攻击者可以通过构造特定的验证数据绕过 RSA 签名验证。(具体细节还在分析中)
4.只要是同时使用了 liblzma和 OpenSsH的程序就会受到影响,最直接的目标就是 sshd,使得攻击者可以构造特定请求,绕过密钥验证远程访问。
5.受影响的 xz-utils 包已经被并入 Debian testing 中进行测试,攻击者同时也在尝试并入 fedora 和 ubuntu。
6.幸运的是,注入的代码似乎存在某种 Bug,导致特定情况下 sshd 的 CPU占用飙升。被一位安全研究人员注意到了,顺藤摸瓜发现了这个阴谋并报告给 oss-security,致使此事败露。如果不是因为这个 Bug,那么这么后门有不低的概率被并入主流发行版的stable 版本,恐怕会是一件前所未有的重大安全事件。
另外从一些细节能看出来攻击者非常用心:
攻击者抢在 ubuntu beta freeze 的几天前才尝试让新版本并入,以期望减少在测试期间被发现的时间。
xz-utils 项目的原维护者 Lasse Colin(Larhzu),有着定期进行internetbreaks的习惯,而且最近正在进行,导致这些变动他并没有review的机会,即使到现在也没能联系上他本人。这可能也是攻击者选定xz-utils 项目的原因之一。
更多的细节还在被分析中,目前 GitHub 已经关停了整个 xz项目。