目录

NoTamper:面向安全审计的安全感知任务调度原型

项目简介

系统审计是操作系统中常见的安全基础能力,负责记录系统调用、进程退出等关键事件,为攻击检测、溯源分析和安全取证提供依据。一个实用的审计系统需要同时满足两个目标:审计日志要尽快离开临时缓冲区,避免在持久化或远端传输前被篡改;审计处理本身也不能给业务程序带来过高运行开销。

现有软件审计方案通常难以同时兼顾这两个目标。采用独立进程处理日志时,审计任务可以被调度器单独管理,但频繁的跨进程切换会带来较高开销;采用嵌入式或异步处理方式时,运行开销较低,但日志处理任务缺少明确的调度实体,容易因为调度延迟导致日志在缓冲区中停留过久。这里的核心矛盾在于,安全处理有明确的时限需求,而通用任务调度机制并不了解这些安全语义。

NoTamper 面向“安全感知任务调度”这一问题,将审计处理建模为与业务线程关联的安全任务。系统为每个被审计线程维护对应的用户态审计处理线程,并在系统调用返回、线程退出、缓冲区状态变化、业务线程让出 CPU 等关键时机触发处理。相比普通异步审计,NoTamper 让安全任务具备可调度的实体和更明确的触发时机;相比独立进程式审计,它减少了跨进程调度和数据搬运开销。通过这种方式,可以在较低性能开销下缩短审计日志驻留时间,为 OpenHarmony/Linux 环境中的安全感知调度提供一个可验证的原型。

核心思路

  • 安全任务与业务任务关联:为被审计线程维护对应的审计处理线程,使日志处理与业务执行形成明确的一对一关系。
  • 基于事件的调度触发:在系统调用、线程退出、缓冲区接近满、线程即将让出 CPU 等时机触发审计处理,减少无意义轮询。
  • 降低日志驻留时间:通过及时调度审计任务,让日志尽快离开临时缓冲区,缩短安全风险窗口。
  • 控制业务侧开销:审计处理尽量放在关联任务中完成,减少跨进程切换、额外拷贝和同步阻塞对业务程序的影响。
  • 支持安全数据通路:结合共享映射、PKEY 内存保护和 RDMA 传输等机制,为审计任务提供低开销的数据搬运路径。

挑战

  • 安全需求难以表达给调度器:传统调度通常关注公平性、优先级和吞吐量,缺少“日志必须尽快处理”这类安全时限语义。
  • 审计任务不能过早或过晚运行:过早运行会增加无效调度,过晚运行会扩大日志驻留时间,需要根据业务线程活动动态决定触发时机。
  • 业务线程与安全线程需要协同:审计线程既要跟随业务线程产生的事件,又不能长期抢占业务线程导致性能下降。
  • 内核态和用户态需要一致配合:内核负责事件采集和调度触发,用户态负责日志转储和远端传输,两侧数据结构、缓冲区状态和异常路径必须保持一致。
  • 安全处理过程应尽量原子化:审计任务运行期间如果频繁阻塞、缺页或等待锁,会重新拉长风险窗口,因此需要减少不确定等待。

开发量 & 交付件

本仓库交付一个可构建、可加载、可运行基础验证的安全感知调度原型以及相应的技术报告,主要内容包括:

  • kmodule/:内核模块,实现系统调用 tracepoint 注册、进程/线程审计上下文管理、事件封装、缓冲区管理、调度触发和 ioctl 控制接口。
  • consumer/:用户态审计处理程序和 RDMA 接收端,实现缓冲区映射、日志消费、远端写入以及 PKEY 相关内存保护逻辑。
  • 顶层 CMakeLists.txtgenerate_cmake.sh:构建配置入口,用于生成内核模块、用户态程序、控制工具和测试程序。
  • 技术报告: 详细阐述了 NoTamper 的设计思路、实现细节和性能评估。

快速开始

NoTamper 包含两个主要组件:

  • 内核模块:代码位于 kmodule/,可在未修改的 Linux 内核上构建和加载。
  • 用户态审计处理程序:代码位于 consumer/,负责消费内核暴露的审计缓冲区,并支持本地写入或 RDMA 传输。

本项目主要在 openEuler 22.03 LTS、Linux 5.10 内核环境下测试。对于 OpenHarmony Linux 内核环境,需要保证内核具备对应 tracepoint 和模块构建能力。

环境要求

  • make
  • CMake
  • 支持 --static-pie 的 GCC/G++ 8.0 以上版本
  • pkg-config
  • Linux 内核需要启用以下配置:
    • CONFIG_TRACEPOINTS
    • CONFIG_HAVE_SYSCALL_TRACEPOINTS

获取 musl libc:

./scripts/deps/getmusl.sh <NoTamper 项目绝对路径>

获取 RDMA Infiniband verbs 依赖:

./scripts/deps/getibverbs.sh <NoTamper 项目绝对路径>

构建与加载

mkdir build
cd build
cmake ..
make load

执行完成后,内核模块会被加载。生成的模块文件名为 notamper.ko

配置说明

NoTamper 支持通过 CMake 配置以下参数:

  • BUFFER_SIZE:每个线程审计缓冲区大小,默认值为 2*Kib
  • CONSUMER_PATH:用户态审计处理程序路径,默认值为 ${PROJECT_BINARY_DIR}/consumer/consumer
  • STORE_PATH:审计数据存储路径,默认值为 /tmp/notamper
  • STACK_SIZE:用户态审计处理线程栈大小,默认值为 1*Mib

示例:

cmake .. -DBUFFER_SIZE=4*Mib -DCONSUMER_PATH=/my/path/to/consumer -DSTORE_PATH=/my/path/to/store

BUFFER_SIZE 可以使用整数,也可以使用 KibMib 作为单位。例如,4*Mib 也可以写成 4096*1024

NoTamper 还支持自定义日志路径格式。默认格式类似于 STORE_PATH/%u-%ld.buf,其中包含线程 ID 和纳秒级时间戳。可以通过 PATH_FORMAT 指定其他路径格式:

cmake .. -DPATH_FORMAT=/dev/pts/1

PKEY 支持

NoTamper 可以使用 Intel Protection Key(PKEY)保护用户态审计处理程序的内存区域,降低业务线程误写或恶意修改审计缓冲区的风险。如果运行环境不支持 PKEY,需要关闭该功能,否则可能因为执行不支持的指令而触发异常。

默认配置中 PKEY 支持关闭。如需开启,可在 CMake 中指定:

cmake .. -DPKEY_SUPPORT=on

如果需要显式关闭:

cmake .. -DPKEY_SUPPORT=off
关于
819.0 KB
邀请码
    Gitlink(确实开源)
  • 加入我们
  • 官网邮箱:gitlink@ccf.org.cn
  • QQ群
  • QQ群
  • 公众号
  • 公众号

版权所有:中国计算机学会技术支持:开源发展技术委员会
京ICP备13000930号-9 京公网安备 11010802047560号