LinkPro Linux Rootkit
最近,针对亚马逊网络服务 (AWS) 环境的入侵暴露了一个此前未记录的 GNU/Linux Rootkit,其被追踪为 LinkPro。该后门因其双重 eBPF 模块用途而引人注目:一组模块用于隐藏构件,另一组模块充当隐秘触发器——一种“敲击”机制,仅在检测到特制的 TCP 数据包后才会唤醒远程命令功能。攻击链和 Rootkit 的机制表明,攻击者技艺高超,他们巧妙地融合了容器滥用、内核级隐藏和灵活的网络激活技术,以规避检测和取证关联。
目录
感染媒介和初始部署
此次入侵始于利用一个暴露的 Jenkins 实例,该实例存在 CVE-2024-23897(CVSS 9.8)漏洞。攻击者以此为据点,将一个恶意 Docker 镜像(kvlnt/vv,现已从 Docker Hub 中移除)推送到多个 Kubernetes 集群。该镜像基于 Kali Linux 构建,并包含一个小型应用程序文件夹,旨在建立持久性、远程访问和分阶段下载后门。
恶意 Docker 镜像内部
该图像的应用程序文件夹包含三个具有不同作用的关键文件:
start.sh — 启动 SSH 服务并执行其他两个组件的 shell 脚本。
link——一个开源程序(vnt),编译/打包后充当VPN/代理客户端,连接到vnt.wherewego[.]top:29872。这使得攻击者可以从任何地方访问受感染的主机,并通过它转向其他目标。
app——一个基于 Rust 的下载程序(称为 vGet),它从 S3 存储桶中获取加密的 vShell 有效负载,然后与其位于 56.155.98[.]37 的命令和控制 (C2) 服务器建立 WebSocket 链接。
向 Kubernetes 节点交付额外的有效负载
除了恶意镜像之外,运营者还在节点上植入了另外两个组件:一个用于安装另一个 vShell 后门的植入器,以及一个用 Golang 编写的 rootkit LinkPro。LinkPro 的设计模式是两种:被动(反向)或主动(正向),具体取决于其配置。在被动模式下,它等待特殊网络数据包激活;在主动模式下,它会主动发起与 C2 的通信。正向模式支持五种传输协议(HTTP、WebSocket、UDP、TCP、DNS),而反向模式则将通信限制为 HTTP。
LinkPro 如何持续存在
该恶意软件的整体执行和持久性行为遵循明确的顺序:
- 安装隐藏 eBPF 模块。该模块包含 Tracepoint 和 Kretprobe eBPF 程序,用于隐藏 LinkPro 的进程和网络活动。
- 如果安装隐藏 eBPF 模块失败(或者已被禁用),请在 /etc/libld.so 安装一个共享库,并将该路径添加到 /etc/ld.so.preload 作为后备隐藏机制。
- 如需进行反向(被动)操作,请安装 Knock eBPF 模块。Knock 包含一个 XDP 程序和一个 TC 程序,因此 C2 通道只有在收到特定的“魔术包”后才会激活。
- 通过创建 systemd 服务来建立持久性。
- 执行从 C2 接收的命令。
- 在关机或收到信号(SIGHUP、SIGINT、SIGTERM)时,卸载 eBPF 模块并删除/恢复 /etc/libld.so 预加载修改,以便系统恢复到之前的状态。
魔法包和敲击激活机制
LinkPro 的被动激活依赖于精确的 TCP 数据包:任何窗口大小等于 54321 的 TCP 数据包都被视为“魔术数据包”。当 Knock 检测到该数据包时,它会存储源 IP 并为其添加一个一小时的有效期标记。来自该源的后续 TCP 数据包会受到监控,并在适当的时候,Knock 会重写报头,以便将运营商的流量重定向到 LinkPro 的监听端口 (2333)。出站数据包会被调整,将原始端口返回到网络(源端口重写为 2233)。其意图简单却有效:允许攻击者通过前端防火墙允许的任何端口访问 LinkPro,同时使外部防火墙日志与主机内部网络活动难以关联。
LinkPro 如何隐藏自身
LinkPro 采用双层隐藏策略:
内核/eBPF 隐藏:隐藏 eBPF 模块会安装 Tracepoint 和 Kretprobe 程序,用于拦截诸如 getdents(用于隐藏文件/目录)和 sys_bpf(用于隐藏其自身的 BPF 程序)之类的系统调用。此方法需要在内核中启用 CONFIG_BPF_KPROBE_OVERRIDE 选项。
用户空间 LD_PRELOAD 回退:如果内核功能不存在,LinkPro 会写入一个共享库 (libld.so),并将其路径放置在 /etc/ld.so.preload 中。由于 /etc/ld.so.preload 会导致指定的库加载到每个动态链接进程(使用 /lib/ld-linux.so 和 glibc 的进程)中,因此植入的 libld.so 会提前(在 glibc 自身行为之前)钩住 libc 函数,并修改 libc 调用的返回值,以隐藏可能暴露其存在的痕迹。
Rootkit 功能和命令集
LinkPro 支持交互式和自动化远程操作。其实现的功能包括:
- 启动 /bin/bash 伪终端并运行交互式 shell 会话。
- 执行任意 shell 命令。
- 枚举文件和目录并执行文件操作。
- 下载文件并将其写入磁盘。
- 建立用于枢转和离地代理的 SOCKS5 代理隧道。
网络协议支持和 C2 行为
在主动(正向)模式下,LinkPro 非常灵活:它可以使用 HTTP、WebSocket、UDP、TCP 或 DNS 传输协议进行通信。在被动(反向)模式下,其通信仅限于 HTTP,但具有隐身优势,因为它仅在 Knock 魔法包打开一个临时的一小时命令窗口后进行监听。
清理和卸载行为
如果进程收到终止信号,LinkPro 会清除相关痕迹:它会卸载已安装的 eBPF 模块,并删除或恢复 /etc/libld 文件,将其恢复到之前的状态,使系统看起来没有任何变化。这种刻意的清理程序表明操作员担心规避攻击,并希望最大程度地减少长期取证痕迹。
操作背景和归因
该活动使用了高危 Jenkins 漏洞、恶意容器镜像、多个后门变体以及内核级隐身技术——这些因素表明攻击者意图明确且能力超群。目前尚未公开明确的归属信息;然而,该活动所使用的工具集以及其用于代理和持久远程访问的明显用途,强烈表明其活动存在经济动机(例如,转移目标、使用代理进行更多入侵或转售访问权限)。
内核依赖和回退行为
由于 LinkPro 依赖 BPF kprobe 覆盖功能进行隐秘的内核拦截,因此它仅在主机内核暴露 CONFIG_BPF_KPROBE_OVERRIDE 时才会应用内核级隐藏技术。当缺少该内核功能时,LinkPro 会主动回退到 LD_PRELOAD 共享库方法,将自身隐藏在用户空间中,从而确保在各种环境中都能实现隐蔽。
结束语
LinkPro 演示了现代入侵如何结合容器入侵、分阶段加载器、内核插桩 (eBPF) 以及巧妙的网络技巧(魔术包激活和端口重写),从而保持隐蔽性和灵活性。检测和修复需要仔细检查未经授权的 eBPF 程序、/etc/ld.so.preload 中的意外条目、异常的 systemd 服务以及与指定基础设施的网络连接(取证指标包括 IP 56.155.98[.]37、端口 29872、2333、2233 以及已删除的 Docker 镜像名称 kvlnt/vv)。