XZ Utils 后门:您需要了解的一切及可采取的措施
内容提要
CVE-2024-3094 是在开源库 XZ Utils 中发现的一个漏洞,它源自于该库的一名维护人员推送到库中的恶意代码。
最初,它被报告为 SSH 身份验证绕过后门,但 进一步的分析 表明,该后门实际上可以实现远程代码执行 (RCE)。
攻击者大约在两年前开始参与 XZ 项目,逐步建立起信誉,直到获得维护人员权限。通常,只有国家资助的攻击者才会实施如此处心积虑的长期操作,但具体归因目前尚无定论。
由于该后门会影响最新的 XZ Utils 发行版本,因此建议的行动方案是降级到未被感染的发行版本。在本博文中,我们将提供一些其他可能的抵御措施来减小该攻击的影响范围。
故事背景
XZ Utils 及其底层库 liblzma 是用于实现 lzma 压缩和解压缩的开源项目。它们是很多 Linux 发行版中开箱即用的功能,非常受开发人员欢迎,并在 Linux 生态系统中得到了广泛使用 。
大约在两年前,一名自称为 Jia Tan 的开发人员加入了该项目,开始针对各种错误修复或改进创建拉取请求。到目前为止,一切都很正常;这也是开源世界的运作方式。最终,在建立起信任和信誉之后,Jia Tan 开始获得代码库的相关权限。起初是提交权限,最后获得了发布管理员权限。
在努力获取这些权限的过程中,Jia Tan 似乎采用了一种有趣的 社会工程形式:通过使用虚假帐户发送大量功能请求以及关于错误的投诉来向原维护人员施压,最终实现了增加另一名代码库维护人员的目的。
在参与该项目大约两年后,Jia Tan 于 2023 年对 XZ 进行了一些更改,这些更改包含在发行版本 5.6.0 中。这些更改中夹杂了一个复杂的后门。
该后门
该后门相当复杂。首先,您在 xz GitHub 代码库(当前已被禁用,这不在我们的讨论范围内)中找不到它。恶意维护人员只将后门部分包含在了源代码 tarball 发行版本中,而没有将其推送到公共 git 代码库,这似乎是为了避免被发现。这使得后门部分相对隐蔽,同时仍然可以在 依赖项目的构建过程中使用。
该后门包含的多个部分是通过多次提交引入的:
在构建过程中使用 IFUNC,此恶意软件使用这些函数来劫持符号解析函数
包含一个经过混淆处理的共享对象,该对象隐藏在 测试文件中
在库的构建过程中运行一个脚本集,进而提取该共享对象(该脚本集未包含在存储库中,仅包含在发行版本中,但已添加到 .gitignore中)
禁用 Landlock 安全模块,这是一项用于限制进程权限的安全功能
执行链还包含多个阶段:
恶意脚本 build-to-host.m4 在库的构建过程中运行,并将“测试”文件 bad-3-corrupt_lzma2.xz 解码为一个 bash 脚本
然后,该 bash 脚本对另一个“测试”文件 good-large_compressed.lzma执行更复杂的解码过程,将其解码为另一个脚本
然后,该脚本会提取共享对象 liblzma_la-crc64-fast.o,该对象会被添加到 liblzma 的编译过程中
无可否认,此过程难以理解。我们建议采用 Thomas Roccia的 信息图 来作为重要的视觉参考并进行深入分析。
该共享对象自身将编译到 liblzma 中,并取代正常的函数名称解析过程。在(任何)进程加载期间,函数名称会被解析为指向进程内存的实际指针,这些指针会指向二进制代码。恶意库会干扰函数解析过程,以便替换 OpenSSH 函数 RSA_public_decrypt 的函数指针(图 1)。
根据 Filippo Valsorda发布的研究,该恶意库随后会将此函数指向它自己的恶意函数,并通过身份验证客户端的证书提取一条命令(在确认它是攻击者之后),然后将其传递给 system() 函数进行执行,从而在进行身份验证之前实现远程代码执行。
如需了解后门部分的更多详细说明,您可以阅读 Andres Freund发表的 openwall 博文。
潜在影响
目前,该后门似乎已被添加到易受攻击的机器上的 SSH 守护进程中,使远程攻击者能够执行任意代码。这意味着,任何机器安装了这个存在漏洞的软件包都会将 SSH 暴露给互联网,从而可能更容易受到攻击。
此后门几乎已经成了入侵的强有力推动因素,甚至让 SolarWinds 后门都相形见绌。攻击者几乎能够直接访问运行受感染发行版(包括 Fedora、Ubuntu 和 Debian)的任何 Linux 机器。几乎没有机器能幸免。
只有一个人阻止了此情况的发生——Andres Freund。在对软件更新后产生的一个延迟时间为 500 毫秒的问题进行调查后,Andres 成功地将该问题回溯到 xz 软件包并最终识别出此后门。
很显然,这又带来了很多疑问。我们是幸运的。如果此后门未被好奇的工程师发现,那么它会活跃多长时间?
也许,更严重的问题是:如果它先前已发生过,该怎么办?
检测和抵御
版本控制
美国网络安全和基础架构安全局 (CISA) 建议的行动方案 是降级到未受到感染的版本,例如 5.4.6。
要想了解您的系统上当前运行的是哪个版本的 XZ Utils 或 liblzma,您可以在 Akamai Guardicore Segmentation Insight 中运行以下查询,这会帮您查找 liblzma 库的已加载实例(图 2)。
SELECT DISTINCT path AS liblzma_path
FROM process_memory_map
WHERE LOWER(path) LIKE "%liblzma%"
或者,您可运行以下查询来查找已安装版本的软件包管理器。
SELECT name AS vulnerable_item, 'DEB' AS type, version
FROM deb_packages
WHERE (LOWER(name) LIKE '%xz-utils%' OR LOWER(name) LIKE '%liblzma%')
UNION
SELECT name AS vulnerable_item, 'RPM' AS type, version
FROM rpm_packages
WHERE (LOWER(name) LIKE '%xz-utils%' OR LOWER(name) LIKE '%liblzma%')
当然,您也可进行筛选,以便仅显示易受攻击的资产。
SELECT path AS vulnerable_item, "Loaded Library" AS type, '5.6%' AS version
FROM process_memory_map
WHERE LOWER(path) LIKE "%liblzma%5.6%"
SELECT name AS vulnerable_item, 'DEB' AS type, version
FROM deb_packages
WHERE (LOWER(name) LIKE '%xz-utils%' OR LOWER(name) LIKE '%liblzma%')
AND version LIKE '5.6.%'
UNION
SELECT name AS vulnerable_item, 'RPM' AS type, version
FROM rpm_packages
WHERE (LOWER(name) LIKE '%xz-utils%' OR LOWER(name) LIKE '%liblzma%')
AND version LIKE '5.6.%'
威胁搜寻
由于该后门实际上会执行系统命令,并且不允许进行身份验证,因此或许可以通过进程跟踪来检测此行为。
通常,在登录过程中,系统会为正在登录的用户创建一个新 shell,该 shell 会运行默认的 shell 进程(例如 bash)。但是,在感染此后门的情况下,SSH 守护程序进程 sshd实际上执行的是恶意命令,这会触发异常。
我们的威胁搜寻服务 Akamai Hunt能够采取相应的办法来检测此类异常。例如,通过持续 跟踪 进程活动及其子进程的基线。
Kill switch
从 对此后门的一些分析中可以看出,它似乎具有环境变量 kill switch。向系统的环境变量中添加键 yolAbejyiejuvnup=Evjtgvsh5okmkAvj 或许可以使该后门失效。