Singularity Linux 内核 Rootkit 技术分析

一、概述

1. 项目简介

Singularity 是一个专为现代 Linux 6.x 内核设计的内核级 Rootkit 概念验证,由安全研究员 MatheuZSecurity(Matheus Alves)开发。该项目通过 ftrace 基础架构实现系统调用劫持,展示了内核级持久化和隐蔽技术的极限。

2. 核心定位

A. 研究性质

该项目明确标注为教育和研究用途,旨在探索内核级隐蔽技术的边界,帮助安全研究人员和防御者理解内核 Rootkit 的能力范围。

B. 技术特点

  • 针对 Linux 6.x 系列内核的现代实现
  • 基于 ftrace 的系统调用劫持机制
  • 全方位的隐蔽能力覆盖
  • 多层次的检测对抗措施

3. 项目背景

Linux Rootkit 技术持续演进,从早期的内核模块劫持到现代的 eBPF 检测对抗。Singularity 代表了当前内核级隐蔽技术的前沿水平,整合了进程隐藏、文件隐藏、网络隐蔽、权限提升等多种功能。

二、技术架构

1. 系统组成

graph TB
    A[Singularity Rootkit] --> B[ftrace 劫持层]
    A --> C[功能模块层]
    A --> D[保护机制层]
    A --> E[隐蔽功能层]

    C --> C1[进程隐藏]
    C --> C2[文件隐藏]
    C --> C3[网络隐蔽]
    C --> C4[权限提升]

    D --> D1[eBPF 阻断]
    D --> D2[io_uring 保护]
    D --> D3[模块加载阻止]
    D --> D4[ftrace 控制保护]

    E --> E1[日志清理]
    E --> E2[模块自隐藏]
    E --> E3[内存取证对抗]
    E --> E4[审计逃逸]

Singularity 架构图

2. 核心组件

A. ftrace 劫持框架

Singularity 使用 Linux ftrace 基础架构实现系统调用劫持。ftrace 是 Linux 内核的跟踪工具,提供函数回调钩子机制。

技术优势

  • 无需修改内核源码
  • 动态安装和卸载钩子
  • 相比传统 syscall 表劫持更隐蔽

B. 功能模块架构

项目采用模块化设计,各功能独立实现并通过核心头文件协调:

模块功能核心文件
进程隐藏隐藏进程及其子进程hiding_directory.c, become_root.c
文件隐藏基于模式的文件/目录隐藏hiding_directory.c, hiding_stat.c
网络隐蔽隐藏 TCP/UDP 连接和端口hiding_tcp.c
权限提升环境变量和信号触发become_root.c
日志清理实时过滤内核日志clear_taint_dmesg.c
保护机制阻止检测工具bpf_hook.c, hooking_insmod.c

C. 模块间交互

sequenceDiagram
    participant U as 用户操作
    participant H as Hook 层
    participant F as 功能模块
    participant K as 内核

    U->>H: 系统调用
    H->>H: 检查是否需要劫持
    alt 需要隐藏
        H->>F: 调用隐藏逻辑
        F->>K: 返回过滤结果
        H-->>U: 返回伪造结果
    else 正常流程
        H->>K: 原始系统调用
        K-->>U: 返回正常结果
    end

系统调用劫持流程

三、核心功能分析

1. 进程隐藏机制

A. 实现原理

Singularity 通过劫持多个系统调用和内核接口实现进程的完全隐藏:

劫持的系统调用

  • getdents, getdents64:过滤目录列表
  • stat, lstat, statx, newfstatat:隐藏文件元数据
  • openat:阻止访问 /proc/[pid]
  • readlinkat:阻断符号链接解析
  • kill, getsid, getpgid:返回进程不存在错误
  • sched_getaffinity, getpriority:隐藏调度信息
  • sysinfo:调整进程计数
  • pidfd_open:阻止 PID 文件描述符打开

B. 子进程自动追踪

通过 sched_process_fork tracepoint 钩子,Singularity 能够自动追踪并隐藏被隐藏进程的所有子进程,无需手动配置。

C. 使用方式

通过 kill 信号触发进程隐藏:

# 隐藏当前 shell
kill -59 $$

# 隐藏指定进程
kill -59 <PID>

2. 文件系统隐藏

A. 模式匹配机制

Singularity 使用前缀匹配机制隐藏文件和目录。默认隐藏前缀为 singularity、obliviate 等关键字的文件。

B. 防护措施

为了防止隐藏文件被访问,项目还劫持了 chdir 系统调用,阻止用户进入隐藏目录,但允许直接访问其中的文件。

C. 实现细节

劫持的系统调用:

  • getdents, getdents64:过滤目录项
  • stat, lstat, newfstatat:隐藏文件状态
  • readlinkat:阻断符号链接解析
  • chdir:阻止进入隐藏目录

3. 网络隐蔽能力

A. 多层网络隐藏

Singularity 在多个网络层面上隐藏连接:

Proc 文件系统层

  • 劫持 tcp4_seq_show, tcp6_seq_show
  • 劫持 udp4_seq_show, udp6_seq_show
  • 过滤 /proc/net/* 接口输出

Netlink 层

  • 过滤 SOCK_DIAG 查询(ss、lsof 使用)
  • 过滤 NETFILTER/conntrack 消息(conntrack 工具使用)

数据包层

  • 在 tpacket_rcv 层丢弃数据包
  • 阻止 tcpdump、wireshark 等工具捕获

B. Conntrack 过滤

隐藏 /proc/net/nf_conntrack 中的连接条目,并过滤 netlink conntrack 查询,防止连接追踪工具检测到隐藏的网络活动。

C. 使用场景

配置特定端口后,该端口上的所有网络连接自动隐藏,对 netstat、ss、lsof、tcpdump 等工具不可见。

4. 权限提升功能

A. 环境变量触发

通过设置特定的环境变量触发权限提升:

MAGIC=mtz bash
# 新 shell 将拥有 root 权限

B. 信号触发

通过 kill 信号触发权限提升:

kill -59 $$
# 后续命令以 root 权限执行

C. 实现位置

该功能在 become_root.c 模块中实现,通过劫持 kill 和 getuid 系统调用实现。

5. ICMP 反向 Shell

A. 触发机制

Singularity 提供了一个隐蔽的后门机制,通过 ICMP 数据包触发反向 shell 连接。

B. 实现原理

  1. 内核模块监听 ICMP 数据包
  2. 检测特定格式的 ICMP 触发包
  3. 建立到配置服务器的 TCP 反向连接
  4. 自动隐藏该 shell 及其所有子进程
  5. 如果激活,自动绕过 SELinux enforcing 模式

C. 配置要求

需要在 include/core.h 中配置服务器 IP 和端口。

sequenceDiagram
    participant A as 攻击者
    participant T as 目标主机
    participant S as 服务器

    A->>T: 发送 ICMP 触发包
    T->>T: 检测触发信号
    T->>S: 建立 TCP 反向连接
    T->>T: 隐藏 shell 进程
    T->>T: 绕过 SELinux(如激活)
    S-->>A: 提供 root shell 访问

ICMP 反向 Shell 流程

四、保护机制分析

1. 检测对抗能力

A. eBPF 阻断

Singularity 劫持 bpf 系统调用,阻止以下 eBPF 操作:

  • BPF_PROG_LOAD:加载 eBPF 程序
  • BPF_ITER_CREATE:创建 eBPF 迭代器
  • BPF_RAW_TRACEPOINT_OPEN:打开原始跟踪点
  • BPF_LINK_CREATE:创建 eBPF 链接
  • 来自隐藏 PID 的所有 eBPF 操作

B. io_uring 保护

针对现代 Linux 中可能绕过 ftrace 检查的 io_uring 异步 I/O 机制,Singularity 实现了智能缓存机制,每 PID 缓存 1 秒,防止重复进程扫描。

C. 模块加载阻止

劫持 init_module 和 finit_module 系统调用,防止其他内核模块加载,可能用于阻止安全工具的内核模块加载。

D. ftrace 控制保护

阻止尝试禁用 ftrace 的操作:

echo 0 > /proc/sys/kernel/ftrace_enabled
# 表面成功但实际无效

受保护的系统调用包括:write、writev、pwrite64、pwritev、pwritev2、sendfile、splice、tee、copy_file_range、io_uring_enter。

2. 日志清理机制

A. 多层日志过滤

Singularity 在多个层面上清理日志痕迹:

内核日志接口

  • /proc/kmsg read hook
  • do_syslog hook(klogctl 系统调用)
  • /sys/kernel/debug/tracing/* read hook
  • sched_debug_show hook

系统日志

  • /var/log/kern.log、syslog、auth.log read hook
  • journalctl -k write hook(输出过滤)

内存取证对抗

  • /proc/kcore、/proc/kallsyms、/proc/vmallocinfo read hook

B. 过滤关键词

自动过滤以下敏感字符串:taint、journal、singularity、Singularity、matheuz、zer0t、kallsyms_lookup_name、obliviate、hook、hooked_、constprop、clear_taint、ftrace_helper、fh_install、fh_remove

C. Netlink 审计过滤

在 netlink 层丢弃隐藏进程的审计消息,并维护统计计数(get_blocked_audit_count、get_total_audit_count),防止审计系统检测到异常。

3. 模块自隐藏

A. 隐藏位置

Singularity 加载后自动从以下位置隐藏:

  • lsmod 命令输出
  • /proc/modules 文件
  • /sys/module/ 目录

B. Taint 标志清理

内核会标记已加载非 GPL 模块或已污染内核的状态。Singularity 通过内核线程定期清理 taint_mask,清除内核污染标志。

4. 磁盘取证对抗

A. 写系统调用劫持

Singularity 劫持 write 系统调用,检测和过滤磁盘取证工具的输出:

检测逻辑

  1. 检测进程是否打开块设备(/dev/sda、/dev/nvme0n1 等)
  2. 检测 debugfs 风格的输出模式(inode 列表、文件系统元数据)
  3. 原位清理隐藏模式(替换为空格以保持缓冲区大小和校验和)

B. 检测模式

识别以下模式并进行过滤:

  • debugfs: 前缀
  • 带括号的 inode 列表
  • Inode count、Block count、Filesystem volume name
  • Filesystem UUID、e2fsck、Inode 等元数据

5. Cgroup 过滤

隐藏进程的 PID 从 cgroup.procs 中过滤,防止通过 /sys/fs/cgroup/*/cgroup.procs 检测隐藏进程。

6. TaskStats 阻断

阻止 TaskStats netlink 查询,防止通过该机制进行 PID 枚举。

五、兼容性和支持

1. 测试环境

内核版本发行版状态备注
6.8.0-79-genericUbuntu 22.04/24.04稳定主要开发环境
6.12.0-174.el10.x86_64CentOS Stream 10稳定RHEL 系内核
6.12.48+deb13-amd64Debian 13 (Trixie)稳定Debian 内核
6.17.8-300.fc43.x86_64Fedora 43稳定SELinux 强制绕过验证
6.17.0-8-genericUbuntu 25.10稳定较新的通用内核

2. 多架构支持

支持 x86_64(__x64_sys_)和 ia32(__ia32_sys_、__ia32_compat_sys_*)两种架构。

六、安装和配置

1. 前置要求

  • Linux 内核 6.x
  • 内核头文件
  • GCC 和 Make
  • Root 权限

2. 快速安装

cd /dev/shm
git clone https://github.com/MatheuZSecurity/Singularity
cd Singularity
sudo bash setup.sh
sudo bash scripts/x.sh
cd ..

3. 配置服务器 IP

编辑 include/core.h:

#define YOUR_SRV_IP "192.168.1.100"
#define YOUR_SRV_IPv6 { .s6_addr = { [15] = 1 } }

编辑 modules/icmp.c:

#define SRV_PORT "8081"

七、检测和防御

1. 作者声明

作者承认即使有所有这些过滤、保护和钩子,仍然有方法可以检测这个 Rootkit。但作者选择不修补这些检测方法。

2. 潜在检测方法

虽然文档未明确说明,但基于项目实现,可能的检测方法包括:

  • 直接内核内存分析(绕过被劫持的系统调用)
  • 硬件级别的监控和分析
  • 启动早期的内核模块检测
  • 时间侧通道分析

3. 防御建议

A. 系统层面

  • 启用 Secure Boot 和模块签名验证
  • 使用内核锁定模式(Kernel Lockdown Mode)
  • 部署内核级别的完整性监控

B. 监控层面

  • 实施 eBPF 基础的深度监控(在 Rootkit 加载前)
  • 部署基于硬件的监控解决方案
  • 建立基线行为分析

C. 检测层面

  • 定期进行内核模块审计
  • 使用多种独立检测工具交叉验证
  • 实施启动早期的 Rootkit 扫描

八、绕过的安全工具

1. 进程监控工具

ps、top、htop 等进程监控工具无法检测到隐藏的进程。

2. 文件系统工具

ls、find、locate、stat、lstat、readlink 等工具无法发现隐藏的文件和目录。

3. 磁盘取证工具

debugfs、e2fsck 等工具的输出被 write hook 过滤,隐藏文件仍然不可见。

4. 内存取证工具

Volatility、crash、gdb 通过 /proc/kcore 过滤被绕过。

5. 网络监控工具

netstat、ss、lsof、tcpdump、wireshark、conntrack 以及 /proc/net/* 接口都被绕过。

6. 日志和跟踪工具

dmesg、journalctl -k、klogctl、strace、ltrace、ftrace、perf、bpftrace、bpftool、libbpf。

7. Rootkit 检测工具

unhide、chkrootkit、rkhunter 等标准 Rootkit 检测工具被绕过。

8. 模块检测工具

lsmod、modinfo、/sys/module、/proc/modules、kmod 都无法检测到 Singularity 模块。

9. 现代检测工具

部分基于 eBPF 的安全工具(如 Tracee)、基于 io_uring 的监控工具以及部分 Linux EDR 产品被绕过。

九、项目结构

1. 目录组织

  • ftrace:ftrace 劫持相关代码
  • include:头文件和配置
  • modules:功能模块实现
  • scripts:安装和辅助脚本
  • main.c:主入口
  • setup.sh:安装脚本
  • load_and_persistence.sh:持久化脚本

2. 关键文件

  • include/core.h:核心配置和宏定义
  • modules/icmp.c:ICMP 反向 shell 实现
  • modules/bpf_hook.c:eBPF 系统调用劫持
  • modules/hiding_*.c:各种隐藏功能实现
  • clear_taint_dmesg.c:日志清理和 taint 标志清除

十、总结

1. 技术意义

Singularity 展示了现代 Linux 内核 Rootkit 技术的能力边界,整合了多种高级隐蔽和对抗技术,对安全研究和防御工作具有重要参考价值。

2. 教育价值

该项目为内核安全研究人员提供了学习材料,帮助理解:

  • ftrace 基础架构的使用
  • 系统调用劫持技术
  • 内核级隐蔽技术
  • 检测对抗方法

3. 防御启示

Singularity 的存在提醒安全从业者:

  • 内核级威胁的严重性
  • 传统检测工具的局限性
  • 需要多层防御策略
  • 早期检测的重要性

4. 法律和道德声明

作者明确声明该项目仅用于教育和研究目的,强调:

  • 仅在拥有系统或获得明确书面授权的系统上测试
  • 未授权访问计算机系统在大多数司法管辖区是非法的
  • 作者不对软件的任何滥用负责

参考资料

  1. Singularity - GitHub Repository
  2. Singularity: A Final Boss Linux Kernel Rootkit
  3. Bypassing Elastic EDR with Singularity
最后修改:2026 年 01 月 19 日
如果觉得我的文章对你有用,请随意赞赏