新智元报道
编辑:好困 Aeneas
这个周末,开源软件 xz 后门事件,直接引发了安全界地震!一段恶意代码被悄悄植入了,险些波及各大 Linux 系统。好在,或许是因为攻击者疏忽了,目前并未造成严重后果。但如果后门没被及时发现 ,结果将是灾难性的……
整个周末,开源软件 xz 被植入后门事件,引发了安全界的轩然大波。
研究人员惊恐地发现,在包括 Red Hat 和 Debian 在内的多个广泛使用的 Linux 版本中,一款压缩工具被悄悄植入了恶意代码!
微软的安全研究员 Andres Freund 首次报告了这件事。
他发现,在这款名为 xz Utils 的工具的 5.6.0 和 5.6.1 版本中,都含有恶意代码。
而且,这段恶意代码极其复杂难解。
扒着扒着人们发现,这段代码是由一位名为 Jia Tan 的用户(JiaT75),通过四次代码变更(也即在 GitHub 上「提交」)的方式,植入到了 Tukaani 项目中。
这样,攻击者即使没有有效账号,也可以直接从 SSHD 访问系统了。
(SSHD 是一个关键的二进制文件,负责 SSH 连接的工作。)
目前,GitHub 已经禁用 XZ Utils 代码库,且还未收到漏洞被利用的报告
好在,这个后门已经及时被发现了。目前 GitHub 已经以违反服务条款为由,禁用了 Tukaani 项目维护的 XZ Utils 代码库。
然而可怕的是,如果这个后门的漏洞很巧妙,技术很高超,那么 xz 被广泛引入各 Linux 发行版后,这些 Linux 系统就会轻易被入侵!
这件事情可能导致的可怕后果,让安全社区对此掀起了经久不息的讨论。
一场灾难被避免了
好在证据显示,这些软件包只存在于 Fedora 41 和 Fedora Rawhide 中,并不影响 Red Hat Enterprise Linux (RHEL)、Debian Stable、Amazon Linux 以及 SUSE Linux Enterprise 和 Leap 等主流 Linux 版本。
但 Red Hat 和 Debian 已经报告称,最近发布的测试版中的确使用了这些被植入后门的版本,特别是在 Fedora Rawhide 和 Debian 的测试、不稳定及实验版本中。
同样,Arch Linux 的一个稳定版本也受到了影响,不过,该版本也并未应用于实际生产系统中。
另外还有一些读者报告称,macOS 的 HomeBrew 包管理器中包含的多个应用,都依赖于被植入后门的 5.6.1 版本 xz Utils。目前,HomeBrew 已经将该工具回滚至 5.4.6 版本。
安全公司 Analygence 的高级漏洞分析师 Will Dormann 表示,「这个问题实际上并没有对现实世界造成影响」。
但这主要是因为恶意行为者疏忽了,导致问题被发现的时机很早。就如同上文所提,如果后门没被及时发现,后果将是灾难性的。
Jia Tan 是谁?
既然事情解决了,那么问题的焦点就集中在了——Jia Tan 究竟是谁?
这位 Jia Tan,是 xz Utils 项目的两位主要开发者之一,对该项目贡献良多。
Freund 其报告中指出,「考虑到这几周内的活动情况,这位提交者要么是直接涉及,要么其系统遭受了严重的安全威胁。」
不幸的是,种种迹象表明,后一种可能性似乎并不大。
所以,这次 xz 被植入后门事件,很可能就是 Jia Tan 的主观恶意行为。
上周四,有人冒用了这位开发者的名字,在 Ubuntu 的开发者社区中请求将含后门的 5.6.1 版本纳入正式发布,理由是它修复了一个导致 Valgrind 工具出错的问题。
还有人发现,近几周这位开发者也向他们提出了类似的请求,希望在 Fedora 40 的测试版本中使用这个带有后门的工具版本。
「我们甚至还帮助他解决了 Valgrind 的问题(而现在看来,这个问题正是由他加入的后门引起的),」Ubuntu 的维护人员说。
「他已经在 xz 项目中工作了两年,添加了各种各样的测试文件,鉴于这种复杂的操作,我们对 xz 的早期版本也持怀疑态度,直到后来,它们被证明是安全的。」
后门技术分析
简单来说,CVE-2024-3094 引入的这个后门,是为了在受害者的 OpenSSH 服务器(SSHD)中注入恶意代码,从而让远程攻击者(持有特定私钥)能够通过 SSH 发送任意代码,并在认证步骤之前执行,进而有效控制受害者的整台机器。
尽管具体的内容仍在分析当中,但初步分析表明,它的设计相当复杂:
后门代码被注入到 OpenSSH 服务器(sshd 进程),因为 liblzma(含有恶意代码)是某些 OpenSSH 版本的依赖项。
后门劫持了 RSA_public_decrypt 函数,这个函数原本用于验证 RSA 签名。
恶意代码会检查 RSA 结构中传入的公共模数(「N」值),这个模数完全受到攻击者控制。
恶意代码使用硬编码的密钥(采用 ChaCha20 对称加密算法)对「N」值进行解密。
解密后的数据通过 Ed448 椭圆曲线签名算法进行有效性验证。由于这是一种非对称签名算法,后门只包含了公钥,这意味着只有攻击者能够为后门生成有效载荷。此外,这个签名与主机的公钥绑定,因此一个主机上的有效签名不能在其他主机上使用。
如果数据有效,该有效载荷将以 shell 命令的形式被执行。
如果数据无效(有效载荷格式不正确或签名无效),则会透明地恢复到 RSA_public_decrypt 的原始实现。这意味着,除了攻击者之外,是无法通过网络发现易受攻击的机器的。
「卧薪尝胆」三年
这次最令人印象深刻的,是攻击者超乎寻常的耐心和决心。
攻击者花费了两年多的时间,通过参与各种开源软件项目并提交代码,逐步建立起作为一个可信任维护者的形象,以此来避免被发现。
2021 年,一个名为 Jia Tan(GitHub 用户名:JiaT75)的用户创建了 GitHub 账户,并开始为多个项目做出贡献。
在那一年,Jia Tan 共提交了 546 次代码,其中对 libarchive 项目的一次提交尤其引起了人们的关注。
2022 年 2 月 6 日,Jia Tan 在 XZ 项目中做出了他的第一次正式提交,这次提交增加了对 LZMA 和 LZMA2 编码器的参数验证功能。
2023 年 6 月 27 日至 28 日,Jia Tan 对 XZ Utils 项目进行了一系列关键的更改,从而为后续的攻击做好了准备。
特别是,项目中的一个文件 crc64_fast.c,新增了对一种名为 ifunc 的技术的支持。
根据安全研究员 Andres Freund 的分析,引入的这种 ifunc 技术可能是潜在后门功能的一部分,显示了攻击者可能利用的一种手段。
此外,值得注意的是,这个重要更新是由项目的原始维护人 Lasse Collin 引入的,并且他特别提到了另一位贡献者 Hans Jansen 对这一更新的贡献。
2023 年 7 月 8 日,JiaT75 在 oss-fuzz 项目中提交了一个请求,该项目负责对 XZ 等多个开源软件项目进行自动错误检测。这个请求实际上关闭了一种特定的错误检测方式,从而防止 oss-fuzz 发现 XZ 项目中潜藏的恶意代码。
2024 年 2 月 15 日,JiaT75 通过修改 XZ 项目的配置文件,加入了一个规则来忽略特定的脚本文件 build-to-host.m4。
很快,这个脚本就被包含在了项目的正式发布版本中——它会在构建过程中执行,并植入一段负责在受害者电脑上安装后门的恶意代码。
2024 年 2 月 23 日,JiaT75 在 XZ 项目的测试文件夹中加入了两个含有隐藏后门的测试文件。
2024 年 2 月 24 日,JiaT75 发布了包含恶意脚本文件的新版本 5.6.0,也就是说任何使用了这个版本及以后版本的 XZ 都存在安全风险。
2024 年 2 月 27 日,这个带有安全隐患的版本被 Fedora 采纳。
2024 年 3 月 9 日,JiaT75 更新了后门程序,发布了版本 5.6.1,Fedora 同样更新了这个版本。
2024 年 3 月 29 日,安全研究员 Andres Freund 在 oss-security 邮件列表上公布了他对 XZ 项目中发现的恶意行为的详细分析。
还有更多受害者
虽然恶意代码仅在 XZ 项目中被检测到,但攻击者账户的其他代码贡献目前也在调查中。
截至今日,一些项目已经被发现添加了可疑代码:
libarchive
2021 年,JiaT75 向 libarchive 代码库提交了一个名为「在使用 bsdtar 解压时添加错误提示文本」的合并请求,乍看之下似乎没什么问题。
但仔细一看,这个合并请求中的代码把原本安全的函数 safe_fprintf ()换成了更危险的 fprintf ()函数,这一改动可能会导致字符逃逸的安全漏洞。
oss-fuzz
2023 年初,JiaT75 把 XZ 项目在 Google 的 oss-fuzz 工具上注册的主邮箱改为了他个人的 Gmail 邮箱。
这一行为似乎暗示,他们想要第一时间接收到 XZ 项目中发现的漏洞报告,以此来及时知晓自己的恶意操作被揭露的情况。
2023 年末,他们提交了一个新的合并请求(Pull Request),目的是在 XZ 项目的 fuzzer 配置中禁用「间接函数支持(Indirect function support)」。
这一操作似乎可以防止被 fuzzer 探测到,从而为在 XZ 项目中植入的后门做好铺垫。
参考资料:
https://jfrog.com/blog/xz-backdoor-attack-cve-2024-3094-all-you-need-to-know/