ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

syzkaller 结合 strace 采集系统调用轨迹:配置、编译与使用指南

syzkaller 结合 strace 采集系统调用轨迹:配置、编译与使用指南 网络安全开发工具质量保障【免费下载链接】syzkallersyzkaller 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-mpersno LDFLAGS-static -pthread make -jnproc关键参数说明--enable-mpersno禁用 mpersmulti-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可以确认两点重要约束strace 二进制必须为目标架构编译。若模糊测试目标是 ARM64 内核镜像则 strace 必须是 ARM64 静态二进制默认情况下strace_bin_on_targetfalsesyzkaller 会通过 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: cant 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 的完整触发逻辑reproducer 生成成功后err nil res ! nil若mgr.cfg.StraceBin ! 进入 strace 流程最多尝试straceAttempts 2次每次调用 pkg/repro/strace.go 中的repro.RunStrace通过strace.IsSameBug(res)比较 strace 运行时的崩溃标题与原 reproducer 的崩溃标题是否一致pkg/repro/strace.go只有崩溃一致才保留 strace 输出两次尝试均不一致则丢弃 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.gocommand 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显示consolestrace或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 只需两步确保 syz-manager 配置文件中已设置strace_bin追加-strace参数。完整命令形态syz-crush -configmanager.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 -configmanager.cfg -stracerepro.strace.log execution.log相关实现见 tools/syz-repro/repro.goflagStrace 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 didnt 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.godashapi 层中定义并被 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 从配置到输出的完整数据链路让机器生成的复现程序变为可读、可审计的系统调用轨迹。赞分享网络安全开发工具质量保障【免费下载链接】syzkallersyzkaller is an unsupervised coverage-guided kernel fuzzer项目地址https://gitcode.com/gh_mirrors/sy/syzkaller点击查看免费下载相关推荐img2threejs 细节清单Detail Inventory实战指南把参考图中的身份细节变成可门禁的结构化数据img2threejs 细节清单Detail Inventory实战指南把参考图中的身份细节变成可门禁的结构化数据 导读 detailInventoryAI 技能3D渲染代码生成终极指南如何在xv6-riscv中实现系统调用跟踪与strace工具功能终极指南如何在xv6 riscv中实现系统调用跟踪与strace工具功能 xv6 riscv是一个基于RISC V架构的教学操作系统通过学习它可以深入理解操操作系统嵌入式YYImage故障排除手册解决WebP、APNG播放失败的常见问题YYImage故障排除手册解决WebP、APNG播放失败的常见问题 YYImage是一款强大的iOS图片框架支持WebP、APNG、GIF等多种动画格式的显上一篇OpenDesign 中的 Nike 风格设计系统指南单色零售界面、排版层级与 Agent 提示词规范下一篇LinkSwift网盘直链下载助手九大平台高速下载终极指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进