m0ck1ng/sect
GitHub: m0ck1ng/sect
SECT 是首个基于 eBPF 与 sched_ext 的 Linux 内核原生并发模糊测试框架,通过可编程调度策略系统性地检测内核并发漏洞。
Stars: 2 | Forks: 0
# SECT — Sched-Ext 并发测试器
SECT 通过 LLVM pass 注入的细粒度调度点序列化内核执行,随后通过 `sched_ext` (SCX) eBPF 框架控制线程交错,从而系统地测试 Linux 内核中的并发漏洞。
## 仓库结构
```
.
├── instrumentation/ # LLVM pass — injects scheduling points into kernel code
├── scheduler/ # SECT eBPF scheduler (sched_ext)
├── scripts/
│ ├── kernel/ # Kernel setup (setup_kernel.sh, compile.sh, KCONFIG.config)
│ ├── triage/ # Syzbot bug report fetching and caching
│ └── analysis/ # Experiment result plotting
├── benchmarks/ # 10 known kernel concurrency bugs with reproducers
├── configs/ # Example configuration files
├── syzkaller/ # SECT fork of syzkaller (patched for SCHED_EXT)
├── ./build.sh # Script which fully builds SECT, the target kernel, and all dependencies in a Docker environment
├── ./copy.sh # Script to copy files from the host system to a live running guest instance VM; useful for quick iteration during development
└── Dockerfile # Dockerfile for the build environment used by build.sh
```
有关 LLVM pass 的构建细节,请参阅 [`instrumentation/README.md`](instrumentation/README.md);有关完整的漏洞列表,请参阅 [`benchmarks/README.md`](benchmarks/README.md)。
## 前置条件
- Docker
- debootstrap(通过 `./build.sh` 使用 `apt` 安装)
- 支持 KVM 的 QEMU(通过 `./build.sh` 使用 `apt` 安装)
- git
如果您想在 docker 环境之外构建 SECT,您需要:
- Clang/LLVM 16(`clang-16`、`ld.lld-16`、`llvm-ar-16` 等)—— 用于 SECT LLVM 插桩 pass
- CMake ≥ 3.13 —— 用于 SECT LLVM 插桩 pass
- 标准内核构建依赖 —— 由 `compile.sh` 自动安装:
`build-essential bc flex bison libssl-dev libelf-dev libncurses-dev dwarves pahole`
**目标内核:** Linux `v6.13-rc4`(其他版本需要手动调整 `build.sh`,并且如果内核版本破坏了 API 兼容性,可能会产生破坏性更改)
## 快速开始
```
./build.sh
```
该脚本会...
1. 设置目标内核和 SECT 插桩(通过 `scripts/kernel/setup_kernel.sh`)
2. 创建用于编译目标内核和 SECT 的 docker 镜像
3. 使用 SECT 插桩编译目标内核(通过 `scripts/kernel/compile.sh`)
4. 创建用于运行模糊测试实例的磁盘镜像(通过 `tools/syzkaller/create_image.sh`)
5. 编译 SECT eBPF 调度器
6. 编译用于并发模糊测试的 SECT-syzkaller 程序
7. 填充模板值,以便通过 `syz-manager` 运行 SECT 模糊测试活动
在这些步骤中,只有步骤 2、4 和 7 是在宿主机系统上运行的。
所有其他步骤都将在 docker 容器内通过挂载卷运行,以避免依赖版本不匹配的问题。
要运行 SECT,只需执行:
```
./syzkaller/bin/syz-manager -config configs/syzkaller.cfg.example
```
控制面板可通过 `http://0.0.0.0:56741` 访问。
## 运行单个程序
要在模糊测试活动之外运行 SECT 调度器以进行漏洞复现,首先请确保您已按照上述说明运行了 `./build.sh`。
1. 接下来,您可以使用 `./run_qemu.sh` 启动一个运行目标内核的 VM(登录用户名为 `root`)
2. 然后,使用 `./copy.sh` 将所有相关文件复制到 VM 中
3. 文件复制完成后,*在另一个终端窗口中*,使用 `ssh -p 10021 -i ./bullseye.id_rsa root@localhost` 通过 SSH 连接到客户机
此时,您应该有两个在 VM 内部打开的终端窗口
4. 在其中一个窗口中,运行 `./scx_serialise -r 2` 以使用随机游走算法启动 SECT 调度器
5. 在*另一个窗口中*,运行 `./syz-execprog -procs 2 -repeat 1000 ./benchmarks/CVE-2023-31083/repro.prog` 将 CVE-2023-31083 程序执行 1000 次
6. 运行程序后,请务必在第一个窗口中通过 Ctrl-C 卸载调度器,然后再运行另一个程序
这些步骤可以使用不同的 Syzkaller 程序和算法重复进行。
### 用法
```
Usage: scx_serialise [-n NUM_THREADS] [-d DEPTH] [-r ALGO]
-n NUM Threads expected in each syz-executor cycle (default: 2).
-d DEPTH PCT search depth (default: 3).
-r ALGO Scheduling algorithm:
1 = Random Priority
2 = Random Walk
3 = PCT (default)
4 = POS
-h Display this help and exit.
```
## 基准测试
用于论文评估的基准测试表示为单个补丁文件,可应用于 Linux 内核的 `v6.13-rc4` 版本。
此补丁*默认已由* build.sh 脚本*应用*。
可以通过将相应的环境变量编辑为 `APPLY_BENCH_PATCH=0` 来禁用此补丁的应用。
标签:Bash脚本, Docker镜像, EVTX分析, Linux内核, LLVM Pass, sched_ext, 并发漏洞测试, 请求拦截