要点
- 2024 年 3 月 29 日,Andres Freund 识别出对命令行实用程序 XZ 的恶意提交,影响了 Linux 的 5.6.0 和 5.6.1 版本,并在 oss-security 邮件列表中共享了该信息。
- 在开发系统启动的 SSH 登录尝试中观察到延迟增加了500 毫秒以及其他异常情况后,Andres 发现了此问题。
- 已识别的后门旨在绕过 SSH 中的身份验证控制以远程执行代码,从而可能获得对环境中其他系统的访问权限。
- 代码提交由 JiaT75(现已暂停)添加和签名,他为这个流行的开源项目贡献了数年。
- 安全研究人员仍在对有效负载进行初步分析,剖析构建过程和后门。
- Elastic 发布了 YARA 签名、检测规则和 osquery 查询,使 Linux 系统维护人员能够了解影响并尽早阻止潜在的入侵。
XZ / liblzma 后门概览
2024 年 3 月 29 日,在出现 500 毫秒 的延迟和间歇性故障后,许多 Linux 发行版中广泛采用的 XZ 包作为系统用于与 SSH 客户端连接(以及许多其他系统实用程序)交互的库,被推到了风口浪尖。对该异常情况的例行调查演变成了一个令人惊讶且出乎意料的转折:维护人员在软件包中植入了恶意的、模糊的代码,这些代码也通过中毒的构建过程传播了几周。
最初识别出恶意贡献的开发人员 Andres Freund 观察到,这些更改已在 XZ Utils 包的 5.6.0
和 5.6.1
版本中实施,但尚未在所有 Linux 发行版中广泛采用,除了通常用于早期阶段测试的选定前沿版本之外。
初步分析表明,该后门旨在通过 systemd
绕过 sshd
中的身份验证控制,并尝试在预身份验证上下文中执行代码。到目前为止的观察表明,恶意代码并非处于最终目标状态,并且可能由于开发人员疏忽考虑的随意错误而被提前发现,从而对合法的 SSH 用例造成了影响。
除了恶意软件包在少量 Linux 发行版中传播之外,还对流行的软件包管理软件 HomeBrew 进行了一些观察,这影响了一些 macOS 用户。Homebrew 的维护人员以及其他包含此库的软件包目前正在回滚到未受这些恶意更改影响的早期版本,尽管主要是出于谨慎,因为受感染的构建仅针对 deb 和 rpm 软件包。
在后门消息传出后不久,Tukaani 项目(XZ Utils Git 存储库的项目所有者)的主页上发布了以下通知。
从发现阶段来看,这种妥协虽然风险很高,但在实际影响方面相对较小。这种情况应提醒安全专业人员了解供应链妥协、监控 Linux 工作负载和审计系统控制的重要性。在这种情况下,防御者有时间优势。
后门分析
XZ 后门构建过程
CVE-2024-3094 解释了 liblzma
中的更改是如何从恶意添加到库的构建脚本中创建的,并直接影响任何在受影响系统上链接该库的软件。
恶意修改的构建脚本分为三个阶段,首先是在 m4/build-to-host.m4
中添加,然后通过模糊处理和执行阶段。从高层次上讲,一些模糊处理技术包括通过 tr
和 head
命令进行字符替换和选择性字节处理命令,以解码和执行测试文件中的恶意有效负载。有趣的是,许多受影响的工具都是标准 Linux 系统工具,通常由管理员用于合法目的。
构建过程运行如下:
- 阶段 0: 最初的恶意代码添加尝试通过更改特定测试文件中的字节值来解码阶段 1 脚本(隐藏的代码段),这些字节值在正常情况下似乎已损坏,以形成有效的 XZ 流。
- 阶段 1: 此阶段利用带有特殊检查(例如,脚本运行的 Linux 架构)和 Bash 命令(例如,
[ "$(uname)" = "Linux" ]
)的 bash 文件来分析环境,以确保满足后门的兼容条件。根据检查结果,可能会执行其他恶意脚本或有效负载。 - 阶段 2: 此阶段涉及 infected.txt 文件,其中详细说明了更改后的提取和编译代码修改,即
- 重建数据:对测试文件中模糊压缩的数据进行字节操作和解码技术,以使用
sed
和awk
等命令重建恶意有效负载 - 模糊处理和提取:使用
tr
命令进行复杂的解密和模糊处理技术,以提取二进制后门,使其免受典型检测机制的侵害 - 构建过程操作:这会更改构建和编译步骤,以将二进制后门嵌入到 Linux 系统进程中
- 扩展机制:一种允许在不修改原始有效负载的情况下为后门添加新脚本和更新的设计
- 未来阶段准备:为恶意的后续活动奠定基础,例如传播后门
- 重建数据:对测试文件中模糊压缩的数据进行字节操作和解码技术,以使用
评估影响
鉴于受影响的测试版发行版和软件的使用有限,此妥协应影响很少的系统。但是,鼓励 Linux 系统维护人员通过利用以下 osquery 查询来确保系统未运行 xzutils
/ liblzma
的受影响版本
SELECT 'DEB Package' AS source, name, version,
CASE
WHEN version LIKE '5.6.0%' OR version LIKE '5.6.1%' THEN 'Potentially Vulnerable'
ELSE 'Most likely not vulnerable'
END AS status
FROM deb_packages
WHERE name = 'xz-utils' OR name = 'liblzma' OR name LIKE 'liblzma%'
UNION
SELECT 'RPM Package' AS source, name, version,
CASE
WHEN version LIKE '5.6.0%' OR version LIKE '5.6.1%' THEN 'Potentially Vulnerable'
ELSE 'Most likely not vulnerable'
END AS status
FROM rpm_packages
WHERE name = 'xz-utils' OR name = 'liblzma' OR name LIKE 'liblzma%';
SELECT 'Homebrew Package' AS source, name, version,
CASE
WHEN version LIKE '5.6.0%' OR version LIKE '5.6.1%' THEN 'Potentially Vulnerable'
ELSE 'Most likely not vulnerable'
END AS status
FROM homebrew_packages
WHERE name = 'xz' OR name = 'liblzma';
以下 KQL 查询可用于查询 Elastic Defend 文件事件
event.category : file and host.os.type : (macos or linux) and file.name : liblzma.so.5.6.*
或者,手动检查系统上运行的 XZ 版本非常简单,只需运行以下命令(来自研究员 Kostas)并检查输出版本即可。请记住,版本 5.6.0 和 5.6.1 会受到影响,应回滚或更新到较新版本。
for xz_p in $(type -a xz | awk '{print $NF}' | uniq); do strings "$xz_p" | grep "xz (XZ Utils)" || echo "No match found for $xz_p"; done
恶意软件防护
以下 YARA 签名(磁盘和内存中)已部署在 Elastic Defend 中,以阻止 XZ 后门。
rule Linux_Trojan_XZBackdoor {
meta:
author = "Elastic Security"
fingerprint = "f1982d1db5aacd2d6b0b4c879f9f75d4413e0d43e58ea7de2b7dff66ec0f93ab"
creation_date = "2024-03-30"
last_modified = "2024-03-31"
threat_name = "Linux.Trojan.XZBackdoor"
reference_sample = "5448850cdc3a7ae41ff53b433c2adbd0ff492515012412ee63a40d2685db3049"
severity = 100
arch_context = "x86"
scan_context = "file, memory"
license = "Elastic License v2"
os = "linux"
strings:
/* potential backdoor kill-switch as per https://gist.github.com/q3k/af3d93b6a1f399de28fe194add452d01?permalink_comment_id=5006558#file-hashes-txt-L115 */
$a1 = "yolAbejyiejuvnup=Evjtgvsh5okmkAvj"
/* function signature in liblzma used by sshd */
$a2 = { F3 0F 1E FA 55 48 89 F5 4C 89 CE 53 89 FB 81 E7 00 00 00 80 48 83 EC 28 48 89 54 24 18 48 89 4C 24 10 }
/* unique byte patterns in backdoored liblzma */
$b1 = { 48 8D 7C 24 08 F3 AB 48 8D 44 24 08 48 89 D1 4C 89 C7 48 89 C2 E8 ?? ?? ?? ?? 89 C2 }
$b2 = { 31 C0 49 89 FF B9 16 00 00 00 4D 89 C5 48 8D 7C 24 48 4D 89 CE F3 AB 48 8D 44 24 48 }
$b3 = { 4D 8B 6C 24 08 45 8B 3C 24 4C 8B 63 10 89 85 78 F1 FF FF 31 C0 83 BD 78 F1 FF FF 00 F3 AB 79 07 }
condition:
1 of ($a*) or all of ($b*)
}
此签名的检测将在 Elastic 中显示如下:
行为检测
利用 Elastic Defend 的网络和进程事件,我们发布了一个新的 EQL 检测规则,以识别 SSHD 服务启动、产生 shell 进程并在极短时间内意外终止的情况。
sequence by host.id, user.id with maxspan=1s
[process where host.os.type == "linux" and event.type == "start" and event.action == "exec" and process.name == "sshd" and
process.args == "-D" and process.args == "-R"] by process.pid, process.entity_id
[process where host.os.type == "linux" and event.type == "start" and event.action == "exec" and process.parent.name == "sshd" and
process.executable != "/usr/sbin/sshd"] by process.parent.pid, process.parent.entity_id
[process where host.os.type == "linux" and event.action == "end" and process.name == "sshd" and process.exit_code != 0] by process.pid, process.entity_id
[network where host.os.type == "linux" and event.type == "end" and event.action == "disconnect_received" and process.name == "sshd"] by process.pid, process.entity_id
Linux:最后的边界
虽然基于供应链的攻击或漏洞利用的观察很少达到这种全球新闻报道的程度,但 Elastic 在 2023 年全球威胁报告 中描述的观察表明,我们数据集中基于 Linux 的签名事件持续增长。这种增长部分与我们观察到的报告威胁行为的系统增长有关,但这强烈表明,攻击者正越来越关注 Linux 系统。
Linux 现在和将来都会在 威胁组织的考虑范围之内,因为它在互联网上的广泛采用加强了其重要性。在这种情况下,敌对组织试图规避现有的控制措施,以便通过其他手段在未来进行妥协。
虽然 XZ 后门背后的人员的目标尚未明确,但许多专注于间谍活动、敲诈勒索、数据破坏、知识产权盗窃和侵犯人权的威胁实体都具备这种技术能力。由于能够在受影响的互联网可访问系统上执行代码,因此有理由假设不良行为者会进一步渗透受害者。Elastic 安全实验室看到 Linux 可见性正在显著提高,企业已开始有效管理其 Linux 群体,但许多组织在应对这种供应链妥协时仍处于这一过程的开始阶段。