update README
在面向终端、边缘设备和智能系统的运行环境中,操作系统往往要同时处理感知输入、业务计算、设备控制、网络通信和安全防护等任务。这些任务的目标并不一致:业务任务希望获得稳定的 CPU 时间和较低响应延迟,安全任务则更关心关键事件能否在风险扩大前被处理。调度器如果只按普通计算任务来分配资源,安全任务可能被延后;如果简单提高安全任务优先级,又可能打断业务执行,降低系统吞吐和实时性。
系统审计是安全感知任务调度的代表性场景。内核会记录系统调用、进程退出等关键事件,为攻击检测、溯源分析和安全取证提供依据。审计日志生成后会先停留在内核或共享缓冲区中,如果处理不及时,日志可能在安全持久化或远端传输前被篡改;如果每次产生日志都同步处理,业务线程又会被频繁打断。因此,审计系统的关键矛盾在于功能任务和安全任务之间的调度协同:安全审计任务需要在明确时限内运行,功能任务也需要维持可接受的执行效率。
现有软件审计方案通常只能满足其中一侧需求。独立进程式审计处理具备清晰的调度实体,便于及时唤醒安全任务,但频繁跨进程切换会带来较高开销;嵌入式或异步审计处理运行开销较低,但安全任务缺少独立调度实体,容易因为调度延迟导致日志在缓冲区中停留过久。通用调度器主要面向普通任务的公平性、优先级和吞吐量,缺少对安全时限、日志驻留时间和安全任务关联关系的表达能力。
NoTamper 从安全审计切入,将审计处理建模为与业务线程关联的安全任务。系统为每个被审计线程维护对应的用户态审计处理线程,并在系统调用返回、线程退出、缓冲区状态变化、业务线程让出 CPU 等关键时机触发处理。该模型使安全任务既具备可调度的实体和明确触发时机,又尽量靠近功能任务执行上下文,减少跨进程调度和数据搬运开销。通过这一原型,可以验证安全任务与功能任务协同调度在 OpenHarmony/Linux 内核环境中的可行性,并为“安全感知任务调度”这一参考案例提供具体落点。
NoTamper 在日志安全性和业务开销之间取得了较好的平衡:
本项目作者团队来自北京大学计算机学院,队长黄瑞哲,指导老师为北京大学计算机学院助理教授李锭老师。
本仓库交付一个可构建、可加载、可运行基础验证的安全感知任务调度原型以及相应的技术报告,主要内容包括:
kmodule/
consumer/
docs/
CMakeLists.txt
generate_cmake.sh
具体来说,仓库目录如下所示
. ├── kmodule/ # 内核模块:事件采集、缓冲区管理、调度触发和控制接口 ├── consumer/ # 用户态审计处理程序、RDMA 传输逻辑和内存保护支持 ├── include/ # 内核态与用户态共享的数据结构、ioctl 定义和配置模板 ├── scripts/ │ ├── ctrl/ # 控制工具,用于查看统计、导出日志和调整缓冲区参数 │ ├── tests/ # 基础测试程序,包括普通进程、多线程和压力场景 │ └── deps/ # 依赖准备脚本,用于获取 musl 和 RDMA verbs 相关依赖 ├── docs/ # 技术报告和实验图表 ├── CMakeLists.txt # 顶层构建入口 └── generate_cmake.sh # 示例 CMake 配置脚本
NoTamper 包含两个主要组件:
本项目主要在 openEuler 22.03 LTS、Linux 5.10 内核环境下测试。对于 OpenHarmony Linux 内核环境,需要保证内核具备对应 tracepoint 和模块构建能力。
make
CMake
--static-pie
pkg-config
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.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 可以使用整数,也可以使用 Kib、Mib 作为单位。例如,4*Mib 也可以写成 4096*1024。
Kib
Mib
4*Mib
4096*1024
NoTamper 还支持自定义日志路径格式。默认格式类似于 STORE_PATH/%u-%ld.buf,其中包含线程 ID 和纳秒级时间戳。可以通过 PATH_FORMAT 指定其他路径格式:
STORE_PATH/%u-%ld.buf
PATH_FORMAT
cmake .. -DPATH_FORMAT=/dev/pts/1
NoTamper 可以使用 Intel Protection Key(PKEY)保护用户态审计处理程序的内存区域,降低业务线程误写或恶意修改审计缓冲区的风险。如果运行环境不支持 PKEY,需要关闭该功能,否则可能因为执行不支持的指令而触发异常。
默认配置中 PKEY 支持关闭。如需开启,可在 CMake 中指定:
cmake .. -DPKEY_SUPPORT=on
如果需要显式关闭:
cmake .. -DPKEY_SUPPORT=off
版权所有:中国计算机学会技术支持:开源发展技术委员会 京ICP备13000930号-9 京公网安备 11010802047560号
NoTamper:面向安全感知任务调度的审计任务协同调度原型
1. 项目简介
在面向终端、边缘设备和智能系统的运行环境中,操作系统往往要同时处理感知输入、业务计算、设备控制、网络通信和安全防护等任务。这些任务的目标并不一致:业务任务希望获得稳定的 CPU 时间和较低响应延迟,安全任务则更关心关键事件能否在风险扩大前被处理。调度器如果只按普通计算任务来分配资源,安全任务可能被延后;如果简单提高安全任务优先级,又可能打断业务执行,降低系统吞吐和实时性。
系统审计是安全感知任务调度的代表性场景。内核会记录系统调用、进程退出等关键事件,为攻击检测、溯源分析和安全取证提供依据。审计日志生成后会先停留在内核或共享缓冲区中,如果处理不及时,日志可能在安全持久化或远端传输前被篡改;如果每次产生日志都同步处理,业务线程又会被频繁打断。因此,审计系统的关键矛盾在于功能任务和安全任务之间的调度协同:安全审计任务需要在明确时限内运行,功能任务也需要维持可接受的执行效率。
现有软件审计方案通常只能满足其中一侧需求。独立进程式审计处理具备清晰的调度实体,便于及时唤醒安全任务,但频繁跨进程切换会带来较高开销;嵌入式或异步审计处理运行开销较低,但安全任务缺少独立调度实体,容易因为调度延迟导致日志在缓冲区中停留过久。通用调度器主要面向普通任务的公平性、优先级和吞吐量,缺少对安全时限、日志驻留时间和安全任务关联关系的表达能力。
NoTamper 从安全审计切入,将审计处理建模为与业务线程关联的安全任务。系统为每个被审计线程维护对应的用户态审计处理线程,并在系统调用返回、线程退出、缓冲区状态变化、业务线程让出 CPU 等关键时机触发处理。该模型使安全任务既具备可调度的实体和明确触发时机,又尽量靠近功能任务执行上下文,减少跨进程调度和数据搬运开销。通过这一原型,可以验证安全任务与功能任务协同调度在 OpenHarmony/Linux 内核环境中的可行性,并为“安全感知任务调度”这一参考案例提供具体落点。
1.1 核心思路
1.2 挑战
1.3 主要贡献
1.4 核心结果
NoTamper 在日志安全性和业务开销之间取得了较好的平衡:
1.5 作者介绍
本项目作者团队来自北京大学计算机学院,队长黄瑞哲,指导老师为北京大学计算机学院助理教授李锭老师。
2. 目录结构
本仓库交付一个可构建、可加载、可运行基础验证的安全感知任务调度原型以及相应的技术报告,主要内容包括:
kmodule/:内核模块,实现系统调用 tracepoint 注册、进程/线程审计上下文管理、事件封装、缓冲区管理、调度触发和 ioctl 控制接口。consumer/:用户态审计处理程序和 RDMA 接收端,实现缓冲区映射、日志消费、远端写入以及 PKEY 相关内存保护逻辑。docs/:技术报告和实验图表,用于说明系统设计、调度机制、实验结果和与赛题方向的关系。CMakeLists.txt与generate_cmake.sh:构建配置入口,用于生成内核模块、用户态程序、控制工具和测试程序。具体来说,仓库目录如下所示
3. 快速开始
NoTamper 包含两个主要组件:
kmodule/,可在未修改的 Linux 内核上构建和加载。consumer/,负责消费内核暴露的审计缓冲区,并支持本地写入或 RDMA 传输。本项目主要在 openEuler 22.03 LTS、Linux 5.10 内核环境下测试。对于 OpenHarmony Linux 内核环境,需要保证内核具备对应 tracepoint 和模块构建能力。
3.1 环境要求
makeCMake--static-pie的 GCC/G++ 8.0 以上版本pkg-configCONFIG_TRACEPOINTSCONFIG_HAVE_SYSCALL_TRACEPOINTS获取 musl libc:
获取 RDMA Infiniband verbs 依赖:
3.2 构建与加载
执行完成后,内核模块会被加载。生成的模块文件名为
notamper.ko。3.3 配置说明
NoTamper 支持通过 CMake 配置以下参数:
BUFFER_SIZE:每个线程审计缓冲区大小,默认值为2*Kib。CONSUMER_PATH:用户态审计处理程序路径,默认值为${PROJECT_BINARY_DIR}/consumer/consumer。STORE_PATH:审计数据存储路径,默认值为/tmp/notamper。STACK_SIZE:用户态审计处理线程栈大小,默认值为1*Mib。示例:
BUFFER_SIZE可以使用整数,也可以使用Kib、Mib作为单位。例如,4*Mib也可以写成4096*1024。NoTamper 还支持自定义日志路径格式。默认格式类似于
STORE_PATH/%u-%ld.buf,其中包含线程 ID 和纳秒级时间戳。可以通过PATH_FORMAT指定其他路径格式:3.4 PKEY 支持
NoTamper 可以使用 Intel Protection Key(PKEY)保护用户态审计处理程序的内存区域,降低业务线程误写或恶意修改审计缓冲区的风险。如果运行环境不支持 PKEY,需要关闭该功能,否则可能因为执行不支持的指令而触发异常。
默认配置中 PKEY 支持关闭。如需开启,可在 CMake 中指定:
如果需要显式关闭:
4. 文档索引