事件概述
xz
是一种几乎存在于所有
Linux
发行版中的通用数据压缩格式。从5.6.0版本开始,在
xz
的上游
tarball
包中被发现了恶意代码,通过一系列复杂的混淆手段,
liblzma
的构建过程从伪装成测试文件的源代码中提取出预构建的目标文件,然后用它来修改
liblzma
代码中的特定函数。这导致生成了一个被修改过的
liblzma
库,任何链接此库的软件都可能使用它,从而拦截并修改与此库的数据交互。
3月29日,微软
PostgreSQL
开发人员
Andres Freund
在调试
SSH
性能问题时,在开源安全邮件列表中发帖称,他在
XZ
软件包中发现了一个涉及混淆恶意代码的供应链攻击。据
Freun
d和
RedHat
称,
Git
版
XZ
中没有恶意代码,只有完整下载包中存在。但是这个代码的提交人两年前就加入了项目维护,暂时不能确定之前的版本有没有问题。
xz 5.6.0
和
5.6.1
版本库中存在的恶意注入只包含在
tarball
下载包中。
Git
发行版中缺少触发恶意代码构建的
M4
宏。注入期间构建时使用的第二阶段工件存在于
Git
存储库中,以防存在恶意的
M4
宏。如果不合并到构建中,第二阶段文件是无害的。在发现者的演示中,发现它干扰了
OpenSSH
守护进程。虽然
OpenSSH
没有直接链接到
liblzma
库,但它以一种使其暴露于恶意软件的方式与
systemd
通信,而
systemd
链接到了
liblzma
。恶意构建会通过
systemd
干扰
sshd
的认证。在一定的情况下,这种干扰有可能使恶意行为体破坏
ssh
认证,并远程未经授权访问整个系统。
截至日前(3月30日),暂未观察到利用此后门代码的行为。
image-20240330165828337
影响的系统范围
xz
和
liblzma 5.6.0~5.6.1
版本,可能包括的发行版 / 包管理系统有:
如果你的系统使用
systemd
启动
OpenSSH
服务,你的
SSH
认证过程可能被攻击。非
x86-64
架构的系统不受影响。
if ! (echo "$build " | grep -Eq "^x86_64" > /dev/null 2>&1) && (echo "$build " | grep -Eq "linux-gnu$" > /dev/null 2>&1);then
你可以在命令行输入
xz --version
来检查
xz
版本,如果输出为
5.6.0
或
5.6.1
,说明你的
xz-utils
已被植入后门。
$ xz --version xz (XZ Utils) 5.6.1 liblzma 5.6.1
目前迹象表明,后门作者有选择性的针对
linux
发行版下手。但这个
liblzma
可不只
Linux
上用。比如目前流行的
iOS
越狱环境,大部分
tweak
包还是以
.deb
格式发行,比较新的版本就用到了
lzma
作为压缩。除此之外,近期有在
macOS
上使用
brew
安装过
xz
这个包也受影响,暂时不能证明有恶意行为:
image-20240330170102458
过程精彩如谍战片
这可能是最大胆的信息安全事件之一。“最大胆”表明这起事件在手法、规模、影响等方面都超出了我们以往对于攻击的认知,可能是一个全新的安全威胁模型。
"最大胆"一词还隐含着对攻击者心理和技术实力的一种评价。做出如此"大胆"之举的,肯定是心理素质极强、技术水平极高、准备极其缜密的黑客团伙,绝非一般的脚本小子可以企及。
1、一个不知名团伙注意到
OpenSSH
依赖一个名为
liblzma(xz)
的小众开源压缩库。
2、他们虚构了一个名为"Jia Tan"的开发者身份,从2021年10月开始为
xz
项目积极做贡献,逐渐获得信任,并最终接管了维护工作。
3、2024年2月,"Jia"在构建脚本中引入了一个复杂隐蔽的后门,该后门似乎针对
OpenSSH
的身份验证前加密功能,可能添加了"主密钥"让攻击者随意访问受影响服务器。
4、 "Jia"联系
Linux
发行版维护者,试图让带后门的
xz
库被打包分发给用户,直到微软员工
Andres Freund
因调查
SSH
延迟问题发现了此事。
这可能是一次有外国政府支持的职业行动,而非业余爱好者所为。更根本的是,
xz
后门不是一个技术问题,可能也不能单靠技术来解决。归根结底,这是一个反情报挑战——完全属于政府和少数拥有生态系统范围监控能力的商业实体的能力范畴。这尤其包括谷歌和微软。事实上,这里有一个有趣的想法:也许他们已经知道了很长一段时间。我们能分辨出这是为了掩盖"手段和来源"而精心设计的披露,还是偶然发现的吗?
检测和解决方法
解决方法:
• 降级到5.6.0以下版本
• 更新到官方最新版5.6.4
检测脚本:
#! /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 f30f1efa554889f54c89ce5389fb81e7000000804883ec28488954241848894c2410then echo probably vulnerableelse echo probably not vulnerablefi