QGrain/SyzGPT

GitHub: QGrain/SyzGPT

SyzGPT 是一个由 LLM 辅助的内核模糊测试框架,利用基于依赖的 RAG 技术自动为低频系统调用生成有效种子,从而提升内核测试覆盖率和漏洞发现能力。

Stars: 63 | Forks: 6

# SyzGPT:利用基于依赖的 RAG 解锁内核模糊测试中的低频系统调用
Artifact Zenodo Hugging Face DeepWiki
## 📰 新闻 | 日期 📢 | 更新 🔎 | |------|--------| | **2026 年 4 月** | 我们分享了关于 SyzGPT 在 AI 智能体时代如何演进的思考——为什么 DRAG 仍然重要,以及智能体可以在哪些方面提供帮助。详情请阅读 [智能体时代的 SyzGPT](docs/SyzGPT_in_the_era_of_agent.md)。 | | **2025 年 9 月** | 我们提供了正确复现 SyzGPT 的指南,以方便与相关工作进行比较。请首先参考 [docs/Reproduction.md](docs/Reproduction.md)。 | | **2025 年 6 月** | 我们正在推进将 SyzGPT 模块集成到 Syzkaller 中。请参阅此[讨论](https://groups.google.com/g/syzkaller/c/SEEjp6m7lbA)了解进度。 | 这是论文“**利用基于依赖的 RAG 解锁内核模糊测试中的低频系统调用**”的实现。有关 SyzGPT 的更多详细信息,请参阅我们发表在 ISSTA'25 上的[论文](https://zhiyu.netlify.app/files/issta25main_syzgpt.pdf)。我们还提供了一份 [README_for_review](./docs/README_for_review.md),它曾位于一个[匿名仓库](https://anonymous.4open.science/r/SyzGPT-eval)中,以便审稿人更好地理解。 **快速浏览**:SyzGPT 是一个由 LLM 辅助的内核模糊测试框架,用于自动为低频系统调用(LFS)生成有效的种子。Linux 内核提供了超过 [360 个系统调用](./data/builtin_syscalls.txt),而 Syzkaller 为系统调用的特定目的定义了超过 [4400 个封装的专用调用](./data/builtin_variants.txt)。然而,由于复杂的依赖关系和变异的不确定性,这些系统调用(被称为 [LFS](./docs/LFS.md))中有许多很难被持续覆盖,从而留下了未测试的空间。SyzGPT 能够自动提取并增强这些 LFS 的系统调用依赖,并通过基于依赖的 RAG(DRAG)生成有效的种子。我们的评估表明,SyzGPT 可以提高整体代码覆盖率和系统调用覆盖率,并发现由 LFS 引发的漏洞。我们还发布了一个专用于 Syz-program 的玩具模型 [🤗CodeLlama-syz-toy](https://huggingface.co/zzra1n/CodeLlama-syz-toy)。 我们还通过 [DeepWiki](https://deepwiki.com/) 为 SyzGPT 生成了一个 [wiki 页面](https://deepwiki.com/QGrain/SyzGPT),该页面将每周自动更新。 **项目结构** ``` ____ ____ ____ _____ / ___| _ _ ____ / ___|| _ \|_ _| \___ \ | | | ||_ / | | _|| |_) | | | ___) || |_| | / /_ | |_| || __/ | | |____/ \__, //____| \____||_| |_| |___/ . ├── analyzer/ # Corpus Analyzer ├── crawler/ # Crawler for Linux Manpages ├── crashes/ # Crashes found during our experiments ├── data/ # Data used in SyzGPT ├── docs/ # Documentations of SyzGPT (apart from the READMEs) ├── examples/ # Examples for better understanding ├── experiments/ # Experiments ├── extractor/ # Two-Level Syscall Dependency Extractor ├── fine-tune/ # Fine-tuning LLM specialized for Syz-programs ├── fuzzer/ # SyzGPT-fuzzer ├── generator/ # SyzGPT-generator ├── scripts/ # Some useful scripts ... ├── config.py # Configs, need to be copied as private_config.py └── syzgpt_generator.py # Main entry of SyzGPT-generator ``` ## 1 设置 ### 1.1 环境要求 - 硬件 - CPU:16 核以上 - 内存:64GB 以上 - 存储:256GB 以上 - GPU:无 - 软件 - 操作系统:Ubuntu 20.04+(已在 20.04、22.04 上测试) - 编译器:GCC 11+(已在 11.4、12.3 上测试)或 Clang 15+(已在 15.0.6、16.0.6、17.0.6 上测试) - Python:3.8+(已在 3.8-3.11 上测试) - Syzkaller 运行依赖 - LLM API 访问权限 - 用于 LLM 微调和服务(可选) - GPU:48GB 以上显存的 GPU(已在 1xA800、2xRTX 3090 上测试) - 软件:torch 2.0+(已在 2.0.1、2.3.0 上测试) - LLM 服务(已在 fastchat 上测试) ### 1.2 使用 Docker 设置(推荐) [⏰~10 分钟] 我们发布了两个 Docker 镜像:`qgrain/syzgpt:pretest`(早期访问版本)和 `qgrain/syzgpt:full`(包含完整功能和评估基准)。**要了解我们是如何构建这些 Docker 镜像的,请参考此仓库**:[QGrain/kernel-fuzz-docker-images](https://github.com/QGrain/kernel-fuzz-docker-images)。
使用 qgrain/syzgpt:pretest 进行设置 为了方便希望尽快测试我们工作的研究人员,我们发布了 `qgrain/syzgpt:pretest` 作为早期体验镜像,它包含可运行的 SyzGPT-generator 和 SyzGPT-fuzzer(不包含实验性配置和代码)。 1. 创建容器: ``` docker run -itd --name syzgpt_pretest --privileged=true qgrain/syzgpt:pretest # 你可以在 /root/SyzGPT 找到 SyzGPT,在 /root/fuzzers/SyzGPT-fuzzer 找到 SyzGPT-fuzzer ``` 2. 同步 SyzGPT 仓库(请始终执行此操作): ``` cd /root/SyzGPT && git pull ``` 3. 少量步骤: ``` cd /root/fuzzers/SyzGPT-fuzzer && make -j32 # 你需要构建 fuzzer,因为我们没有将二进制文件包含在 image 中以节省大小。 workon syzgpt # 进入 SyzGPT-generator 所需依赖的 python 虚拟环境 ```
使用 qgrain/syzgpt:full 进行设置 如果您只想直接使用 SyzGPT 进行模糊测试,可以选择较小的 `syzgpt:pretest`。 ``` docker run -itd --name syzgpt_full --privileged=true qgrain/syzgpt:full # 你会发现一切都如预期般正常,包括 SyzGPT 的功能和实验。 cd /root/SyzGPT && git pull # 请务必先同步 SyzGPT repository。 ```
### 1.3 从头开始设置 [⏰~20 分钟]
点击查看 您也可以在 Ubuntu 20.04/22.04 上从头开始设置 SyzGPT。或者基于我们的镜像 [`qgrain/kernel-fuzz:v1`](https://hub.docker.com/repository/docker/qgrain/kernel-fuzz/general)。 ``` docker run -itd --name syzgpt_from_scratch --privileged=true qgrain/kernel-fuzz:v1 ``` 1. 克隆本项目: ``` # 建议在 /root/SyzGPT 下进行,以便后续指令能与该 path 匹配。 # 如果你是物理机上的普通用户,可以随意 clone 到方便的位置。 git clone https://github.com/QGrain/SyzGPT.git ``` 2. 设置 **SyzGPT-generator**:请参考 [generator/README.md](generator/README.md) 中的设置部分 3. 设置 **SyzGPT-fuzzer**:请参考 [fuzzer/README.md](fuzzer/README.md)
## 2 用法 SyzGPT 可以通过 SyzGPT-generator 作为**独立的种子生成器**(**第 2.1 节**)。它还可以与 SyzGPT-fuzzer 配合进行**持续的内核模糊测试**(**第 2.2 节**)。 我们已经在 [data/dependencies](data/dependencies/) 发布了增强后的系统调用依赖。因此,您可以直接运行 SyzGPT 而无需提取系统调用依赖。您也可以自行提取系统调用依赖(**第 2.3 节**)。 对于使用 SyzGPT 过程中的任何问题,您可以参考[故障排除](./docs/Troubleshooting.md),或者随时提出 issue。 ### 2.1 运行 SyzGPT 生成种子 [⏰~30 分钟] SyzGPT 可以通过 SyzGPT-generator 作为**独立的种子生成器**。有关详细用法,请参阅 [generator/README.md](generator/README.md)。 前置条件: - 由本地 Syzkaller 或其他现有的 fuzzer 生成的语料库,可作为语料库知识库。我们在 [data/corpus_24h.db](./data/corpus_24h.db) 提供了一个 `corpus_24h.db` 用于复现。 - 一个包含需要为其生成种子的目标系统调用的文件。我们在 [data/sampled_variants.txt](./data/sampled_variants.txt) 提供了一个 `sampled_variants.txt` 用于复现。为了生成更全面的初始语料库,您可以使用 `-f` 指定 [6.6_LFSC](data/6.6_LFSC)。 #### 步骤 1:生成种子(注意:这将与 LLM 交互并消耗 token) ``` cd /root/SyzGPT && workon syzgpt # (1) 使用官方 OpenAI api,它将从 private_config.py 加载 api_key、llm_model 等。 python syzgpt_generator.py -s /root/fuzzers/SyzGPT-fuzzer -w WORKDIR -e data/corpus_24h.db -f data/sampled_variants.txt # (2) 使用第三方 api python syzgpt_generator.py -M gpt-3.5-turbo-16k -u https://api.expansion.chat/v1/ -k API_KEY -s /root/fuzzers/SyzGPT-fuzzer -w WORKDIR -e data/corpus_24h.db -f data/sampled_variants.txt # (3) 使用本地 LLM python syzgpt_generator.py -M CodeLlama-syz-toy -u http://IP:PORT/v1/ -s /root/fuzzers/SyzGPT-fuzzer -w WORKDIR -e data/corpus_24h.db -f data/sampled_variants.txt ```
点击查看:参数说明 - `-s`:SyzGPT-fuzzer 的路径,必须指定。 - `-w`:将生成结果和日志输出到 `WORKDIR`(每个任务应有其自己的 `WORKDIR`),必须指定。 - `-e`:外部语料库路径,仅在一次性种子生成时需要。 - `-f`:包含目标系统调用列表的文件路径,仅在一次性种子生成时需要。 - `-c`:您也可以通过 `-c CALL1 CALL2 ...` 手动指定目标系统调用,以替代 `-f`。 - `-M`:模型名称,与第三方 API 或本地 LLM 配合使用。 - `-u`:API 地址或本地托管 LLM 的 base_url。 - `-k`:第三方 API 服务的 api_key。
您会发现 `WORKDIR` 的结构如下所示: ``` ├── external_corpus/ # external corpus specified through -e ├── generated_corpus/ # generated seeds in Syz-program format (★) ├── generation_history.json # generation history for feedback-guided seed generation ├── query_prompts/ # generation logs including query prompts and results, can be used for fine-tuning. ├── reverse_index.json # reverse index for DRAG └── target_syscalls/ # generation targets ``` #### 步骤 2:修复和净化种子 ``` # 修复 seeds /root/fuzzers/SyzGPT-fuzzer/bin/syz-repair WORKDIR/generated_corpus WORKDIR/generated_corpus_repair # 净化 seeds /root/fuzzers/SyzGPT-fuzzer/bin/syz-validator dir WORKDIR/generated_corpus_repair WORKDIR/generated_corpus_repair_valid # 将 seeds 打包为用于 fuzzing 的 corpus /root/fuzzers/SyzGPT-fuzzer/bin/syz-db pack WORKDIR/generated_corpus_repair_valid WORKDIR/SyzGPT_sampled_corpus.db ``` 现在您可以将其复制到您准备进行模糊测试的 workdir 下的 `corpus.db` 中,将其用作模糊测试的语料库。以下步骤 3 用于评估,用户可以跳过。 #### 步骤 3:评估生成结果 ``` # 1. 评估 Syntax Valid Rate (SVR) /root/fuzzers/SyzGPT-fuzzer/bin/syz-validator dir WORKDIR/generated_corpus # 2. 评估修复后的 Syntax Valid Rate (SVR) /root/fuzzers/SyzGPT-fuzzer/bin/syz-validator dir WORKDIR/generated_corpus_repair # 3. 评估 N_avg 和 L_avg /root/fuzzers/SyzGPT-fuzzer/bin/syz-validator dir WORKDIR/generated_corpus_repair WORKDIR/generated_corpus_repair_valid python /root/SyzGPT/analyzer/corpus_analyzer.py analyze -d WORKDIR/generated_corpus_repair_valid # 4. 评估 Context Effective Rate (CER) cp -r WORKDIR/generated_corpus_repair_valid WORKDIR/generated_corpus_repair_valid_rev python /root/SyzGPT/experiments/performance/reverse_prog.py WORKDIR/generated_corpus_repair_valid_rev syzqemuctl create image-eval syzqemuctl run image-eval syzqemuctl exec image-eval "mkdir /root/evaluate_cer" syzqemuctl cp WORKDIR/generated_corpus_repair_valid_rev image-eval:/root/evaluate_cer/ syzqemuctl cp /root/fuzzers/SyzGPT-fuzzer/bin/linux_amd64/syz-execprog image-eval:/root/ syzqemuctl cp /root/fuzzers/SyzGPT-fuzzer/bin/linux_amd64/syz-executor image-eval:/root/ syzqemuctl exec image-eval "/root/syz-execprog -semantic -progdir /root/evaluate_cer/generated_corpus_repair_valid_rev -coverfile /root/evaluate_cer/out/CER" syzqemuctl cp image-eval:/root/evaluate_cer/CER_Evaluation_Results ./ # 这有点复杂,建议使用我们的一体化脚本 `experiments/performance/evaluate.py` ``` ``` python /root/SyzGPT/experiments/performance/evaluate.py -i /root/images -n image-eval -k /root/kernels/linux-6.6.12 -s /root/fuzzers/SyzGPT-fuzzer -w WORKDIR # 评估结果将写入 WORKDIR/evaluate.log ``` ### 2.2 运行 SyzGPT 进行模糊测试 [⏰~24 小时] SyzGPT 还可以与 SyzGPT-fuzzer 配合进行**持续的内核模糊测试**。有关详细用法,请参阅 [generator/README.md](generator/README.md) 和 [fuzzer/README.md](fuzzer/README.md)。 #### 步骤 1:运行 SyzGPT-fuzzer ``` # cd /root/fuzzers/SyzGPT-fuzzer # 例如,WORKDIR=workdir/v6-1/SyzGPT taskset -c 8-15 ./bin/syz-manager -config cfgdir/SyzGPT.cfg -bench benchdir/SyzGPT.log -statcall -backup 24h -enrich WORKDIR/generated_corpus -period 1h -repair ```
点击查看:参数说明 (更多详情请参考 [fuzzer/README.md](fuzzer/README.md)) - `-statcall`:在模糊测试期间启用系统调用跟踪。 - `-backup`:每 24 小时备份一次 **rawcover**、**corpus.db**、**CoveredCalls** 和 **crashes**。 - `-enrich`:每 `INTERNAL`(1 小时)从 `WORKDIR/generated_corpus` 加载增强的种子。 - `-period`:加载增强种子的 `INTERVAL`。 - `-repair`:启用由 SyzGPT-fuzzer 实现的程序修复功能。
#### 步骤 2:运行 SyzGPT-generator(注意:这将消耗 token) ``` # cd 到本项目的根目录 python syzgpt_generator.py -s /root/fuzzers/SyzGPT-fuzzer -w /root/fuzzers/SyzGPT-fuzzer/workdir/v6-1/SyzGPT/generated_corpus -D 1h -T 1h -S 24h -m 100 -P 10 # 看起来,你也可以使用其他 api 服务 # 或者使用带有 -M、-u、-k 参数的本地托管 LLM(在 2.1 节中介绍) ```
点击查看:参数说明 (更多详情请参考 [generator/README.md](generator/README.md)) - `-s` 和 `-w` 已在上方介绍过。 - `-D`:generator 开始工作前的经验性延迟(1 小时),默认将这段时间留给 fuzzer 进行探索。 - `-T`:每 `INTERVAL`(1 小时)生成一次种子,需要与 fuzzer 中的 `-enrich` 保持同步。 - `-S`:24 小时后停止生成。 - `-m`:最大生成数量,此处为 100。 - `-P`:对失败种子进行反馈引导式重新生成的概率,此处为 10%。
#### 步骤 3:评估模糊测试 - 绘制指标的增长曲线(**覆盖率**、**系统调用**、**新输入**等) ``` # 绘制每个 fuzzer 的一次运行结果: python scripts/bench_parser.py plot -b logA logB ... -l fuzzerA fuzzerB ... \ -t 24h -k coverage syscalls crashes 'crash types' -o plots/ # 绘制每个 fuzzer 三次运行的平均值和标准差: python scripts/bench_parser.py plot \ -b logA1 logA2 logA3 logB1 logB2 logB3 ... \ -a 3 -l fuzzerA fuzzerB ... -t 24h \ -k coverage syscalls crashes 'crash types' --error-band sd -o plots/ # 打印观察到的 metrics 而不绘图: python scripts/bench_parser.py stat -b logA logB ... -l fuzzerA fuzzerB ... \ -t 6h 12h 24h -k coverage crashes 'crash types' 'exec total' ``` 有关曲线补全、VIR 绘图以及 详细的命令行选项,请参见 [scripts/README.md](scripts/README.md)。 - 可视化崩溃 ``` python /root/SyzGPT/scripts/result_parser.py -D /path/to/WORKDIR1/crashes /path/to/WORKDIR2/crashes ... -c ``` ### 2.3 提取系统调用依赖 #### 步骤 1:提取专用调用级别的依赖 [⏰~3 分钟] 我们通过对 SyzLang 进行基于资源的静态分析,提取专用调用级别(syz 级别)的依赖。 1. 提取 fuzzer 中定义的系统调用(不同的 fuzzer 会有不同的内置系统调用,例如 KernelGPT): ``` # 它将在 ~/SyzGPT/data/debug.log 生成 debug.log,并在 -o 处生成 builtin_syscalls* cd extractor python parse_builtin_syscalls.py -s ~/fuzzers/SyzGPT-fuzzer -o ../data/ ``` 2. 提取 syz 级别的依赖: ``` # 它将在 -o 处生成 syz 级别的依赖项 python extract_syz_dependencies.py -b ../data/builtin_syscalls.json -o ../data/dependencies/syz_level/Syzkaller_deps/ ``` #### 步骤 2:提取系统调用级别的依赖 [⏰~45 分钟] 1. 按系统调用抓取 manpage 文档: ``` # 它将在 crawler/man_docs/SYSCALL.json 下载文档 cd crawler python get_syscall_doc.py ``` 2. 提取调用级别的依赖(**注意:这将与 LLM 交互并消耗 token**): ``` # -d 用于 dumb 模式,推荐使用 cd extractor python extract_call_dependencies.py -f ../crawler/syscall_from_manpage.txt -d ``` ## 3 为 Syz-program 微调 LLM [⏰~16 小时] 我们已经在 [Huggingface](https://huggingface.co/zzra1n/CodeLlama-syz-toy) 上发布了 CodeLlama-syz 的一个玩具版本。有关更多详细信息,请参阅 [fine-tune/README.md](fine-tune/README.md) ## 4 可复用性 **我们的方法能够迁移到其他内核模糊测试框架**,例如类似 Syzkaller 的(ACTOR、ECG、KernelGPT 等)和类似 Healer 的(Healer 和 MOCK)fuzzer。**我们的方法也可应用于其他任务,例如定向内核模糊测试。** ### 4.1 迁移到类似 Syzkaller 的 Fuzzer [⏰~10 分钟] 我们已经在 KernelGPT 上演示了迁移过程,请参考 [experiments/KernelGPT/README.md](experiments/KernelGPT/README.md) 中的实现说明。 ### 4.2 迁移到类似 Healer 的 Fuzzer 与迁移到类似 Syzkaller 的 fuzzer 一样简单,只要您熟悉 RUST 即可。 我们还准备了迁移到 MOCK 的指南,请参考 [experiments/MOCK/README.md](experiments/MOCK/README.md) 中的实现说明。 ### 4.3 迁移到定向内核模糊测试 **我们的方法同样适用于定向内核模糊测试领域**,只要我们拥有定向任务所需的目标系统调用即可。请参阅 [experiments/directed/README.md](experiments/directed/README.md)。 ## 5 致谢 感谢张智宇([@QGrain](https://github.com/QGrain))和李龙行([@x0v0l](https://github.com/x0v0l))对本项目的宝贵贡献。 ## 6 引用 想引用 SyzGPT,可以使用以下 BibTex 条目: ``` @article{zhang2025unlocking, title={Unlocking Low Frequency Syscalls in Kernel Fuzzing with Dependency-Based RAG}, author={Zhang, Zhiyu and Li, Longxing and Liang, Ruigang and Chen, Kai}, journal={Proceedings of the ACM on Software Engineering}, volume={2}, number={ISSTA}, pages={848--870}, year={2025}, publisher={ACM New York, NY, USA} } ```
标签:DLL 劫持, Hpfeeds, Petitpotam, 内核模糊测试, 凭据扫描, 大语言模型, 检索增强生成, 系统调用, 请求拦截, 逆向工具