SPiCa - 基于eBPF的内核级Rootkit检测引擎
项目简介
SPiCa是一个用Rust编写的高性能eBPF rootkit检测引擎。其设计理念受初音未来歌曲《SPiCa》启发,如同守护之星一般监视系统。架构上采用"双星系统":两个独立的观测通道围绕同一进程空间运行,各自基于不同的物理机制,形成无法通过攻击单一通道就能使其失效的检测系统。
核心架构
SPiCa维护两个独立的观测通道和一个用户空间差异分析引擎:
通道1 - BTF跟踪点(sched_switch)
- 附加到内核sched_switch BTF跟踪点的eBPF程序
- 每次进程被调度到CPU时触发
- 通过CO-RE直接从内核内存读取task_struct,绕过可被hook的helper函数
- 提取pid、tgid和comm信息并通过RingBuf推送到用户空间
通道2 - NMI性能事件(硬件CPU周期计数器)
- 通过硬件PMU周期计数器驱动的非屏蔽中断(NMI)触发
- NMI无法被软件级的cli/sti指令屏蔽
- 抵御可击败商业EDR产品的软件hook攻击
混淆层 - 运行时PID掩码
- 使用64位密钥对PID值进行XOR加密后再写入ring buffer
- 密钥从/dev/urandom生成,每小时轮换一次
- 击败rootkit的PID过滤攻击(如Singularity)
- 与NMI通道形成正交防御机制
差异分析引擎(用户空间)
- 基于Tokio的用户空间FSM
- 读取两个ring buffer和/proc
- 交叉关联三种检测信号进行异常识别
技术特点
- 通过直接读取内核内存建立CPU执行事件的"ground truth"
- 刻意绕过可被rootkit hook的helper函数
- 实施"内核主权"原则
- 使用硬件级防护机制(NMI)抵御软件级攻击
项目信息
- 许可证:GPL-2.0
- 最新版本:v2.1(2026年3月)
- 主要更新:修复竞态条件、停止选择性PID过滤、添加硬件验证
https://github.com/0xkirisame/spica
Rust 的借用检查器本身不是难点——难的是数据流设计
核心观点
作者在深入使用 Rust 后发现,借用检查器(borrow checker)本身并不是真正的难题。
真正的挑战
- 难点在于:设计出能让借用检查器满意的数据流方式
- 与其他语言的区别:
- 其他语言:先写逻辑,后处理 bug
- Rust:必须在架构设计阶段就预先考虑所有权、可变性和生命周期,而不能事后补救
实际影响
- 很多时候"修复"问题不是改一行代码,而是需要重构整个实现方式:
- 拆分结构体
- 改变函数边界
- 避免共享可变状态等
设计理念转变
Rust 实际上是在强制开发者采用更函数式/面向数据的设计风格,即使你一开始并没有这个打算。
https://old.reddit.com/r/rust/comments/1rw12u6/rusts_borrow_checker_isnt_the_hard_part_its/
--
From 日报小组 Mike
社区学习交流平台订阅:
1
共 0 条评论, 1 页
评论区
写评论还没有评论