本页为译文。英文版本为权威文本。 本译文与截至 2026年10月23日 的英文原文一致。 阅读英文版

malware · cryptomining · rootkit · linux · kernel · monero · privilege-escalation · cve-2026-31431 · container-escape

Rootpacket:一款藏身内核的 Linux 挖矿劫持工具包

Kinryū Labs 分析了 Rootpacket,这是一款 Linux 挖矿劫持工具包:它附带一个内核 rootkit 来伪造 CPU 和内存占用,通过 CVE-2026-31431(一个 AF_ALG 页缓存缺陷,同时可从容器逃逸到宿主机)提权至 root,伪装成 Intel 驱动,并关闭竞争矿工同样用于入侵的那些暴露在外的服务。

作者 Davis Zheng·

CVE
CVE-2026-31431
CVSS
7.8 (CVSS:3.1/AV:L/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H)

TLP:CLEAR。已批准公开发布。由 Kinryū Labs 蜜罐传感器网络捕获。下文指标均已做无害化处理。

执行摘要

  • ~45%实际跑到接近 100% 时 top 显示的 CPU 占用
  • 3种持久化机制
  • 7.8CVSS 评分,CVE-2026-31431(AF_ALG 页缓存本地提权)
  • 宿主机从非特权容器拿到 root

Rootpacket 是一款面向 Linux 的多组件挖矿劫持工具包。它打包了一个用于隐藏自身的内核级 rootkit、一个针对 Linux AF_ALG 加密接口中 CVE-2026-31431 的提权漏洞利用程序、一个经 UPX 加壳并改名为 xrandom 的 XMRig 6.26.0 门罗币挖矿程序,以及一个清除竞争对手的脚本。代码中大量使用土耳其语(变量名、注释、状态字符串),指向一名讲土耳其语的操作者。

该工具包以两种模式之一运行。在 root 模式下,它加载一个伪装成 intel_uncore_freq_aux 的可加载内核模块(LKM)rootkit,通过 DKMS 安装以便在内核升级后依然存活,注册一个 systemd 服务,并把机器上的竞争对手清理干净。拿不到 root 时,它退回到用户态模式,通过 crontab 持久化,并以守护进程方式运行挖矿程序。该挖矿程序经 stratum+ssl 连接 pool.supportxmr.com:443,使用 RandomX 挖门罗币。

值得细看的组件是 rootkit。挖矿程序把处理器压在接近 100% 的同时,rootkit 改写 /proc/stat,让 top 和 htop 报出平稳的 40% 到 50%,并用 jiffies 让这个数值上下浮动,使负载看起来真实,而不是固定不动。它对 /proc/meminfo 做同样的事,并过滤目录列表以隐藏自己的进程和文件。

关键发现
  • 其目标是挖矿劫持(高置信度)。工具包附带 XMRig 6.26.0、一个硬编码的门罗币钱包以及一份 pool.supportxmr.com 挖矿配置,并关闭了 XMRig 的开发者捐赠,因此全部收益归操作者。
  • 提权使用的是 CVE-2026-31431(“Copy Fail”),即 Linux AF_ALG algif_aead 路径中的一次确定性页缓存写入(CVSS 7.8,2026 年 4 月披露)。由于页缓存在整台宿主机范围内共享,同一次写入可以从容器逃逸并拿到宿主机 root,因此一个被感染的容器就等于一台被攻陷的宿主机(高置信度)。
  • 该操作者的水平明显高于典型的“投放即挖矿”团伙(高置信度)。带 ftrace 挂钩的自研 LKM rootkit、能为新内核自动重建的 DKMS 持久化、一个可用的 CVE-2026-31431 页缓存利用程序,以及 systemd/DKMS/cron 分层持久化,都是多数挖矿劫持者达不到的工程水平。
  • 该操作者很可能讲土耳其语(中等置信度)。工具包中通篇出现土耳其语变量名、注释和状态信息,例如 ROOT ele gecirildi!。
  • Rootpacket 的设计目标是独占一台主机并长期保有它。它的 killservice.sh 先清除竞争矿工,然后关闭挖矿劫持者用于初始访问的那些对外暴露的服务,包括 2375/2376 上的 Docker API,也就是我们在 RedTail 分析中记录过的同一条入口。这些团伙在争抢同一批配置错误的机器。

工具包架构

Rootpacket 是一个模块化投放器。各组成部分:

setup.sh         Entry point. Checks privilege level, picks a deployment mode.
getroot          Privilege escalation. Exploits CVE-2026-31431 (AF_ALG) for local root.
xrandom          UPX-packed XMRig 6.26.0, renamed to dodge name-based detection.
kernel/
  stealth.c      LKM rootkit, compiled via DKMS, disguised as an Intel driver.
  install.sh     DKMS persistence engine.
killservice.sh   Competitor elimination and "hardening".
rootpacket.tar.gz  An inner copy of the whole toolkit, packaged for redistribution.

Root 模式。 如果当前不是 root,setup.sh 先运行 getroot,把 xrandom 复制到 /opt/kernel-kd/,创建一个 systemd 服务,运行 kernel/install.sh 通过 DKMS 编译并加载 rootkit,运行 killservice.sh 清除竞争对手,然后以常驻服务方式启动挖矿程序。

用户态回退。 拿不到 root 时,setup.sh 把 xrandom 复制到 ~/.xrandom/,写入一个带 PID 锁的启动脚本,安装一条在重启时以及每分钟触发的 crontab 条目,并用 setsid 启动挖矿程序,使其在父 shell 退出后继续运行。

特性Root 模式用户态模式
挖矿程序位置/opt/kernel-kd/xrandom~/.xrandom/xrandom
持久化systemd(kernel-kd.service)crontab(@reboot + */1 * * * *)
Rootkit有(通过 DKMS 的 LKM)无
清除竞争对手有(killservice.sh)无
运行身份root(systemd)当前用户(setsid 守护进程)

getroot:CVE-2026-31431,靠页缓存破坏拿 root

getroot 是一个由 getroot.c 编译而成的静态链接、未剥离符号的 ELF64 x86-64 二进制文件。它利用 CVE-2026-31431(“Copy Fail”),即 Linux 内核 AF_ALG algif_aead 接口中一个于 2026 年 4 月 29 日披露的逻辑缺陷(CVSS 7.8)。该漏洞提供一次确定性的、由攻击者控制的 4 字节写入内核页缓存的能力,getroot 用它在内存中修补一个 SUID 二进制文件,然后以 root 身份走出来。

属性取值
类型ELF 64 位 LSB 可执行文件,x86-64,静态链接,未剥离符号
CVECVE-2026-31431 “Copy Fail”(CVSS 7.8,AV:L/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H)
子系统AF_ALG algif_aead,AEAD 模板 authencesn(hmac(sha256),cbc(aes))
受影响版本Linux 4.14 至 6.19.11(缺陷于 2017 年引入,提交 72548b093ee3);已在 6.18.22、6.19.12、7.0+ 中修复
攻击目标/usr/bin/su:其位于内存中的 .text 在页缓存里被修补
可靠性确定性,无竞争条件
用法 / 回退./getroot <cmd> [args...];若利用未成功,仍以当前权限执行该命令

机制。 2017 年在 AEAD 代码中引入的一处原地优化,使经 splice 得到的页缓存页同时留在源 scatterlist 和目标 scatterlist 中。当 authencesn 模板在攻击者选定的偏移 assoclen + cryptlen 处写入其 4 字节 ESN 临时值时,这次写入落在了一个用户可读文件的页缓存页内部。随后 HMAC 校验失败,recvmsg() 返回 EBADMSG,但内核从不回滚这次写入。getroot 解析 /usr/bin/su 的 ELF 头以计算其入口点的文件偏移,然后循环执行 splice → sendmsg(在 AAD 中携带要写入的 4 字节)→ recvmsg,每个 4 字节的 shellcode 分块一次,从而在页缓存中修补 /usr/bin/su。接着它 execve 执行 /usr/bin/su:内核加载已被破坏的页面,shellcode 以 SUID root 身份运行,getroot 在执行操作者的命令之前确认 getuid() == 0(并打印土耳其语的 [+] ROOT ele gecirildi!)。磁盘上的文件始终未被改动,因此文件完整性监控什么也发现不了。

逃逸到宿主机。 Linux 页缓存是宿主机全局的;容器不会拿到自己的那一份。非特权容器内的进程 splice 宿主机的 /usr/bin/su 时,破坏的是宿主机的缓存副本,因此 execve 得到的是宿主机上的 root,而不仅仅是容器内的 root。于是一个被感染的容器就等于一台被攻陷的宿主机,而 setup.sh 接下来还会把内核 rootkit 加载进宿主机。停止并删除容器是不够的;宿主机必须重建。

我们在一台隔离虚拟机(Kali,内核 6.6.15)中运行过一次 getroot。它完整执行了 AF_ALG 流程,但在该版本上未取得 root,转而以非特权方式执行命令,这符合一个针对特定内核布局的漏洞利用程序的表现。我们没有运行该挖矿程序。

xrandom:矿工

xrandom 是开源门罗币挖矿程序 XMRig 6.26.0 的改名加壳副本,使用 UPX 加壳。

属性取值
真实身份XMRig 6.26.0
加壳UPX 4.2.4(加壳后 2.8 MB,脱壳后 10.1 MB)
算法RandomX(rx/0)
矿池经 stratum+ssl 连接 pool.supportxmr.com:443
钱包46NVDFL6v5STw5Qw4j77PoBSHRTYnHZGZ8WRoGvHmpaMX7ZyhNUP2u24TLV9pNgncz1bZF2Vm8KkaNTzU7SXqrnFUx5zgHQ
捐赠比例0(已关闭 XMRig 开发者捐赠)

通过 443 端口加 TLS 挖矿,使流量粗看之下混在普通 HTTPS 之中,不过对于仔细观察的人来说,stratum 握手具有不同的 TLS 指纹。

stealth.c:内核 rootkit

这是整个工具包中开发得最完善的部分。它是一个 LKM rootkit,使用 ftrace 函数挂钩拦截内核函数并抹除恶意软件的痕迹,并且全程伪装成 Intel 硬件驱动。

属性取值
模块名intel_uncore_freq_aux
伪造的元数据MODULE_AUTHOR("Intel Corporation")、MODULE_DESCRIPTION("Intel Uncore Frequency Control Driver")、MODULE_VERSION("1.2.0")
挂钩方式通过 kallsyms_lookup_name 使用 ftrace(在 5.7 及更新的内核上借助 kprobe 解析)
控制接口sysfs,位于 /sys/kernel/intel_uncore_freq/(enabled、cpu_lo、cpu_hi、mem_lo、mem_hi、hide_tag)

它挂钩了什么,以及为什么:

  • CPU 伪装。 它挂钩 show_stat 以改写 /proc/stat,在可配置的上下界之间伪造利用率(默认 40% 到 50%),并随 jiffies 浮动,使数值像真实负载一样变化,而不是一条直线。
  • 内存伪装。 它挂钩 meminfo_proc_show 以改写 /proc/meminfo,伪造 MemFree、MemAvailable、Buffers、Cached、Active 和 Inactive。
  • 进程隐藏。 它挂钩 iterate_dir 以过滤 /proc 列表,隐藏名称匹配一组硬编码字符串的 PID:stealth、masscan、sshruns、ransomx、cpumask、xrandom、cpm_、kcpm、mask_helper、ftrhook、kintel_aux。操作者可以在运行时通过 /sys/kernel/intel_uncore_freq/hide_tag 添加更多名称。
  • 文件隐藏。 它隐藏匹配 stealth、cpumask、kintel_aux、intel_uncore_freq_aux 的路径,以及 sysfs 目录本身。
  • 自我隐藏。 加载时它用 list_del_init 把自己从 /proc/modules 和 /sys/module/ 中摘除,删除自己的 sysfs kobject,并用 try_module_get 增加自身引用计数,使 rmmod 无法卸载它。

那份隐藏列表本身也是一条线索:除挖矿程序之外,它还隐藏 masscan、sshruns 和 ransomx,因此操作者很可能在运行扫描器,而且工具包里的能力可能不止挖矿。

实际效果是:管理员盯着 top 看到的是一台繁忙但正常的机器,找不到可疑进程,也看不到那个正在撒谎的内核模块。真正的线索是物理的、带外的:机器发热、风扇转速上升、功耗攀升,这些都是 rootkit 伪造不了的。

持久化:三种机制,按模式分工

Rootpacket 的持久化取决于它落地时所处的模式。在 root 模式下它叠加两种互相加固的机制;在用户态模式下则退回到第三种。

#机制模式细节
1systemd 服务rootkernel-kd.service,Type=simple,Restart=always,RestartSec=3
2DKMS 模块root将 rootkit 安装到 /lib/modules/$(uname -r)/extra/;在内核升级后依然存活
3crontab用户@reboot 加每分钟一次(* * * * *),带 PID 锁和 setsid

DKMS 这一项最难缠:它通过内核自身的模块构建体系安装 rootkit,于是一次例行内核升级会把它重新编译并重新装上,而不是把它清掉。

killservice.sh:清场并封门

该脚本在横幅里把自己称为“挖矿劫持者加固”,从操作者的角度看这个说法是准确的。它分三个阶段运行。

阶段一:关闭暴露的服务。 它针对监听在 0.0.0.0 上、常被用作挖矿劫持入口的服务,逐个停止、禁用并 mask,对其二进制文件设置 chmod 000,并添加 iptables DROP 规则:

服务端口
Redis6379
Docker2375/2376
PostgreSQL5432
MongoDB27017
Elasticsearch9200/9300
Memcached11211
Hadoop YARN8088
Jenkins8080
Confluence8090

Docker 这一条是与我们 RedTail 报告之间的联结:Rootpacket 关掉的正是 RedTail 走进来的那扇 2375/2376 门。先落地的操作者先把宿主机用来挖矿,然后把下一批团伙锁在门外,针对他们本会使用的技术来加固这台机器。

阶段二:清除竞争矿工。 它终止进程、删除文件、清理 cron 任务,并清除与已知挖矿劫持家族相关联的 SSH 密钥,涉及 XMRig、Kinsing(kdevtmpfsi)、TeamTNT(tntrecht、mdrfckr)、sustes、watchdogs 和 minerd,以及 masscan、pnscan、zgrab 之类的扫描器。

阶段三:清除用户态 rootkit。 它从 /etc/ld.so.preload 中剥掉已知的恶意 LD_PRELOAD 条目(libprocesshider.so、libjdk.so、libpamx.so、一个伪造的 libselinux.so.3,以及 xhide)并删除这些库,清掉可能干扰自己的竞争对手用户态 rootkit。

归因

工具包中的土耳其语变量名、注释和状态字符串(例如 ROOT ele gecirildi!,意为“已拿到 root”)以中等置信度指向一名讲土耳其语的操作者。我们在 linuxutil5.pages[.]dev 上发现了一个分发或暂存 URL,托管于 Cloudflare Pages,这符合把载荷暂存在免费、信誉良好的基础设施上以混入正常流量的套路。内层的 rootpacket.tar.gz 是整个工具包的自包含副本,为操作者提供了一个可直接推送到下一台主机的现成包。

失陷指标

网络

指标说明
pool.supportxmr.com / pool.supportxmr.com:443主要门罗币矿池,stratum+ssl
linuxutil5.pages[.]dev分发 / 暂存(Cloudflare Pages)
api.xmrig.com、randomx.xmrig.com:443XMRig API 与基准测试端点
donate.v2.xmrig.com、donate.ssl.xmrig.comXMRig 开发者捐赠矿池(存在,但捐赠已关闭)
指向 443 端口的 stratum+ssl://出站 TLS 挖矿流量

门罗币钱包: 46NVDFL6v5STw5Qw4j77PoBSHRTYnHZGZ8WRoGvHmpaMX7ZyhNUP2u24TLV9pNgncz1bZF2Vm8KkaNTzU7SXqrnFUx5zgHQ

文件(SHA-256)

文件SHA-256MD5
rootpacket.tar.gz(外层)e2d0dab6b29df89d123fe8581047a03ac9b89ae8fa0d1f334b5aefbb93152857
getrootdda96d8a4bcc39dc7679347a4386bf1024152d2ccc46d333725ad0cda855d952
xrandom(加壳)ec3ef3dce99fa6cbc480f0f0b0c292676afed68704c44396271c7dc6afea2937

Build ID:getroot 为 148d8d902efd93ed892a541972fbcea3a99d05a3,xrandom 为 d7a91225bdd2e3ab67cabded9d7809bcc724401f。

主机痕迹

路径说明
/opt/kernel-kd/xrandom挖矿程序二进制文件(root 模式)
~/.xrandom/xrandom、~/.xrandom/run.sh挖矿程序与启动脚本(用户态模式)
/tmp/.xrandom.lockPID 锁(用户态模式)
/etc/systemd/system/kernel-kd.service恶意 systemd 单元
/usr/src/intel_uncore_freq_aux-1.2.0/rootkit 的 DKMS 源码
/sys/kernel/intel_uncore_freq/rootkit 的 sysfs 控制接口
/lib/modules/*/extra/intel_uncore_freq_aux.ko编译好的 rootkit 模块

行为

  • 以 root 或当前用户身份运行、名为 xrandom 的进程。
  • /proc/stat 中的 CPU 数值与硬件性能计数器(perf stat)不符,或与风扇转速和功耗不符。
  • 一个名为 kernel-kd 的 systemd 服务(已启用,Type=simple,Restart=always)。
  • 一条带 # xrandom-userland-autostart 标记的 cron 条目。
  • 一个在启动时加载却不出现在 lsmod 中的内核模块 intel_uncore_freq_aux。

检测

若 rootkit 未加载

systemctl status kernel-kd.service
ls -la /opt/kernel-kd/ ~/.xrandom/
dkms status | grep intel_uncore_freq
crontab -l | grep xrandom
lsmod | grep intel_uncore

若 rootkit 已加载

用户态的视图已被污染,因此检测必须来自 rootkit 之下或之外:

  • 用 perf stat 把 /proc/stat 的 CPU 数值与硬件计数器对比。差距很大就是线索。
  • 留意 show_stat、meminfo_proc_show 和 iterate_dir 上的 ftrace 挂钩。
  • 把报告的 CPU 占用与真实功耗、温度或风扇转速之间的不一致视为强信号。

捕获提权行为

  • 由非已知加密工具(cryptsetup、openssl、gpg、systemd-cryptsetup)的进程打开 AF_ALG、SOCK_SEQPACKET 套接字,是核心线索。完整顺序是 socket(AF_ALG) → bind → setsockopt(SOL_ALG) → accept → pipe → splice → sendmsg → splice → recvmsg(重复),随后 execve(/usr/bin/su)。
  • 把每个 SUID 二进制文件的磁盘字节与其页缓存视图作对比。sha256sum 是通过缓存读取的,拿到的是被破坏的副本,所以要用 dd if=<file> iflag=direct 直接读磁盘并对其做哈希,再做差异比较。SUID 二进制文件上出现不一致,就意味着页缓存被破坏。

候选 YARA

rule Rootpacket_Cryptojacker
{
    meta:
        description = "Rootpacket Linux cryptojacking toolkit"
        reference   = "Kinryu Labs CTI 2026-06-16"
    strings:
        $wallet = "46NVDFL6v5STw5Qw4j77PoBSHRTYnHZGZ8WRoGvHmpaMX7ZyhNUP2u24TLV9pNgncz1bZF2Vm8KkaNTzU7SXqrnFUx5zgHQ" ascii
        $svc    = "kernel-kd" ascii
        $cron   = "xrandom-userland-autostart" ascii
        $mod    = "intel_uncore_freq_aux" ascii
    condition:
        $wallet or 2 of ($svc, $cron, $mod)
}

处置

  1. 从已知干净的状态中清除 rootkit。 从 live 或恢复介质启动。删除 /lib/modules/*/extra/intel_uncore_freq_aux.ko* 并执行 dkms remove intel_uncore_freq_aux/1.2.0 --all,然后删除 /usr/src/intel_uncore_freq_aux-1.2.0/ 并重建 initramfs(update-initramfs -u、dracut -f 或 mkinitcpio -P)。DKMS 条目必须清掉,否则它会被重新编译出来。
  2. 清除服务: systemctl stop kernel-kd; systemctl disable kernel-kd; rm /etc/systemd/system/kernel-kd.service; systemctl daemon-reload。
  3. 清除挖矿程序: rm -rf /opt/kernel-kd/ ~/.xrandom/ /tmp/.xrandom.lock,然后 pkill -9 -f xrandom。
  4. 清理 cron 中的 # xrandom-userland-autostart 行。
  5. 恢复被 killservice.sh 破坏的东西。 它对 Redis、Docker、PostgreSQL、MongoDB 等二进制文件设置了 chmod 000,并添加了 iptables DROP 规则。重新安装受影响的软件包并复查防火墙。
  6. 横向排查。 内层的 rootpacket.tar.gz 就是为再分发准备的,因此要检查其他主机上是否存在相同指标,并复查日志中对 killservice.sh 所列服务的利用痕迹,以定位入口。
  7. 封堵 CVE-2026-31431。 升级到已修复的内核(6.18.22、6.19.12、7.0+,或你所用发行版的向后移植版本)。无法立即打补丁的地方,禁用存在漏洞的接口:echo 'install algif_aead /bin/false' > /etc/modprobe.d/disable-algif-aead.conf,然后 rmmod algif_aead。对于容器,在 seccomp 配置中阻止 AF_ALG(协议族 38)。
  8. 假定容器已导致宿主机失陷。 由于这次页缓存写入跨越了容器边界,任何运行过 setup.sh 的宿主机,即便是在容器内运行的,都应视为已完全失陷。要重建宿主机,而不是只删掉容器。

MITRE ATT&CK 映射

战术技术
初始访问T1190 利用面向公网的应用(Redis、Docker、MongoDB、Elasticsearch、Jenkins、Hadoop YARN,推断)
执行T1059.004 Unix Shell
权限提升T1068 利用漏洞提权(CVE-2026-31431,AF_ALG algif_aead);T1611 逃逸到宿主机(共享页缓存)
持久化T1543.002 Systemd 服务;T1053.003 Cron;T1547.006 内核模块(DKMS)
防御绕过T1014 Rootkit;T1036.005 伪装:匹配合法名称;T1027.002 软件加壳(UPX);T1070.004 文件删除;T1564.001 隐藏文件
发现T1057 进程发现(搜寻竞争对手)
横向移动T1570 横向工具转移(内层再分发包)
影响T1496 资源劫持(门罗币挖矿)

方法与分析师备注

  • 分析主要以静态方式在 Kali Linux x86-64 上进行(字符串提取、反汇编、源码审阅、结构分析)。我们还在一台隔离虚拟机(内核 6.6.15)中运行过一次 getroot 以观察其行为:它尝试了 AF_ALG 流程,在该版本上未取得 root,转而以非特权方式执行命令。挖矿程序未被运行,也没有上传任何内容。
  • 提权组件被确认为 CVE-2026-31431,判断依据是绑定到 AF_ALG 套接字的 authencesn(hmac(sha256),cbc(aes)) 模板、/usr/bin/su 这一页缓存目标,以及二进制文件中的 splice/sendmsg/recvmsg 写入循环。
  • 样本(工具包及其各组件)可按需提供给其他研究人员和防御方。请发邮件至 [email protected],并简要说明你的身份和用途。
Sample
rootpacket · e2d0dab6b29df89d…
How to cite
Kinryū Labs (2026). Rootpacket:一款藏身内核的 Linux 挖矿劫持工具包. https://kinryu.sh/zh/reports/rootpacket-linux-cryptojacking-rootkit/