3 月 29 日,据报道,在 XZ Utils 中检测到了允许未经授权的远程 SSH 访问的恶意代码,XZ Utils 是主要 Linux 发行版中广泛使用的软件包(最初托管于此的GitHub 项目现已暂停)。幸运的是,OSS 社区很快发现了该恶意代码,并且仅感染了该软件包的两个最新版本,即上个月发布的 5.6.0 和 5.6.1。大多数 Linux 发行版的稳定版本均未受到影响。
受影响的 XZ Utils 版本附带的复杂恶意负载与 OpenSSH 服务器(SSHD)在相同的进程中运行,并修改了 OpenSSH 服务器中的解密例程,以允许特定的远程攻击者(拥有特定的私钥)通过 SSH 发送任意负载,这些负载将在身份验证步骤之前执行,从而有效地劫持整个受害机器。
这次供应链攻击震惊了 OSS 社区,因为 XZ Utils 被认为是一个值得信赖且经过严格审查的项目。攻击者在多年的时间里建立了作为 OSS 开发人员的可靠声誉,并使用高度混淆的代码来逃避代码审查的检测。在我们最初的研究交流之后,这篇文章将详细介绍其基本原理和影响。
-
谁受到 CVE-2024-3094 的影响? -
如何检测 CVE-2024-3094 -
如何修复 CVE-2024-3094 -
用于检测 CVE-2024-3094 的 JFrog OSS 工具 -
CVE-2024-3094 技术分析 -
JFrog 平台是否受到 CVE-2024-3094 的影响? -
柯南是否受到 CVE-2024-3094 的影响? -
使用 JFrog Xray 检测并解决 CVE-2024-3094
谁受到 CVE-2024-3094 的影响?
以下发行版受到了此次攻击的影响——
分配 | 受影响的分支 | 受影响的软件包 | 补救措施 | 评论 |
---|---|---|---|---|
Fedora | 40、41、Rawhide(积极开发) | xz-5.6.0-xz-5.6.1- | Fedora 40 – 更新到最新版本(5.4.x)。Fedora 41 和 Rawhide – 立即停止使用。 | |
Debian | 测试,不稳定(sid),实验 | xz-utils 5.5.1alpha-0.1(2024-02-01 上传),最高至 5.6.1-1 | 更新至最新版本(5.6.1+really5.4.5-1) | 不影响稳定分支 |
高山 | Edge(积极开发) | xz 5.6.1-r0、5.6.1-r1 | 更新至最新版本(5.6.1-r2) | 不影响稳定分支 |
时间 | 不适用 | xz-utils 5.6.0-0.2(Kali 安装于 3 月 26 日至 3 月 29 日之间更新) | 更新至最新版本(5.6.1+really5.4.5-1) | |
OpenSUSE | 风滚草 | xz-5.6.0、xz-5.6.1 | 更新至最新版本(5.6.1.revertto5.4) | |
Arch Linux | 不适用 | 繁體中文 | 更新至最新版本(5.6.1-2) |
以下发行版不受影响-
分配 | 受影响的分支 | 受影响的软件包 | 补救措施 | 评论 |
---|---|---|---|---|
红帽企业 Linux | 不适用 | 不适用 | 不适用 | Red Hat Enterprise Linux (RHEL) 的任何版本均不受影响。 |
Ubuntu | 不适用 | 不适用 | 不适用 | 受影响的 xz-utils 版本仅在 noble-proposed 中,并且在迁移到贵族之前已被删除。 |
亚马逊 Linux | 不适用 | 不适用 | 不适用 | |
沃尔菲 | 不适用 | 不适用 | 不适用 | 受影响的 liblzma 版本曾短暂可用(现已恢复),但 Wolfi 的 OpenSSH 不链接到 liblzma,因此不受影响。 |
Gentoo | 不适用 | xz-utils 5.6.0,xz-utils 5.6.1 | 更新至最新版本(恢复 5.4.2) | 尽管 Gentoo 撤下了存在漏洞的版本,但它并不受影响,因为其 OpenSSH 尚未修补以与 systemd-notify 配合使用,而这是后门的先决条件。 |
如何检测 CVE-2024-3094
检查你的“xz”版本是否是受影响的版本之一(5.6.0 或 5.6.1,见上表),运行以下命令:
strings `which xz` | grep '5.6.[01]'
易受攻击的输出示例 –
$ strings `which xz` | grep '5.6.[01]'
xz (XZ Utils) 5.6.1
安全输出示例 –
$ strings `which xz` | grep '5.6.[01]'
xz --version
请注意,在 Alpine Linux(边缘分支)中,即使在修复版本(5.6.1-r2)上,输出也是“5.6.1” –
可以使用 Alpine 软件包管理器来验证确切的版本 –
$ apk list xz
xz-5.6.1-r2 x86_64 {xz} ...
如何修复 CVE-2024-3094
立即将您的 xz 版本降级为早期版本(5.4.6 是大多数发行版中最新的不受影响的版本)。
降级 xz 后,请重新启动计算机或重新启动 OpenSSH 服务器,以便从内存中删除修补的代码 -
sudo systemctl restart ssh
如果无法升级,另一个可能的解决方法是利用后门的“终止开关”。添加以下字符串/etc/environment
将禁用恶意后门功能(重新启动 SSH 和 Systemd 后生效)–
yolAbejyiejuvnup=Evjtgvsh5okmkAvj
用于检测 CVE-2024-3094 的 JFrog OSS 工具
JFrog 研究团队发布了针对 CVE-2024-3094 的开源检测器。
该工具检查本地机器是否容易受到 CVE-2024-3094 攻击(SSH 负载能够运行)以及当前是否受到 CVE-2024-3094 的影响(当前安装了恶意版本的 XZ)。
4 月 2 日更新 –
-
我们修复了 Github 上报告的该工具的几个问题。 -
添加了贡献代码来检测 Arch Linux 中的恶意版本。 -
增加了另一种检测恶意 liblzma 的方法,即查找恶意软件在运行时解密并使用的加密字符串,例如 yolAbejyiejuvnup=Evjtgvsh5okmkAvj
和Shutdown
。在我们分析过的大多数恶意 liblzma 版本中,这些字符串都可以在 .rodata 部分中找到。
CVE-2024-3094 技术分析
CVE-2024-3094 的恶意负载是什么?
TL;DR – CVE-2024-3094 引入的恶意后门的最终目标是向受害者机器上运行的 OpenSSH 服务器 (SSHD) 注入代码,并允许特定的远程攻击者(拥有特定私钥)执行以下任一操作 –
1. 通过 SSH 发送任意有效负载,该负载将在身份验证步骤之前执行 ,或者 2. 绕过基于 SSH 密码的身份验证(攻击者可以使用任何密码登录)
这两种能力都能有效劫持整个受害机器。
后门载荷仍在分析中,但根据初步分析、初始开源工具和技术推文,该载荷似乎非常复杂——
-
有效载荷被注入到 OpenSSH 服务器( sshd
进程)中,因为liblzma
(包含恶意代码)是 OpenSSH 某些版本的依赖项。 -
有效载荷挂钩该 RSA_public_decrypt
函数,该函数最初用于验证 RSA 签名。 -
恶意钩子代码检查 RSA
在 RSA 结构(的第 4 个参数RSA_public_decrypt
)中传递的公共模数(“N”值)。请注意,此模数完全由连接的 SSH 客户端(在我们的例子中是攻击者)控制。 -
恶意钩子代码检查“N”值的前 16 个字节,这些字节用于简单计算以得出 0 到 3 之间的“命令号”。命令号设置后门的当前操作 – – 命令 0x00 – 未知 – 命令 0x01 – SSH 身份验证绕过– 命令 0x02 – 执行 shell 命令 – 命令 0x03 – 使用指定的 UID/GID 执行 shell 命令 -
然后,恶意挂钩代码使用 ChaCha20 对称流密码和硬编码解密密钥解密“N”值的最后 240 个字节 - 由于这是一个对称的硬编码密钥,因此可以使用它来解密真实世界攻击尝试的网络捕获,以了解攻击者向受害者发送了哪些命令。 0a 31 fd 3b 2f 1f c6 92 92 68 32 52 c8 c1 ac 2834 d1 f2 c9 75 c4 76 5e b1 f6 88 58 88 93 3e 48
-
解密数据包含 114 字节的签名,使用Ed448 非对称椭圆曲线签名算法检查其有效性,具体使用以下 Ed448 公钥 -虽然公钥是众所周知的,但只有攻击者拥有相应的 Ed448 私钥签名密钥,确保只有攻击者才能为后门生成有效的有效载荷。此外,签名与主机的公钥绑定,这意味着一个主机的有效签名不能在其他主机上重复使用。 0a 31 fd 3b 2f 1f c6 92 92 68 32 52 c8 c1 ac 2834 d1 f2 c9 75 c4 76 5e b1 f6 88 58 88 93 3e 4810 0c b0 6c 3a be 14 ee 89 55 d2 45 00 c7 7f 6e20 d3 2c 60 2b 2c 6d 31 00
-
如果签名被验证为有效,后门将使用签名字节后面的字节作为命令特定的有效载荷数据。例如,在命令 0x02 中,有效载荷字节包含一个以 NULL 结尾的 shell 命令字符串(例如 cat /etc/shadow
),该字符串直接传递给system() -
如果数据以任何方式无效(格式错误的有效负载、无效签名),则以 RSA_public_decrypt
透明方式恢复原来的实现。这意味着除了攻击者之外,任何人都无法通过网络检测到易受攻击的机器。
这次攻击的复杂性质以及高度面向未来的加密算法(Ed448 与更标准的 Ed25519)的使用使得许多人相信这次攻击可能是国家级别的网络攻击。
研究人员发布了一个初始后门客户端,该客户端允许向受 CVE-2024-3094 影响的机器发送有效载荷(shell 命令),前提是该后门的 Ed448 私有签名密钥。由于原始 Ed448 私有签名密钥不为公众所知,因此该工具主要用于研究目的(用于修补后门版本,其中 Ed448 公钥已被具有已知私钥的密钥对替换)
袭击时间表
此次供应链攻击最引人注目的地方,就是攻击者极度的奉献精神,他们花了两年多的时间才成为合法的维护者,主动承担各种 OSS 项目的工作,并在多个项目中提交代码,以避免被发现。
2021 年– GitHub 用户 Jia Tan (JiaT75) 帐户创建。2021 年开始为多个项目做出贡献,共提交了 546 次,其中最可疑的是提交给libarchive。有关此提交的更详细说明,请参见下文。
2022 年 2 月 6 日– JiaT75 向 XZ repo 提交了第一个(合法)提交。该提交为 LZMA 和 LZMA2 编码器添加了参数验证。
为 LZMA 和 LZMA2 编码器添加参数验证
2022 年 11 月 30 日- XZ Utils 的创建者和迄今为止的唯一维护者 Lasse Collins将错误报告电子邮件更改为别名,将电子邮件重定向给他和 Jia Tan。
2023 年 1 月 11 日——Lasse Collins发布他的最终版本 5.4.1。
2023 年 3 月 18 日– Jia Tan构建并发布了其第一个版本 5.4.2。
2023 年 6 月 27-28 日- 对 XZ Utils 进行了一系列更改,可能为攻击奠定了基础。在这些更改中,添加了对 crc64_fast.c 的 ifunc 实现的支持。
向 XZ Utils 引入 ifunc 实现
有趣的是,这个补丁是由该软件包的原始维护者 Lasse Collin 引入的,他将此补丁的另一位贡献者 Hans Jansen 归功于他。根据 Andres Freund 的分析,这种 ifunc 实现可能是后门运作的方式之一。
2023 年 7 月 8 日– JiaT75在 oss-fuzz 中打开了一个 Pull 请求,该项目对 XZ 和许多其他 OSS 项目进行模糊测试。PR 禁用了 ifunc 模糊测试,从而有效地阻止了 oss-fuzz 发现在 XZ 中所做的恶意更改。
2024 年 2 月 15 日– JiaT75通过其 .gitignore 文件在 XZ 存储库中添加了 build-to-host.m4 的忽略规则。此脚本文件即将包含在实际发布包中,在软件包构建期间执行,并包含恶意 M4 宏,可初始化受害者机器上的后门安装。
2024 年 2 月 23 日– JiaT75在 XZ 存储库中的两个测试文件中添加了混淆的二进制后门–
-
测试/文件/bad-3-corrupt_lzma2.xz -
测试/文件/good-large_compressed.lzma
2024 年 2 月 24 日– JiaT75 发布带有恶意 build-to-host.m4 的 5.6.0 版本。在此阶段,恶意负载已完全投入使用(任何后续 XZ 版本都受到威胁) 。Debian 、Gentoo和Arch Linux已提取恶意 xz-utils 5.6.0 版本。
2024 年 2 月 27 日– Fedora撤下了恶意 xz-utils 版本 5.6.0 。
2024 年 3 月 5 日– openSUSE撤下恶意 xz-utils 版本 5.6.0 。
2024 年 3 月 9 日– JiaT75 将后门的二进制文件更新为改进版本,并发布版本 5.6.1。恶意 xz-utils 版本 5.6.1被Fedora、Gentoo和Arch Linux拉取
2024 年 3 月 10 日– openSUSE撤下恶意 xz-utils 版本 5.6.1 。
2024 年 3 月 11 日– Alpine提取恶意 xz-utils 版本 5.6.1 。
2024 年 3 月 26 日– Debian拉取恶意 xz-utils 版本 5.6.1 。
2024 年 3 月 29 日- Andres Freund在oss-security 邮件列表中发布了在 XZ utils 中发现的恶意活动的详细说明。
2024 年 3 月 30 日——xz-utils 原维护者 Lasse Collins就该项目的违规行为发布了官方声明。
* 我们对此时间线所做的一些补充是基于Russ Cox 的研究。
只有 XZ 受到恶意行为者的影响吗?
虽然仅在 XZ 项目中检测到了恶意代码,但攻击者帐户的其他代码贡献目前正在调查中。截至目前,以下项目中添加了一些值得注意的可疑代码:
库档案:
2021 年,JiaT75 向 libarchive 存储库提交了一个拉取请求,标题为“使用 bsdtar 解压时向警告添加了错误文本”,乍一看似乎是合法的。然而,经过仔细检查,发现此拉取请求中的代码将安全函数 safe_fprintf() 替换为不安全版本 fprintf(),可能会引入字符转义漏洞。目前正在调查此更改的安全影响,因为它们尚不清楚。但是,由于恶意行为者参与了此代码修改,因此可以合理地假设在本次调查中可能存在更复杂的攻击。字符转义的 PoC 已经发布:
mikesiegel 的 PoC
对此漏洞的修复已引入到 libarchive 主分支,但在撰写本文时尚未作为版本更新发布。
oss-模糊:
2023 年初,JiaT75将 Google oss-fuzz 工具中 XZ 项目的主要电子邮件地址更改为他自己的个人 Gmail 地址。这表明他们可能希望先向他们报告在 Project XZ 中发现的漏洞,以便他们知道何时发现他们的恶意行为——
2023 年下半年,他们又发起了一次 PR,以禁用 XZ 项目的模糊器配置中的“间接函数支持”。这似乎是为他们稍后要添加到 XZ 项目中的后门做准备,以防止被模糊器检测到——
目前, XZ和liblzma的模糊测试器均被 oss-fuzz 维护人员禁用。
JFrog 平台是否受到 CVE-2024-3094 的影响?
JFrog 不受 CVE-2024-3094 的影响,因为其任何产品均未使用易受攻击的 xz_utils 版本。
柯南是否受到 CVE-2024-3094 的影响?
截至 3 月 30 日,包含易受攻击的 xz_utils 版本的配方已从 Conan Center 中删除。
此外,依赖于受影响的 xz_utils 版本(cpython 和 libunwind)的配方已恢复为需要最新的安全版本的 xz_utils。
使用 JFrog Xray 检测并解决 CVE-2024-3094
JFrog Security Essentials (Xray)可用于识别整个代码库和编译工件(包括 Docker 容器、存储库包甚至独立二进制文件)中的每个漏洞事件。
JFrog Xray 可用于扫描二进制文件以检测受影响的库 -
原文始发于微信公众号(红云谈安全):CVE-2024-3094 XZ 后门:您需要了解的一切
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论