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, 并发漏洞测试, 请求拦截