1337-42/FlipSwitch-dev
GitHub: 1337-42/FlipSwitch-dev
针对 Linux 6.9+ 内核架构变化的新型系统调用挂钩技术概念验证,演示了在 switch 语句分发机制下如何实现内核级挂钩及相应检测思路。
Stars: 31 | Forks: 3
# FlipSwitch - 现代 Linux 内核系统调用挂钩
**一个演示现代 Linux 内核(6.9+)中高级系统调用挂钩技术的概念验证**
*为“揭示不可见之物:深入剖析现代 Linux Rootkit 及其检测”提供支持 - VirusBulletin 2025,柏林*
## 研究背景
本项目演示了一种新颖的系统调用挂钩技术,该技术适应了 Linux 内核 6.9 版本中引入的架构根本性变化。传统的 Rootkit 技术依赖于直接操作系统调用表,但现代内核已转向基于 switch 语句的分发机制。
### 内核 6.9+ 的挑战
在内核 6.9 中,Linux 从基于数组的系统调用分发转变为基于 switch 语句的分发:
**旧方法(6.9 之前):**
```
// Direct array lookup
sys_call_table[__NR_kill](regs);
```
**新方法(6.9+):**
```
#define __SYSCALL(nr, sym) case nr: return __x64_##sym(regs);
long x64_sys_call(const struct pt_regs *regs, unsigned int nr)
{
switch (nr) {
#include
default: return __x64_sys_ni_syscall(regs);
}
}
```
### FlipSwitch 方法
虽然系统调用表出于兼容性原因依然存在:
```
/*
* The sys_call_table[] is no longer used for system calls, but
* kernel/trace/trace_syscalls.c still wants to know the system
* call address.
*/
#define __SYSCALL(nr, sym) __x64_##sym,
const sys_call_ptr_t sys_call_table[] = {
#include
};
```
**FlipSwitch** 通过以下方式利用这一点:
1. 在旧的 `sys_call_table` 中查找目标系统调用地址
2. 扫描 `x64_sys_call` 函数以查找调用指令(0xe8)
3. 识别与我们的目标系统调用匹配的唯一调用偏移量
4. 修补调用指令以重定向到我们的挂钩函数
因为我们实际上是在 switch 语句中“翻转”字节,所以我们将其命名为 **FlipSwitch**。
## 功能特性
### 核心挂钩机制
FlipSwitch 专为使用 switch 语句进行系统调用分发的现代 Linux 内核(6.9+)设计。它不修改系统调用表,而是定位并修补内核分发函数内部的特定调用指令。这种方法允许精确且可靠的挂钩,并且在卸载模块时所有更改都会完全恢复。
**注意:** 由于这是一个仅用于研究目的的概念验证,它_仅_适用于 6.9+ 内核且仅适用于 x64 架构。
### 简单的混淆流水线
FlipSwitch 包含一个基本的混淆流水线,主要是为了支持我们论文和演示中的讨论点。该方法故意简单,并非旨在提供强大的规避能力。我们执行函数名替换是因为内核模块无法剥离所有符号。此外,我们应用基本的字符串混淆和元数据随机化来演示常见技术,但这些仅是最小化的,仅用于研究说明。
## 项目结构
```
FlipSwitch/
├── src/ # Core Implementation
│ ├── main.c # FlipSwitch hooking engine
│ └── main.h # Function prototypes and definitions
├── scripts/ # Obfuscation Toolkit
│ ├── func_obfuscate.py # Symbol name randomization
│ ├── obfuscate_and_replace.py # String encryption
│ └── randomize_metadata.py # Metadata falsification
├── build/ # Build Outputs
│ ├── main.ko # Standard build
│ ├── main_debug.ko # Debug build
│ └── main_obf.ko # Fully obfuscated build
├── Makefile # Intelligent build system
└── README.md # This documentation
```
## 快速开始

### 基本用法
```
# 构建和测试标准版本
make test
# Build 包含调试信息
make debug-test
# 构建完全混淆版本
make obfuscate-test
# 比较构建大小
make size-compare
```
### 构建目标
- `make` - 构建优化模块(无调试)
- `make debug` - 构建带有调试信息的模块
- `make test` - 构建并测试优化模块
- `make debug-test` - 构建并测试调试模块
- `make obfuscate` - 构建完全混淆的模块(无调试)
- `make obfuscate-test` - 构建并测试混淆模块
- `make clean` - 清理所有构建产物
- `make size-compare` - 比较不同构建的大小
- `make help` - 显示此帮助信息
## 混淆技术
以下示例说明了 FlipSwitch 的简单混淆流水线如何出于研究目的转换代码和元数据:
**函数混淆:**
Python 脚本扫描头文件以查找行尾带有 `//obfuscate` 标记的函数声明。对于每个标记的函数,它生成一个宏,将原始函数名映射到随机生成的名称。通过在 C 源文件顶部包含这些宏,编译器会在编译期间自动将所有原始函数名的出现替换为其混淆后的对应名称。
```
// Original
static int __init flipswitch_init(void)
// Obfuscated
static int __init f_m3x9k7q2(void)
```
**字符串混淆:**
`O_STRING` 宏被 Python 脚本用来查找和替换需要混淆的字符串。
```
// Original
find_sym_pointer(O_STRING("prepare_creds"))
// Obfuscated
find_sym_pointer(deobfuscate(OBF_PREPARE_CREDS, OBF_PREPARE_CREDS_LEN, OBF_PREPARE_CREDS_KEY))
```
**元数据随机化:**
```
Original: "FlipSwitch" by "Remco Sprooten"
Obfuscated: "kern_utils_55" by "Blake Wilson"
```
## 负责任的披露
这项研究旨在用于:
- **教育目的** - 了解现代 Rootkit 技术
- **防御性研究** - 提高检测能力
- **学术贡献** - 推进网络安全知识
**不旨在用于恶意目的。** 此代码仅为了研究和防御目的演示漏洞。
## VirusBulletin 2025 演示
**演讲**: “揭示不可见之物:深入剖析现代 Linux Rootkit 及其检测”
**日期**: 9 月 26 日,星期五,10:00-10:30
**地点**: Green Room, 柏林
**演讲者**: Ruben Groenewoud & Remco Sprooten (Elastic Security Labs)
本项目支持针对现代 Linux Rootkit 演变和检测策略的研究,提供了攻击者如何适应内核安全性改进的实际示例。
## 引用
引用此项研究时:
```
Sprooten, R. & Groenewoud, R. (2025). FlipSwitch: Modern Linux Kernel Syscall Hooking
Techniques. VirusBulletin Conference, Berlin. Elastic Security Labs.
```
标签:0day挖掘, EDR绕过, Linux内核, pdftotext, PoC, Rootkit, VirusBulletin, Zeek, 云资产清单, 内存补丁, 内核6.9, 内核安全, 内核模块, 安全资源, 底层安全, 恶意软件研究, 情报收集, 数据展示, 暴力破解, 漏洞研究, 系统调用Hook, 系统调用表, 红队, 逆向工具, 逆向工程, 高交互蜜罐