☰
syzkaller 结合 strace 采集系统调用轨迹:配置、编译与使用指南
2026/10/10 8:48:50 网站建设 项目流程
  • 网络安全
  • 开发工具
  • 质量保障

【免费下载链接】syzkaller

syzkaller is an unsupervised coverage-guided kernel fuzzer

项目地址:https://gitcode.com/gh_mirrors/sy/syzkaller
点击查看免费下载

syzkaller 是一个无监督的覆盖率引导内核模糊测试(coverage-guided kernel fuzzing)工具。本文围绕 docs/strace.md 讲解如何在 syzkaller 中启用 strace 支持:通过配置strace_bin让 syz-manager 在生成 reproducer 后自动在 strace 下重跑复现程序,并利用syz-crush、syz-repro等工具按需采集系统调用轨迹。读完本文,你将掌握 strace 二进制的静态编译方法、配置项语义、自动触发与结果上传机制,以及两类命令行工具的实际用法,并能对照源码理解底层调用链,从而在真实的 syzkaller 部署中快速定位模糊测试产生的系统调用序列。

功能概览:为什么需要 strace

模糊测试产出的 reproducer(无论是 syz 程序描述还是 C 语言版本)虽然能稳定触发崩溃,但它是机器生成的调用序列,人工阅读成本高。通过 strace 将 reproducer 的执行过程转换成人类可读的系统调用轨迹,可以直观看到目标程序在内核中依次发起了哪些系统调用、携带了哪些参数、返回值是什么。

在 syzkaller 中,strace 支持遵循"配置即自动启用"的设计:

  • 只要在 syz-manager 配置文件中设置了strace_bin指向一个可用的 strace 二进制,syzkaller 就会对每个成功生成的 reproducer 额外运行一次,并采集 strace 输出;
  • 如果 syz-manager 连接到 dashboard(如 syzbot),且 strace 下的复现仍然产生相同崩溃,输出会作为普通日志文件上传;
  • 否则,strace 输出会保存到独立文件,通过 syz-manager 的 Web 界面访问。

配置项定义见 pkg/mgrconfig/config.go,官方注释明确说明其用途:"Path to the strace binary compiled for the target architecture. If set, for each reproducer syzkaller will run it once more under strace and save the output."(指向为目标架构编译的 strace 二进制路径;若设置,syzkaller 将为每个 reproducer 额外在 strace 下运行一次并保存输出。)

编译 strace 二进制

为了防止模糊测试所用的内核镜像(kernel image)中 libc 版本不匹配,官方建议将 strace 编译为静态链接二进制。手动从源码编译的步骤在 docs/strace.md 中给出:

git clone https://github.com/strace/strace.git cd strace ./bootstrap ./configure --enable-mpers=no LDFLAGS='-static -pthread' make -j`nproc`

关键参数说明:

  • --enable-mpers=no:禁用 mpers(multi-personality)支持。strace 的 mpers 机制依赖动态生成的中间代码,会显著增加构建复杂度和体积,禁用后可获得更简单的静态二进制;
  • LDFLAGS='-static -pthread':强制静态链接并启用 pthread 支持,避免目标镜像中动态链接器与 libc 版本不一致导致 strace 无法启动;
  • -jnproc``:利用全部 CPU 核并行编译,加快构建速度。

编译完成后,二进制位于src/strace(即 strace 源码目录下的src/strace),可直接拷贝到 syzkaller 宿主机,或通过strace_bin_on_target配置为镜像内置。

架构匹配与镜像放置

从源码注释(pkg/mgrconfig/config.go)可以确认两点重要约束:

  1. strace 二进制必须为目标架构编译。若模糊测试目标是 ARM64 内核镜像,则 strace 必须是 ARM64 静态二进制;
  2. 默认情况下(strace_bin_on_target=false),syzkaller 会通过 VM 的Copy机制把宿主机上的 strace 二进制复制进目标镜像。实现代码在 pkg/instance/execprog.go:当!mgrCfg.StraceBinOnTarget且设置了StraceBin时,调用vmInst.Copy(ret.StraceBin)完成拷贝,失败会返回failed to copy strace bin错误。

若目标镜像希望预装 strace(例如镜像较大、复制开销高或目标环境无拷贝通道),可将strace_bin_on_target设为true,此时 syzkaller 直接使用镜像内的路径,不再执行 Copy。

配置项与校验

strace 相关配置位于 syz-manager 配置文件中,完整字段如下:

字段类型默认值说明
strace_binstring空为目标架构编译的 strace 二进制路径;设置后对每个 reproducer 额外运行一次 strace 并保存输出
strace_bin_on_targetboolfalse为 true 时,strace 二进制已内置在目标镜像中,syzkaller 不复制而是直接使用

配置校验发生在 pkg/mgrconfig/load.go:若strace_bin指定了路径但本地找不到文件,会报错bad config param strace_bin: can't find %v,防止配置错误被静默忽略。

配置示例(manager.cfg 片段):

{ "name": "linux", "target": "linux/amd64", "workdir": "/work", "kernel_src": "/linux", "image": "/linux.img", "sshkey": "/key", "vm": { "count": 4, "type": "qemu" }, "strace_bin": "/usr/local/bin/strace.static", "strace_bin_on_target": false }

syz-manager 自动触发与结果上传

自动触发流程

从 syz-manager/manager.go 可以还原 syz-manager 的完整触发逻辑:

  1. reproducer 生成成功后(err == nil && res != nil),若mgr.cfg.StraceBin != "",进入 strace 流程;
  2. 最多尝试straceAttempts = 2次,每次调用 pkg/repro/strace.go 中的repro.RunStrace;
  3. 通过strace.IsSameBug(res)比较 strace 运行时的崩溃标题与原 reproducer 的崩溃标题是否一致(pkg/repro/strace.go),只有崩溃一致才保留 strace 输出;
  4. 两次尝试均不一致则丢弃 strace 输出。官方注释解释了原因:"We only want to save strace output if it resulted in the same bug. Otherwise, it will be hard to reproduce on syzbot and will confuse users."(只有 strace 下仍复现同一 bug 才保存,否则在 syzbot 上难以复现且会误导用户)。

底层执行链

RunStrace内部通过instance.SetupExecProg创建执行实例(pkg/repro/strace.go),并传入BeforeContextLen: straceOutputLogSize(大小固定为 2048 << 10,即 2 MiB,见 pkg/repro/strace.go),用于在崩溃报告中保留 strace 输出上下文。随后根据结果类型执行 C reproducer 或 syz 程序(pkg/repro/strace.go)。

真正拼接 strace 命令行的地方在 pkg/instance/execprog.go:

command = inst.StraceBin + filterCalls + ` -s 100 -x -f ` + command

实际执行的命令形态为:strace -e \!wait4,clock_nanosleep,nanosleep -s 100 -x -f <repro命令>。参数含义:

  • -e \!wait4,clock_nanosleep,nanosleep:过滤噪音系统调用。源码注释说明 wait4 与 nanosleep 在运行 syz-executor 时产生大量噪音,在 VM 侧过滤可降低网络负载并节省有限缓冲区(pkg/instance/execprog.go)。此过滤仅对 Linux 目标启用(case targets.Linux);
  • -s 100:每个系统调用最多显示 100 字节的字符串参数;
  • -x:以十六进制显示非 ASCII 字符串(尤其适用于内核模糊测试中的二进制参数);
  • -f:跟踪 fork/vfork/clone 产生的子进程,完整覆盖多进程执行路径。

执行结果中会记录命令前缀作为输出的一部分(pkg/instance/execprog.go),便于日志回溯。

结果处理与上传

当 strace 下复现崩溃且标题一致时,结果被写入ReproResult.Strace字段(syz-manager/manager.go),后续在 syz-manager/manager.go 中:

  • 使用res.Strace.Report与res.Strace.Output覆盖报告与输出;
  • 崩溃标志位设为dashapi.CrashUnderStrace,标记该日志来自 strace 运行。

在 dashboard 侧,该标志位被广泛用于展示与邮件报告:

  • 报告模板 dashboard/app/templates/mail_bug.txt 中,根据LogHasStrace显示console+strace或console output链接;
  • 页面模板 dashboard/app/templates/templates.html 中,崩溃列表根据该标志显示strace log或console log;
  • 邮件报告在 strace 崩溃存在时优先选择 strace 版本(dashboard/app/reporting.go)。

若 strace 下的运行未复现同一崩溃,则ret.Strace保持为空,输出仅保存在 syz-manager Web 界面可访问的独立文件中(对应文档描述的后一种情况)。

使用 syz-crush 在 strace 下重放崩溃

syz-crush是专门用于在多个 VM 上重放崩溃日志的工具(源码注释见 tools/syz-crush/crush.go),适用于复现特别难以触发的崩溃。启用 strace 只需两步:

  1. 确保 syz-manager 配置文件中已设置strace_bin;
  2. 追加-strace参数。

完整命令形态:

syz-crush -config=manager.cfg -strace execution.log

从 tools/syz-crush/crush.go 可以看到,syz-crush在启动时会校验:若传入了-strace但配置中strace_bin为空,则直接log.Fatalf("strace_bin must not be empty in order to run with -strace")退出,确保配置与参数一致性。

-strace标志的实际作用在 tools/syz-crush/crush.go:将cfg.StraceBin写入instance.OptionalConfig.StraceBin,传递给每个 VM 上的执行实例。崩溃复现后,结果通过storeCrash保存为crashes/<id>/目录下的logN、reportN、reproducerN等文件(tools/syz-crush/crush.go),其中日志即包含 strace 输出。

syz-crush其他常用参数(tools/syz-crush/crush.go):

参数默认值说明
-config空syz-manager 配置文件路径,必填
-debugfalse将全部 VM 输出打印到控制台
-restart_time0(回退为配置中的 VMRunningTime)单次运行时长
-infinitetrue默认无限运行并周期性重启 VM;设为 false 则遇到崩溃即停止

输入文件可以是execution.log(崩溃日志)或.c文件(C 复现程序),工具根据后缀自动识别(tools/syz-crush/crush.go)。

使用 syz-repro 采集 strace 日志

syz-repro用于从崩溃日志中提取并最小化 reproducer。若想在生成的 reproducer 上运行 strace,追加-strace file-name.log参数即可,工具会在成功生成 reproducer 后在其上运行 strace 并保存输出。

完整命令形态:

syz-repro -config=manager.cfg -strace=repro.strace.log execution.log

相关实现见 tools/syz-repro/repro.go(flagStrace = flag.String("strace", "", "output strace log (strace_bin must be set)"))与 tools/syz-repro/repro.go:当-strace非空时调用repro.RunStrace(res, cfg, reporter, pool),并将结果输出写入指定文件。

结果处理逻辑(tools/syz-repro/repro.go):

  • 若 strace 运行出错,记录failed to run strace日志;
  • 若 strace 下复现崩溃,打印崩溃标题(under strace repro crashed with title: ...);
  • 若未崩溃,打印repro didn't crash under strace;
  • 无论崩溃与否,strace 原始输出都会写入-strace指定的文件。

注意:-strace仅在成功生成 reproducer 时才生效(res == nil时跳过),且同样要求配置中设置了strace_bin,否则RunStrace内部会返回strace binary is not set in the config错误(pkg/repro/strace.go)。

syz-repro其他常用参数(tools/syz-repro/repro.go):

参数默认值说明
-config空manager.cfg 路径,必填
-count0使用的 VM 数量(覆盖配置中的 count 参数)
-debugfalse打印调试输出
-output./repro.txtsyz 复现程序输出路径
-crepro./repro.cC 复现程序输出路径
-title空保存复现出的 bug 标题的文件路径
-strace空strace 日志输出文件路径(需配置 strace_bin)

相关工具与延伸阅读

strace 能力在仓库中还与其他工具形成配合:

  • syz-trace2syz:提供反向能力,可将 strace 日志解析为 syzkaller 程序描述。其解析器位于 tools/syz-trace2syz/parser/strace.go 与 tools/syz-trace2syz/parser/straceLex.rl,配合proggen子包生成程序,形成"strace 采集 → 程序生成"的完整闭环;
  • dashboard 标记:CrashUnderStrace标志在 dashboard/dashapi/dashapi.go(dashapi 层)中定义并被 dashboard/app 各处消费,用于在 Web 界面与邮件中区分普通日志与 strace 日志;
  • instance 测试排除:单元测试场景中StraceBin被显式置空(pkg/instance/instance.go),避免在测试内部执行栈中引入 strace 干扰。

如需进一步了解 syzkaller 的整体工作流程,可阅读 docs/internals.md;若关注 reproducer 的生成与最小化机制,可阅读 docs/reproducing_crashes.md。

小结

启用 syzkaller 的 strace 采集只需三步:为目标架构静态编译 strace、在 manager.cfg 中设置strace_bin(必要时配合strace_bin_on_target)、按需使用-strace参数驱动syz-crush或syz-repro。syz-manager 会在每个 reproducer 上自动进行最多两次 strace 验证,仅保留复现同一崩溃的输出,并将其标记为CrashUnderStrace上传或保存在 Web 界面中。借助 pkg/instance/execprog.go 中的命令行拼接与 pkg/repro/strace.go 中的结果判定,可以清楚追踪 strace 从配置到输出的完整数据链路,让机器生成的复现程序变为可读、可审计的系统调用轨迹。

  • 网络安全
  • 开发工具
  • 质量保障

【免费下载链接】syzkaller

syzkaller is an unsupervised coverage-guided kernel fuzzer

项目地址:https://gitcode.com/gh_mirrors/sy/syzkaller
点击查看免费下载

相关推荐

上一篇:OpenDesign 中的 Nike 风格设计系统指南:单色零售界面、排版层级与 Agent 提示词规范
下一篇:LinkSwift网盘直链下载助手:九大平台高速下载终极指南

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询