dynamo-pentester/sentinel-x
GitHub: dynamo-pentester/sentinel-x
SENTINEL-X 是一款跨平台内核完整性监控器,通过同步拦截与周期性结构检查检测内核级 rootkit 攻击,并将检测证据锚定至以太坊区块链以实现防篡改取证。
Stars: 1 | Forks: 0
# SENTINEL-X
**跨平台内核完整性监控器与基于区块链锚定的取证证据**
## 功能简介
运行于 Ring-0 的内核 rootkit 通过简单的竞态击败了传统扫描器:在一次扫描间隔内完成安装、运行并删除痕迹。SENTINEL-X 通过**双层架构**消除了这种竞态:
- **同步层** — kprobe/kretprobe 处理程序在首次调用违规内核函数时触发,不依赖于任何计时器。检测延迟:针对四类攻击低于 **5 ms** (p95)。
- **周期层** — `guard_tick()` 以 2 秒为周期强制执行九项结构性内核不变量,涵盖需要随时间进行观测的攻击。
- **证据流水线** — 每一次检测均经过 ECDSA-P256 签名、AES-256-GCM 加密、Merkle 批处理,并锚定至 Ethereum Sepolia 智能合约,以实现防篡改的第三方审计。
**评估结果(每个阶段 n=100 次试验):** 在所有 9 个 Linux 攻击阶段和 2 个 Windows 阶段中,真阳性率达到 100%。假阳性率为 2.0%,仅限于已记录文档的 `do_task_dead()` 内核线程退出路径。
## 架构
```
┌─────────────────────────────────────────────────────────────────┐
│ KERNEL SPACE (Ring 0) │
│ │
│ sentinelx.ko (Linux, kernel 6.18) │
│ Periodic layer: guard_tick() every 2s │
│ SCT baseline diff, CR0 read, LSTAR rdmsr, │
│ FNV-1a prologue hash, task-list walk (DKOM) │
│ Synchronous layer: kprobe / kretprobe │
│ commit_creds, nf_register_*, register_ftrace_*, │
│ do_init_module, wake_up_new_task, do_exit │
│ │
│ ksentinel.sys (Windows 10 x64, KMDF) │
│ SSDT scanner: 489 entries vs ntoskrnl bounds │
│ PE image scanner: MZ/PE walk across 1,927 MB │
└──────────────┬──────────────────────────────────────────────────┘
│ /dev/kmsg (Linux)
│ IOCTL_READ_EVENT (Windows)
┌──────────────▼──────────────────────────────────────────────────┐
│ USER SPACE │
│ sentinel_daemon.py │
│ LinuxBridge / WindowsBridge → event_parser.py │
│ → evidence_manager.py │
│ ECDSA-P256 sign → AES-256-GCM encrypt │
│ → SHA-256 Merkle tree (batch=32) │
│ → Ethereum Sepolia smart contract anchor │
│ → SQLite (sentinel.db) │
└─────────────────────────────────────────────────────────────────┘
```
## 检测覆盖范围
### Linux (内核 6.18)
| 阶段 | 攻击 | 方法 | 层级 | 平均延迟 |
|-------|--------|--------|-------|-------------|
| S1 | SCT Hook | Baseline diff | Periodic | 1,651 ms |
| S2 | CR0 WP Tamper | Per-CPU `read_cr0()` | Periodic | 1,699 ms |
| S3 | LSTAR Tamper | `rdmsr(MSR_LSTAR)` | Periodic | 2,035 ms |
| S4 | Prologue Hook | FNV-1a hash | Periodic | 1,675 ms |
| S5 | Module Hide | kretprobe on `do_init_module` | Sync | 137 ms |
| S6 | Priv. Escalation | kprobe on `commit_creds` | Sync | 2.5 ms |
| S7 | Netfilter Hook | kprobe on `nf_register_*` | Sync | 3.0 ms |
| S8 | ftrace Hook | kprobe on `register_ftrace_*` | Sync | 3.7 ms |
| S9 | DKOM | kprobe + periodic poll | Hybrid | 5,096 ms |
### Windows (10 x64, 22H2)
| 阶段 | 攻击 | 方法 | 平均延迟 |
|-------|--------|--------|-------------|
| W1 | SSDT Hook (NtYieldExecution) | SSDT entry bounds check | 9,811 ms |
| W2 | DKOM via ZwQSI hook | SSDT scanner | Verified† |
| W3 | Driver Hide (PsLoadedModuleList unlink) | PE image scan | 5,836 ms |
† W2 在评估测试工具记录延迟之前触发了 PatchGuard bugcheck (0x109)。检测已通过重启后从 `sentinel.db` 的 WAL 恢复中得到确认。
## 仓库结构
```
sentinel-x/
├── sentinelx/ # Linux LKM source (sentinelx.c, Makefile)
├── sentinelx-windows/ # Windows KMDF driver (driver.c, dkom.c, ssdt.c)
├── rootkit-test/ # Linux test rootkit (sentinel_test_rootkit.c)
├── sentinel-test-windows/ # Windows test driver (sentinel_test_win.c)
├── bridge/ # OS bridge layer
│ ├── linux_bridge.py # /dev/kmsg reader
│ ├── windows_bridge.py # IOCTL_READ_EVENT poller
│ ├── event_parser.py # KernelEvent schema parser
│ └── os_detector.py
├── src/ # Evidence pipeline
│ ├── evidence_manager.py # Sign + encrypt + Merkle + anchor
│ ├── crypto_utils.py # ECDSA-P256, AES-256-GCM, HKDF
│ ├── db_utils.py # SQLite schema and queries
│ ├── merkle_utils.py # SHA-256 Merkle tree
│ └── web3_utils.py # Sepolia Web3 + contract interaction
├── evaluation/ # Eval scripts and results
│ ├── run_linux_eval.sh
│ ├── run_windows_eval.ps1
│ ├── analyze_results.py
│ └── results/ # CSV + summary files per stage
├── sentinel_daemon.py # Unified daemon (Linux + Windows)
├── deploy_contract.py # MILBASTERLog Solidity contract deploy
├── check.py # Blockchain verification tool
├── setup.sh # Automated setup (Ubuntu/Kali)
├── MILBASTERLog_abi.json # Smart contract ABI
├── .env.example # Config template
└── requirements.txt
```
## 快速开始
### 前置条件
- **Linux:** Kali 2025 / Ubuntu 24.04,内核 6.17–6.18,内核头文件,Python 3.10+
- **Windows:** Windows 10 x64 (22H2),WDK,启用测试签名,推荐使用 VirtualBox
### Linux 设置
```
# 1. Clone 并安装 Python dependencies
git clone https://github.com/dynamo-pentester/sentinel-x.git
cd sentinel-x
pip install -r requirements.txt
# 2. 配置环境
cp .env.example .env
# 编辑 .env — 添加你的 Infura/Alchemy RPC URL 和 Ethereum key
# 3. 构建 LKM
cd sentinelx
make
cd ..
# 4. 加载 monitor
sudo insmod sentinelx/sentinelx.ko
# 5. 启动 daemon
sudo python3 sentinel_daemon.py
# 实时查看警报(单独的终端)
sudo dmesg -w | grep sentinelx
```
### Windows 设置
有关驱动构建说明,请参阅 [`sentinelx-windows/README_BUILD.txt`](sentinelx-windows/README_BUILD.txt)。
以管理员身份运行守护进程:
```
python sentinel_daemon.py
```
### 验证区块链锚定
```
python3 check.py
```
## 运行评估
### Linux(每个阶段 100 次运行,所有阶段)
```
cd evaluation/
sudo bash run_linux_eval.sh
python3 analyze_results.py # generates LaTeX table + summary
```
### Windows(阶段 1 和 3 — 自动化)
```
# 以 Administrator 身份:
powershell -ExecutionPolicy Bypass -File evaluation\run_windows_eval.ps1 -Runs 100 -Stage "1,3"
```
### Windows 阶段 W2(手动)
W2 通过挂钩(Hook)`ZwQuerySystemInformation` 来隐藏目标 PID。PatchGuard 检测到 SSDT 损坏并发出 bugcheck 0x109,在评估测试工具记录延迟之前终止了虚拟机。请手动运行:
```
# 打开 notepad,记录其 PID,然后:
reg add "HKLM\SYSTEM\CurrentControlSet\Services\sentinel_test\Parameters" /v TargetPid /t REG_DWORD /d /f
powershell -ExecutionPolicy Bypass -File evaluation\run_windows_eval.ps1 -Runs 1 -Stage "2"
# 重启后可从 sentinel.db WAL 恢复检测
```
## 证据流水线
每个检测到的事件均遵循论文中的算法 1:
```
event_json → ECDSA-P256 sign → AES-256-GCM encrypt
→ SHA-256 leaf hash → Merkle tree (batch 32)
→ Sepolia smart contract anchor (root hash)
→ SQLite persist (encrypted blob + proof)
```
任何第三方都可以通过从存储的叶子节点哈希重新计算 Merkle 包含路径,并将根节点与链上锚定进行比对检查,从而在不访问原始数据的情况下验证记录。
## 配置
将 `.env.example` 复制为 `.env` 并填写:
| 变量 | 描述 |
|----------|-------------|
| `SENTINEL_NODE_ID` | 用于证据签名的节点标识符 |
| `INFURA_SEPOLIA_URL` | Alchemy/Infura Sepolia RPC endpoint |
| `PRIVATE_KEY` | Ethereum 钱包私钥(十六进制,无 0x) |
| `ACCOUNT` | Ethereum 钱包地址 |
| `CONTRACT_ADDR` | 已部署的 MILBASTERLog 合约地址 |
| `ANCHOR_BATCH_SIZE` | 每个 Merkle 批次的事件数(默认:32) |
| `ANCHOR_INTERVAL` | 锚定工作线程的间隔时间(秒)(默认:60) |
**切勿将 `.env` 或 `keystore/*_priv.pem` 提交到版本控制系统中。**
## 局限性
- **DKOM 假阳性 (2.0%):** `do_task_dead()` 会绕过 `do_exit` kprobe。修复方案(在 `do_task_dead` 上使用 kprobe 并结合 PID 命名空间交叉引用)正在进行中。
- **负载下的扫描周期膨胀:** `guard_tick()` 遍历 595 个符号;在 VirtualBox CPU 争用的情况下,有效周期可能会达到 22–27 秒。计划将监视列表拆分为较小的计划工作项。
- **纯数据子区间攻击:** 如果攻击者在未调用任何配置了 kprobe 的函数的情况下修改了内核数据结构,并在下一次周期性 tick 之前完成攻击,则可以逃过这两层的检测。这是所有纯软件内核监控器共同面临的基本约束。
- **自我针对型攻击者:** 能够修改 SENTINEL-X 自身 kprobe 处理程序内存的 Ring-0 攻击者可以禁用检测。这超出了既定的威胁模型。
## 安全提示
包含的测试 rootkit(`rootkit-test/`、`sentinel-test-windows/`)**仅用于评估目的**。它们只在启用了测试签名的隔离虚拟机中运行,不适用于在生产系统上部署。Linux 测试 rootkit 可以通过 `rmmod` 完全逆转(卸载)。
## 许可证
研究原型。有关条款,请参阅 LICENSE。
## 引用
```
@article{rishikesh2026sentinelx,
title = {{SENTINEL-X}: A Cross-Platform Kernel Integrity Monitor
with Verifiable Blockchain-Anchored Forensic Evidence},
author = {Rishikesh, R},
journal = {(under review)},
year = {2026}
}
```
标签:Linux内核, Windows驱动开发, 内核完整性监控, 区块链存证, 取证, 客户端加密, 逆向工具