运行模糊测试工具

构建 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,该命令会执行覆盖率引导模糊测试。这些值还包括 trycleanseminimizemerge。所有这些操作都可能会无限期地执行。

接受输入的命令同时接受文件和十六进制值。如果提供的输入不明确,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/coreGN 依赖项即可。实际上,这意味着将其添加到代码的“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,您可以使用其输出来重现其发现的问题。请参阅处理通过模糊测试发现的结果