MatheuZSecurity/ksentinel
GitHub: MatheuZSecurity/ksentinel
Linux 内核模块级别的 syscall 完整性监控器,用于检测各类 rootkit 对内核函数和系统调用表的篡改行为。
Stars: 80 | Forks: 7
# ksentinel - 内核 Syscalls 完整性监控器
## 概述
ksentinel 监控关键内核函数和 syscall 表的未授权修改。它检测大多数 rootkit 针对的常见 syscalls,包括 ftrace hooks、kprobes 和 syscall 表劫持。
## 功能特性
- 函数序言完整性检查(基于 FNV-1a 哈希)
- 系统调用表监控(512 个条目)
- LSTAR MSR 验证(x86_64 syscall 入口点)
- 带解锁密钥机制的反卸载保护
- 可配置间隔的持续监控
注意:ksentinel 处于初始版本;更多改进将在未来的提交中推出。
## 监控的函数
**VFS 层:**
- filldir, filldir64, do_getdents64, vfs_read, vfs_write, vfs_open
**网络栈:**
- tcp4_seq_show, tcp6_seq_show, udp4_seq_show, udp6_seq_show
**凭证:**
- commit_creds, prepare_kernel_cred
**模块系统:**
- load_module, free_module
**追踪基础设施:**
- register_kprobe, register_ftrace_function, ftrace_set_filter
以及通过前缀匹配的 500 多个额外 syscall 包装器。
## 构建
```
make
```
在编译期间,会生成并显示一个随机的 32 字符解锁密钥。请立即记下它。
此密钥嵌入在编译后的模块中,不存储在外部。
如果启用了反卸载保护,请妥善保管此密钥。
## 安装
```
sudo make install
```
该模块加载后会从 lsmod 中隐藏,并默认启用反卸载保护。
## 使用方法
### 手动加载
```
sudo insmod ksentinel.ko
```
### 使用管理脚本
```
sudo ./ksentinel-manager.sh load # load module
sudo ./ksentinel-manager.sh status # check status
sudo ./ksentinel-manager.sh watch # monitor live
sudo ./ksentinel-manager.sh violations # view alerts
```
### 监控日志
```
dmesg -wT | grep ksentinel
```
### 解锁模块
当启用反卸载时,必须在移除前解锁模块:
```
echo "your_32char_key" > /proc/.ksctl
```
或者使用管理器:
```
sudo ./ksentinel-manager.sh unlock
```
### 移除模块
```
sudo rmmod ksentinel
```
## 模块参数
| 参数 | 类型 | 默认值 | 描述 |
|-----------|------|---------|-------------|
| period_ms | uint | 2000 | 完整性检查间隔(毫秒) |
| sym_prefixes | string | "sys_,__x64_sys_,do_sys_,ksys_" | 要监控的逗号分隔符号前缀 |
| extra_syms | string | "" | 要监控的额外特定符号 |
| anti_unload | bool | true | 启用反卸载保护 |
使用自定义参数的示例:
```
sudo insmod ksentinel.ko period_ms=5000 anti_unload=false
```
## 性能考量
ksentinel 根据 `period_ms` 参数执行定期完整性检查。
较低的间隔可提供更快的检测速度,但会增加 CPU 使用率。
默认间隔(2000ms)对现代系统影响极小。
## 检测示例
### 检测到 Inline Hook
```
ksentinel: [CHANGE - HOOK PATTERN] sys_getdents64 @ 0xffffffff81234567
baseline=1234567890abcdef current=fedcba0987654321
bytes: e9 ab cd ef 12 90 90 90 ...
flags: JMP/CALL_DETECTED ENDBR64_PREFIX
```
### Syscall 表 Hook
```
ksentinel: [SCT HOOK] syscall[78] expected=0xffffffff81111111 got=0xffffffffa0222222 (fake_getdents+0x0)
```
### LSTAR 篡改
```
ksentinel: [LSTAR TAMPERED] baseline=0xffffffff81800000 now=0xffffffffa0300000 (evil_syscall_entry+0x0)
```
## 已知 Rootkit 检测
ksentinel 可以检测由以下工具进行的修改:
- **PUMAKIT** - 基于 ftrace 的 hooking(18 个 syscalls)
- **Diamorphine** - syscall 表修补
- **KoviD** - 基于 kprobes 的隐藏
检测取决于在 rootkit 之前加载 ksentinel。
## 系统要求
**内核配置:**
- CONFIG_KALLSYMS=y
- CONFIG_KPROBES=y
- CONFIG_MODULES=y
**支持的内核:**
- Linux 5.4 到 6.12+
- x86_64 架构(LSTAR 检查)
- ARM64 支持(无 LSTAR 检查)
## 局限性
1. **仅检测** - 不阻止或移除 rootkit
2. **基线假设** - 假设模块加载时内核是干净的
3. **竞态条件** - 在 ksentinel 之前加载的 rootkit 无法被检测
4. **规避** - 复杂的 rootkit 可以针对监控代码本身
## 安全注意事项
- 尽早在启动过程中加载 ksentinel
- 安全地离线存储解锁密钥
## 故障排除
### 模块无法加载
检查内核配置:
```
grep -E "KALLSYMS|KPROBES" /boot/config-$(uname -r)
```
### 模块无法卸载
该模块已隐藏并启用了反卸载保护。请先解锁:
```
sudo ./ksentinel-manager.sh unlock
```
## 开发
```
make clean # clean build artifacts
make # compile module
make install # load module
make uninstall # unload module
```
## 贡献
欢迎贡献。请保持代码风格,并为新功能添加测试。
## 许可证
GPL-2.0-only
本程序是按 GPL version 2.0 许可的自由软件。任何修改必须保留对原作者的署名,并在相同许可下分发。
有关完整条款,请参阅 LICENSE 文件。
## 作者
**MatheuZSecurity**
Rootkit 研究人员社区:https://discord.gg/66N5ZQppU7
## 免责声明
本工具用于安全研究和系统管理。请负责任地使用。作者不对滥用或本软件造成的损害负责。
## 概述
ksentinel 监控关键内核函数和 syscall 表的未授权修改。它检测大多数 rootkit 针对的常见 syscalls,包括 ftrace hooks、kprobes 和 syscall 表劫持。
## 功能特性
- 函数序言完整性检查(基于 FNV-1a 哈希)
- 系统调用表监控(512 个条目)
- LSTAR MSR 验证(x86_64 syscall 入口点)
- 带解锁密钥机制的反卸载保护
- 可配置间隔的持续监控
注意:ksentinel 处于初始版本;更多改进将在未来的提交中推出。
## 监控的函数
**VFS 层:**
- filldir, filldir64, do_getdents64, vfs_read, vfs_write, vfs_open
**网络栈:**
- tcp4_seq_show, tcp6_seq_show, udp4_seq_show, udp6_seq_show
**凭证:**
- commit_creds, prepare_kernel_cred
**模块系统:**
- load_module, free_module
**追踪基础设施:**
- register_kprobe, register_ftrace_function, ftrace_set_filter
以及通过前缀匹配的 500 多个额外 syscall 包装器。
## 构建
```
make
```
在编译期间,会生成并显示一个随机的 32 字符解锁密钥。请立即记下它。
此密钥嵌入在编译后的模块中,不存储在外部。
如果启用了反卸载保护,请妥善保管此密钥。
## 安装
```
sudo make install
```
该模块加载后会从 lsmod 中隐藏,并默认启用反卸载保护。
## 使用方法
### 手动加载
```
sudo insmod ksentinel.ko
```
### 使用管理脚本
```
sudo ./ksentinel-manager.sh load # load module
sudo ./ksentinel-manager.sh status # check status
sudo ./ksentinel-manager.sh watch # monitor live
sudo ./ksentinel-manager.sh violations # view alerts
```
### 监控日志
```
dmesg -wT | grep ksentinel
```
### 解锁模块
当启用反卸载时,必须在移除前解锁模块:
```
echo "your_32char_key" > /proc/.ksctl
```
或者使用管理器:
```
sudo ./ksentinel-manager.sh unlock
```
### 移除模块
```
sudo rmmod ksentinel
```
## 模块参数
| 参数 | 类型 | 默认值 | 描述 |
|-----------|------|---------|-------------|
| period_ms | uint | 2000 | 完整性检查间隔(毫秒) |
| sym_prefixes | string | "sys_,__x64_sys_,do_sys_,ksys_" | 要监控的逗号分隔符号前缀 |
| extra_syms | string | "" | 要监控的额外特定符号 |
| anti_unload | bool | true | 启用反卸载保护 |
使用自定义参数的示例:
```
sudo insmod ksentinel.ko period_ms=5000 anti_unload=false
```
## 性能考量
ksentinel 根据 `period_ms` 参数执行定期完整性检查。
较低的间隔可提供更快的检测速度,但会增加 CPU 使用率。
默认间隔(2000ms)对现代系统影响极小。
## 检测示例
### 检测到 Inline Hook
```
ksentinel: [CHANGE - HOOK PATTERN] sys_getdents64 @ 0xffffffff81234567
baseline=1234567890abcdef current=fedcba0987654321
bytes: e9 ab cd ef 12 90 90 90 ...
flags: JMP/CALL_DETECTED ENDBR64_PREFIX
```
### Syscall 表 Hook
```
ksentinel: [SCT HOOK] syscall[78] expected=0xffffffff81111111 got=0xffffffffa0222222 (fake_getdents+0x0)
```
### LSTAR 篡改
```
ksentinel: [LSTAR TAMPERED] baseline=0xffffffff81800000 now=0xffffffffa0300000 (evil_syscall_entry+0x0)
```
## 已知 Rootkit 检测
ksentinel 可以检测由以下工具进行的修改:
- **PUMAKIT** - 基于 ftrace 的 hooking(18 个 syscalls)
- **Diamorphine** - syscall 表修补
- **KoviD** - 基于 kprobes 的隐藏
检测取决于在 rootkit 之前加载 ksentinel。
## 系统要求
**内核配置:**
- CONFIG_KALLSYMS=y
- CONFIG_KPROBES=y
- CONFIG_MODULES=y
**支持的内核:**
- Linux 5.4 到 6.12+
- x86_64 架构(LSTAR 检查)
- ARM64 支持(无 LSTAR 检查)
## 局限性
1. **仅检测** - 不阻止或移除 rootkit
2. **基线假设** - 假设模块加载时内核是干净的
3. **竞态条件** - 在 ksentinel 之前加载的 rootkit 无法被检测
4. **规避** - 复杂的 rootkit 可以针对监控代码本身
## 安全注意事项
- 尽早在启动过程中加载 ksentinel
- 安全地离线存储解锁密钥
## 故障排除
### 模块无法加载
检查内核配置:
```
grep -E "KALLSYMS|KPROBES" /boot/config-$(uname -r)
```
### 模块无法卸载
该模块已隐藏并启用了反卸载保护。请先解锁:
```
sudo ./ksentinel-manager.sh unlock
```
## 开发
```
make clean # clean build artifacts
make # compile module
make install # load module
make uninstall # unload module
```
## 贡献
欢迎贡献。请保持代码风格,并为新功能添加测试。
## 许可证
GPL-2.0-only
本程序是按 GPL version 2.0 许可的自由软件。任何修改必须保留对原作者的署名,并在相同许可下分发。
有关完整条款,请参阅 LICENSE 文件。
## 作者
**MatheuZSecurity**
Rootkit 研究人员社区:https://discord.gg/66N5ZQppU7
## 免责声明
本工具用于安全研究和系统管理。请负责任地使用。作者不对滥用或本软件造成的损害负责。标签:Cutter, EDR组件, FNV-1a哈希, Ftrace保护, Kprobes监测, Linux内核安全, Linux安全管理, LSTAR MSR验证, Syscall Hooking, VFS层监控, 入侵检测系统, 内核态开发, 内核模块, 反Rootkit, 安全数据湖, 安全资源, 完整性校验, 客户端加密, 特权提升防护, 网络安全栈监控, 防御规避检测