< 返回版块

Mike Tang 发表于 2026-03-19 14:01

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 页