网络安全开发工具质量保障【免费下载链接】syzkallersyzkaller is an unsupervised coverage-guided kernel fuzzer项目地址https://gitcode.com/gh_mirrors/sy/syzkaller点击查看免费下载本文基于 docs/translations/zh_CN/syz_testbed.md英文原版见 docs/syz_testbed.md及tools/syz-testbed/下的源码编写介绍如何使用 syzkaller 官方自带的 syz-testbed 工具自动化完成检出多个 syzkaller 版本 → 分别构建 → 并行运行 syz-manager → 周期收集并汇总统计数据的完整对比实验同时也讲解如何用它验证不同版本对历史 bug 的复现能力。syz-testbed 是 syzkaller 仓库自带的实验编排工具它把性能对比评估从手工劳动变成一条命令。无论你是想量化某个开发分支对 fuzzing 效率的影响还是想评估新版本对已知崩溃日志的复现成功率都可以用它搭建并自动运行整个实验流程。读完本文你将掌握 syz-testbed 的完整配置语法、实例调度原理、统计文件布局、Web 图表用法以及 syz-repro 复现测试的配置方法。一、syz-testbed 是什么syz-testbed源码位于 tools/syz-testbed/是一个用于简化对不同 syzkaller 版本或配置进行性能对比评估流程的工具。它会自动完成以下工作检出checkoutsyzkaller 仓库的指定分支构建build每个检出版本并行运行多个syz-manager实例收集并汇总这些实例的统计结果输出为 CSV 表格与 bench 文件。从 testbed.go 的头部注释可以看到其设计初衷自动检出、构建并搭建多个 syzkaller 实例这在评估新改动对 syzkaller 整体性能的影响时非常有帮助。也就是说它的典型场景是把master与某个开发分支放在同一套环境里跑同样的时间最后对比谁发现的 bug 更多、覆盖率更高、执行速度更快。二、配置 syz-testbedsyz-testbed 需要一个 JSON 配置文件通过命令行参数-config传入。以下是一个完整的示例来自官方文档{ workdir: /tmp/syz-testbed-workdir/, corpus: /tmp/corpus.db, target: syz-manager, max_instances: 5, run_time: 24h, http: 0.0.0.0:50000, checkouts: [ { name: first, repo: https://github.com/google/syzkaller.git, }, { name: second, repo: https://github.com/google/syzkaller.git, branch: some-dev-branch, } ], manager_config: { target: linux/amd64, kernel_obj: /tmp/linux-stable, image: /tmp/kernel-image/trixie.img, sshkey: /tmp/kernel-image/trixie.id_rsa, procs: 8, type: qemu, vm: { count: 2, kernel: /tmp/linux-stable/arch/x86/boot/bzImage, cpu: 2, mem: 2048 } } }顶层配置项详解对照 testbed.go 中的TestbedConfig结构体各字段含义如下配置项JSON 类型说明默认值namestringtestbed 的名称会作为 syz-manager 实例名称的前缀testbedtargetstring要测试的应用当前支持syz-manager与syz-repro两种syz-managermax_instancesint同时运行的实例总数上限无校验要求 ≥ 1run_timestring每个实例的运行时长Go duration 字符串如24h、1h30m24hhttpstringWeb 界面绑定的 IP 与端口例如0.0.0.0:50000空不启用benchcmpstringsyz-benchcmp可执行文件路径用于 Web 图表自动从PATH查找corpusstring初始 corpus 数据库文件路径会复制到每个实例的 workdir空不使用初始 corpusworkdirstring所有检出与运行产物所在的根目录无必填repro_configobjectsyz-repro 测试的配置见下文第五节默认crashes_per_bug 1manager_configobject基础 syz-manager 配置与 syz-manager 的 config 字段一致无manager_modestring传递给 syz-manager 的-mode参数fuzzingcheckoutsarray要对比的版本列表至少一个无checkout 配置项checkouts数组中的每个元素对应 CheckoutConfig配置项说明name该版本在 testbed 中的唯一名称会用于目录命名如run-first-0与统计列名reposyzkaller 仓库地址例如https://github.com/google/syzkaller.gitbranch要检出的分支不填时默认为mastermanager_config可选该 checkout 专属的 manager 配置片段会与顶层manager_config合并默认值与配置校验源码视角syz-testbed 在读取配置前会先填充一组默认值见 testbed.gotarget默认syz-manager、run_time默认 24 小时、manager_mode默认fuzzing、repro_config.crashes_per_bug默认 1并会尝试通过exec.LookPath(syz-benchcmp)在系统PATH中自动查找syz-benchcmp。加载配置后执行checkConfig校验testbed.go主要规则包括name必须匹配正则^[0-9a-z\-]{1,20}$workdir不能为空且会被自动转换为绝对路径并创建若指定了corpus该文件必须存在max_instances不能小于 1若指定了benchcmp该路径必须真实存在target必须是已注册的构造器之一syz-manager/syz-repro每个 checkout 的repo与branch会经vcs.CheckRepoAddress/vcs.CheckBranch校验branch为空时自动设为mastercheckout 的name不能重复。manager_config 的合并与实例化顶层manager_config作为基础配置每个 checkout 的manager_config作为补丁与之合并config.MergeJSONs随后 syz-testbed 会把HTTP强制改为:0避免多个实例端口冲突见 MakeMgrConfig。在每个实例启动前还会对合并后的配置进一步打补丁instance.go自动填入name即槽位名称、workdir实例专属目录、syzkaller指向该 checkout 的构建产物路径并将最终配置写入实例目录下的manager.cfg文件。三、工作流程从检出到轮转运行给定第二节的配置syz-testbed 会执行以下操作官方文档明确描述将https://github.com/google/syzkaller.git的master分支检出到/tmp/syz-testbed-workdir/checkouts/first/并构建将同一仓库的some-dev-branch分支检出到/tmp/syz-testbed-workdir/checkouts/second/并构建启动 3 个first实例和 2 个second实例因为max_instances 5实例按轮询方式分配24 小时后run_time为24h停止这 5 个实例再创建 2 个first实例和 3 个second实例不断重复上述步骤直到收到停止信号。底层实现Slot 与 Loop从源码看这个创建 → 运行 → 归档 → 重来的循环由两个核心函数实现testbed.goLoop为每个槽位0 到max_instances-1启动一个 goroutine每个槽位固定占用一个实例名额Slot在槽位内不断调用Target.NewJob领取新任务——syz-manager目标按**轮询round-robin**策略在 checkout 之间分配实例见 targets.gosyz-repro目标则优先挑选对某个 checkout 执行次数最少的崩溃日志。每个syz-manager实例实际以如下命令行启动instance.goworkdir/checkouts/name/bin/syz-manager \ -config 实例目录/manager.cfg \ -mode fuzzing \ -bench 实例目录/bench.txtsyz-manager实例达到run_time后会被优雅停止先发送 SIGINTos.Interrupt若 1 分钟内没有自行退出则强制 Killinstance.go。正常结束的实例会被归档为RunResult并加入该 checkout 的已完成列表checkout.go而异常退出的实例会直接终止整个实验见下文。停止条件该工具在收到 SIGINT例如按 CtrlC或 SIGTERM 信号后停止停止时会关闭所有槽位并等待全部实例退出testbed.go。此外如果任意一个实例由于错误退出也会导致整个实验停止——这是有意设计的保守策略一旦某个实例异常说明环境或配置可能有问题继续跑下去的数据也没有意义。目录结构运行期间workdir下的目录结构如下来自官方文档/tmp/syz-testbed-workdir/ └── checkouts ├── first │ ├── run-first-0 │ │ ├── log.txt │ │ ├── manager.cfg │ │ └── workdir │ ├── run-first-1 │ │ ├── log.txt │ │ ├── manager.cfg │ │ └── workdir │ └── run-first-4 │ ├── log.txt │ ├── manager.cfg │ └── workdir └── second ├── run-second-2 │ ├── log.txt │ ├── manager.cfg │ └── workdir └── run-second-3 ├── log.txt ├── manager.cfg └── workdir每个run-checkout-编号目录对应一个实例log.txt是实例日志manager.cfg是该实例最终的 syz-manager 配置workdir是它的数据目录corpus、crashes 等。若配置了corpus初始 corpus 会被复制到每个实例的workdir/corpus.dbinstance.go。此外每个实例目录还包含bench.txt记录 syz-manager 按固定周期导出的统计快照JSON 序列。四、Web 界面与 syz-benchcmp 图表syz-testbed 自带一个简单的 Web 界面源码见 html.go 与模板 templates/testbed.html用于实时展示实验状态当前活动实例与已完成实例的数量按 checkout 分组距实例停止的剩余时间从各 syz-manager 收集到的最新统计数据按 bug 标题、统计指标展示的各类表格。要启用该界面把http参数设置为 syz-testbed 要绑定的 IP 地址与端口例如http: 0.0.0.0:50000。启动后即可在浏览器中访问页面提供completed与all两个统计视图的切换对应第四节的两种统计视图以及 Statistics、Bugs、Bug Counts 等表格页签。如果配置中的benchcmp参数指向syz-benchcmp可执行文件Web 界面还能生成随时间或执行次数变化的各项参数曲线图。此时页面上的/graph路由会先调用syz-benchcmphtml.go将其-all -over x轴变量 -out 临时文件参数与各 checkout 的平均 bench 文件组合执行再把生成的图表返回给浏览器。tools/syz-benchcmp/benchcmp.go本身是独立的 syz-manager 基准对比可视化工具支持以下参数参数说明-all对所有统计变量绘制图形不指定时仅绘制coverage、corpus、exec total、crash types四项-over 变量作为 X 轴的统计变量默认fuzzing可理解为以执行次数为横轴-out 文件将图形保存到文件而不是打开浏览器-skip 秒数跳过启动后前 N 秒的数据默认 -30即跳过前 20%五、统计输出两种视图与文件布局syz-testbed 提供两种统计视图对应 testbed.go 中的GetStatViewscomplete—— 仅包含已完成实例的数据即运行满run_time的实例all—— 还包含当前正在运行的实例的数据来自已完成实例的统计会被回退对齐到与活动实例当前运行时长一致的时间点stats.go 中的AlignedStatsTable按某个基准字段把各实例样本对齐。两种视图的统计每90 秒更新一次testbed.go 中的周期 goroutine 调用SaveStats。统计文件的整体布局如下$ tree -L 2 /tmp/syz-testbed-workdir/ /tmp/syz-testbed-workdir/ ├── stats_all │ ├── benches │ │ ├── avg_first.txt │ │ ├── avg_second.txt │ ├── bugs.csv │ ├── checkout_stats.csv │ └── instance_stats.csv ├── stats_completed │ ├── benches │ │ ├── avg_first.txt │ │ ├── avg_second.txt │ ├── bugs.csv │ ├── checkout_stats.csv │ └── instance_stats.csv └── testbed.csv各文件的含义与生成逻辑如下bugs.csv包含所有运行实例发现的所有 bugstats.go。若某个 checkout 启动了多个实例即count 1syz-testbed 会对它们发现的 bug 取并集按 bug 标题去重summarizeBugs逻辑见 stats.go其目的是尽可能收集该 syzkaller 版本能够发现的全部 bug。Web 界面上对应的还有一张Bug Counts表展示每个 bug 被多少实例发现及百分比。instance_stats.csv保存各个 syz-manager 独立生成的统计每行一个实例按时间对齐后的最新样本。checkout_stats.csv将属于同一 checkout 的实例统计取平均中位数后保存stats.go 的AvgStatRecords按时间点逐个对齐并计算每个指标的中位数。benches/avg_checkout.txt把属于同一 checkout 的所有 syz-manager 的 bench 文件参见 tools/syz-benchcmp进行平均保存为 JSON 行格式可直接喂给syz-benchcmp绘制对比曲线。为了控制图表体积长时间运行时采样点会被逐步抽样缩减到约 128256 个数据点stats.go 的SaveAvgBenchFile。testbed.csvtestbed 级摘要表包含每个 checkout 的 Running运行中数量、Completed已完成数量、Last started最近一次启动距今时间三列testbed.go。此外当target syz-repro时stats_*目录下会额外生成repro_success.csv、crepros_success.csv、repro_attempts.csv、repro_duration.csv等复现统计文件见 targets.go。六、运行 syz-testbed首先检出 syzkaller 的最新版本$ git clone https://github.com/google/syzkaller.git然后构建 syz-testbed$ cd syzkaller/tools/syz-testbed/ $ go build编写并保存配置文件例如保存为config.json随后运行$ ./syz-testbed -config config.json运行时会看到每个 checkout 的检出、构建、实例启动日志。停止 syz-testbed 进程会同时停止所有 syzkaller 实例因此可以放心地在实验中途按下 CtrlC 结束整个实验。几点实操提醒需要提前准备好被测内核的bzImage、rootfs 镜像与 ssh 私钥对应manager_config中的kernel_obj、image、sshkey、vm.kernel等字段可参考 docs/linux/setup.md 与 docs/setup.md 准备 QEMU 虚拟机环境若想复用现有语料可用corpus字段指向一个已有的corpus.dbworkdir下已存在的 checkout 目录会导致启动失败checkout.go 会检查路径是否已存在换新实验前请清空 workdir 或换一个新目录。七、测试 syz-repro评估 bug 复现能力syz-testbed 也可用于测试 syzkaller 的bug 复现能力。为此在配置文件中将target属性设置为syz-repro。此时可以指定崩溃日志文件的来源二选一input_logs指向一个包含崩溃日志的文件夹——syz-testbed 会遍历该目录并把每个文件都作为一个输入input_workdir指向一个syzkaller 的 workdir——syz-testbed 会遍历其中发现的所有 bug按规则挑选崩溃日志作为输入。对应的配置段示例官方文档repro_config: { input_workdir: /tmp/some-syzkaller-workdir, crashes_per_bug: 2, skip_bugs: [SYZFAIL, no output, corrupted, lost connection] },repro_config各字段含义对应 ReproTestConfig配置项说明input_logs崩溃日志所在文件夹路径与input_workdir互斥input_workdirsyzkaller workdir 路径从中读取所有 bug 及其崩溃日志crashes_per_bug每个 bug 随机选取多少份崩溃日志进行处理不能小于 1默认 1skip_bugs需要跳过的 bug 标题正则表达式列表skip_bugs是正则不只是字面匹配以上述配置为例syz-testbed 的处理流程为targets.go遍历该 syzkaller workdir 发现的所有 bug通过collectBugs读取 crash 存储跳过标题匹配SYZFAIL、no output、corrupted或lost connection这些正则的 bug对每个剩余 bug 随机选取 2 份崩溃日志crashes_per_bug 2且同一 bug 的日志不会被重复选取检出并编译配置中指定的各 syzkaller 实例在每个被选中的崩溃日志上持续运行其syz-repro直到工具被停止。每个syz-repro实例以如下方式启动instance.goworkdir/checkouts/name/bin/syz-repro \ -config 实例目录/manager.cfg \ -output 实例目录/repro.txt \ -crepro 实例目录/crepro.txt \ -title 实例目录/title.txt \ 实例目录/execution-log.txt复现结果判定有一个值得注意的细节instance.go实例结束时会比对title.txt中解析出的 bug 标题与原始崩溃日志的标题如果复现出的 bug 标题与原 bug 不一致则该次复现视为失败ReproFound与CReproFound均置为 false避免复现出了另一个 bug 却算作成功的误判。若input_logs目录中某份日志解析不出崩溃报告该日志也会被标记跳过targets.go。syz-repro 模式下 Web 界面提供四类表格Repros各 bug 的复现成功率、C Repros已复现 bug 中能进一步生成 C 程序的比例、All Repros逐条列出每次复现尝试及其时长、Duration复现耗时分布对应的 CSV 也会写入stats_*目录。八、数据可信度与统计方法补充syz-testbed 的统计表格并非简单的最后一刻快照对比而是在源码层面做了较多严谨处理样本聚合同一时刻各实例的同一指标会聚合为一个样本集表格单元格存的是样本对象而非单个数值table.go 的ValueCell展示时取中位数sample.Median()对齐回退all视图把已完成实例的统计回退到与运行中实例一致的时长AlignedStatsTable保证可比性相对变化与显著性Web 界面的统计表可指定base_column基准列把其他 checkout 的数值表示为相对基准列的百分比变化PercentChange并尝试用 Mann–Whitney U 检验计算 p 值sample.UTest见 table.go 的SetRelativeValues及其单元测试 table_test.go。九、总结syz-testbed 把多版本 syzkaller 对比实验标准化为一个配置文件加一条命令syz-manager目标负责自动化对比各版本的 fuzzing 产出bug 集合、统计指标、bench 曲线syz-repro目标负责自动化对比各版本的 bug 复现能力。配合其 Web 界面与syz-benchcmp图表你可以在一个页面里同时看到实验进度、统计表格和性能曲线。如果你的日常工作涉及 syzkaller 的性能回归检测、开发分支效果评估或复现能力验证直接使用 tools/syz-testbed/ 即可——它省去的正是最容易出错且最耗时的部分手工检出、构建、编排实例与汇总结果。赞分享网络安全开发工具质量保障【免费下载链接】syzkallersyzkaller is an unsupervised coverage-guided kernel fuzzer项目地址https://gitcode.com/gh_mirrors/sy/syzkaller点击查看免费下载相关推荐丢一份硬件报告进去还你一套黑苹果 OpenCore EFIOpCore Simplify 上手指南丢一份硬件报告进去还你一套黑苹果 OpenCore EFIOpCore Simplify 上手指南 在自组机器上跑 macOS黑苹果最耗时间的环节不是开发工具CLIFFmpeg-Builds终极指南不同版本功能与性能对比平台FFmpeg Builds终极指南不同版本功能与性能对比平台 FFmpeg Builds是一个专业的FFmpeg静态构建工具提供Windows和Linux平构建工具CI/CDDevOps开发工具syzkaller 在 NetBSD 上的部署与模糊测试实战从源码构建到 syz-manager 运行syzkaller 在 NetBSD 上的部署与模糊测试实战从源码构建到 syz manager 运行 本文以 docs/netbsd/README.md h网络安全开发工具质量保障上一篇QtScrcpy免费开源的安卓投屏控制一插 USB 就能用下一篇5分钟快速掌握ViMaxAI智能代理视频生成的终极指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考