构建 fuzzer 后,您可以通过多种方式执行它。
在 Fuchsia 设备上运行模糊测试工具
您可以使用 ffx fuzz
工具在本地设备上运行模糊测试工具。在开发模糊测试工具时,建议您使用此方法。该工具非常实用,因为它知道如何查找与模糊测试相关的文件,并且知道各种常见的选项。
在本地进行模糊测试时,使用交互式模糊测试 shell 通常很方便,该 shell 可使用 ffx fuzz shell
启动。此 shell 可以与 fuzz 工具保持连接,并提供标签页补全等实用程序。它支持多种命令:
- 如需列出可用的模糊测试工具,请使用以下代码:
list [-p
] - 如需连接到模糊测试工具,请根据需要启动该工具:
attach
[-o - 如需从模糊测试工具获取选项,请执行以下操作:
get [
] - 如需在模糊测试工具上设置选项,请执行以下操作:
set
- 如需向模糊测试工具的语料库添加输入,请执行以下操作:
add [--seed]
- 如需使用模糊测试工具测试特定输入,请执行以下操作:
try
- 如需生成输入并对目标进行模糊处理,请执行以下操作:
run [--runs
] [--time - 如需从错误输入中清除多余的字节,请执行以下操作:
cleanse
- 如需减小错误输入的大小,请执行以下操作:
minimize [--runs
] [--time - 如需压缩附加的模糊测试工具的语料库,请执行以下操作:
merge [--corpus
] - 如需获取模糊测试工具的执行状态,请执行以下操作:
status
- 如需检索关联的模糊测试工具的语料库,请执行以下操作:
fetch [--corpus
] [--seed] - 如需断开与模糊测试工具的连接但不停止该工具,请使用以下代码:
detach
- 如需停止附加的模糊测试工具,请执行以下操作:
stop
- 如需断开与 fuzzer 的连接并退出 shell,请执行以下操作:
exit
- 如需清除屏幕内容,请执行以下操作:
clear
- 如需输出 shell 的命令历史记录,请执行以下操作:
history
大多数命令都要求使用 fuzzer 的 component_url 将 fuzzer 附加到 shell。附加后,模糊测试工具组件会一直保持活跃状态,直到被 stop
命令或测试管理器将其停止。您可以与模糊测试工具分离,稍后再重新附加。
其中一些命令代表长时间运行的工作流。这其中包括最重要的命令 run
,该命令会执行覆盖率引导模糊测试。这些值还包括 try
、cleanse
、minimize
和 merge
。所有这些操作都可能会无限期地执行。
接受输入的命令同时接受文件和十六进制值。如果提供的输入不明确,ffx fuzz
会将其视为十六进制值并输出警告。您可以通过添加路径元素来强制将其视为文件,例如 ./deadbeef
是文件,而 deadbeef
是值。
综上所述,去掉注释后,典型的工作流程可能如下所示:
attach fuchsia-pkg://fuchsia.com/my-fuzzers#meta/my-fuzzer.cm # Connect to the fuzzer.
run -t 60m # Run for up to one hour.
try deadbeef # Try a specific input, e.g. reproduce an error found by the step above.
merge -c my-local-dir # Shrink the corpus as much as possible and save it.
stop
exit
在开发主机上运行模糊测试工具
您可以将 Fuchsia 构建系统构建的主机模糊测试工具作为主机工具运行,但不支持 ffx fuzz
的额外工具。这意味着,您需要手动将任何 libFuzzer 选项添加到 fx host-tool
调用中。
例如:
fx host-tool my_host_fuzzer -runs=1000
您可以使用 -help=1
查看所有可用选项:
fx host-tool my_host_fuzzer -help=1
在 ClusterFuzz 上运行模糊测试工具
这是在初始开发后运行模糊测试工具的最简单且最推荐的方法。如需在 ClusterFuzz 上运行 fuzzer,您只需确保它是 //bundles/buildbot/core
的 GN 依赖项即可。实际上,这意味着将其添加到代码的“tests”GN 目标中。
例如:
group("tests") {
deps = [
":existing-unittest-package",
":my-fuzzers",
]
}
如果您不确定自己的 fuzzer 是否包含在依赖项图中,可以使用 gn path
进行检查。
例如:
fx gn path out/default //bundles/buildbot/core path-to-fuzzer
对于 //examples/fuzzers
,这会产生以下结果:
//bundles/buildbot/core --[public]--> //examples:examples --[private]--> //examples/fuzzers:fuzzers 1 non-data path found. It is not public.
该依赖项图中的所有模糊测试工具都将可供 ClusterFuzz 选择和运行。如果 ClusterFuzz 发现了 bug,您可以使用其输出来重现其发现的问题。请参阅处理通过模糊测试发现的结果。