fuzz: 使用 libFuzzer fuzz Chrome V8 入门指南

Tessa 坐标: 99805 目录:婚姻家庭

首先,我们将运行这个命令来设置我们的目标:

$ gn gen out/libfuzzer "--args=use_libfuzzer=true is_asan=true is_ubsan_security=true is_debug=false enable_nacl=false" --check

这将使构建得这个系统去使用 libFuzzer,ASan 和 UBSan。当它成功运行时,您将受到类似 Done. Made 6168 targets from 1323 files in 9620ms 的消息的欢迎。接下来运行 gn ls out/libfuzzer | grep fuzzer,您会收到一个包含约 519 个条目的列表,其中大部分我们不会关心。在这个例子中,我要选一个 json 解析器,所以让我们来 gn ls out/libfuzzer | grep json 一下看看弹出的内容:

//components/json_schema:json_schema //components/json_schema:unit_tests //components/json_schema:unit_tests_bundle_data //components/ntp_tiles:json_unsafe_parser //components/safe_json:safe_json //components/safe_json:test_support //components/safe_json:unit_tests //components/safe_json/public/interfaces:interfaces //components/safe_json/public/interfaces:interfaces__check_deps_are_all_mojom //components/safe_json/public/interfaces:interfaces__generator //components/safe_json/public/interfaces:interfaces__is_mojom //components/safe_json/public/interfaces:interfaces__type_mappings //components/safe_json/public/interfaces:interfaces_blink //components/safe_json/public/interfaces:interfaces_blink__generator //components/safe_json/public/interfaces:interfaces_blink__type_mappings //components/safe_json/public/interfaces:interfaces_js //components/safe_json/public/interfaces:interfaces_js__generator //components/safe_json/public/interfaces:interfaces_js_data_deps //components/safe_json/public/interfaces:interfaces_shared //components/safe_json/public/interfaces:interfaces_shared__generator //components/safe_json/public/interfaces:interfaces_shared_cpp_sources //components/safe_json/utility:utility //content/browser/devtools:compressed_protocol_json //extensions/shell/common/api:shell_api_features_json_features //extensions/shell/common/api:shell_behior_features_json_features //extensions/shell/common/api:shell_manifest_features_json_features //extensions/shell/common/api:shell_permission_features_json_features //extensions/test:test_api_features_json_features //extensions/test:test_behior_features_json_features //extensions/test:test_manifest_features_json_features //extensions/test:test_permission_features_json_features //gpu/config:process_json //testing/libfuzzer/fuzzers:base_json_reader_fuzzer //testing/libfuzzer/fuzzers:v8_json_parser_fuzzer //testing/libfuzzer/fuzzers:v8_json_parser_fuzzer.options //testing/libfuzzer/fuzzers:v8_json_parser_fuzzer_dict_copy //third_party/WebKit/Source/platform:blink_json_parser_fuzzer //third_party/WebKit/Source/platform:blink_json_parser_fuzzer.options //third_party/WebKit/Source/platform:blink_json_parser_fuzzer_dict_copy //third_party/angle/src/vulkan_support:vulkan_gen_json_files //third_party/dom_distiller_js:json_values_converter_test_proto //third_party/dom_distiller_js:json_values_converter_test_proto_gen //third_party/dom_distiller_js:json_values_converter_tests //third_party/jsoncpp:jsoncpp //third_party/webrtc/base:rtc_json //third_party/webrtc/rtc_base:rtc_json //tools/json_schema_compiler:generated_api_util //tools/json_schema_compiler/test:api //tools/json_schema_compiler/test:api_schema_generator //tools/json_schema_compiler/test:features_compiler_test //tools/json_schema_compiler/test:features_compiler_test_json_features //tools/json_schema_compiler/test:unit_tests //v8:json_fuzzer //v8:v8_simple_json_fuzzer

我觉得 v8_json_parser_fuzzer 看起来是一个不错的选择。所以为了构建这个特定的 fuzzer,我们需要运行这个命令:

$ ninja -C out/libfuzzer v8_json_parser_fuzzer

您会看到 [ 55/1074 ] CXX obj/third_party/libFuzzer/libfuzzer/FuzzerExtraCounters.o 正在构建的文字。这一步可能需要一段时间,所以请耐心等待一杯咖啡的时间。一旦完成,cd out/libfuzzer 以及您将要发现的 v8_json_parser_fuzzerfuzzer 就会连同 v8_json_parser_fuzzer.dict 的字典文件以及一个 v8_json_parser_fuzzer.optionslibFuzzer 选项文件一起来让您可以使用它定义各种东西。但我们现在不会对此进行深入。各位可以随意探索。

接下来为您的起始语料库创建一个目录,并根据所需将其命名为:

$ mkdir json_parser_corpus

使用您的 json 文件填写 json_parser_corpus。这里我没有使用附带的 V8fuzzing 语料库,因为每个人以及他们的 fuzzing 都被填满了。如果您不想自己找一个示例,那么您可以使用下面这个:

{ "colorsArray": [ { "colorName":"red", "hexValue":"#f00" }, { "colorName":"green", "hexValue":"#0f0" }, { "colorName":"blue", "hexValue":"#00f" }, { "colorName":"cyan", "hexValue":"#0ff" }, { "colorName":"magenta", "hexValue":"#f0f" }, { "colorName":"yellow", "hexValue":"#ff0" }, { "colorName":"black", "hexValue":"#000" } ] }

如果您只有一个核心,那么您的命令行将是:

$ ./v8_json_parser_fuzzer json_parser_corpus/ -dict=v8_json_parser_fuzzer.dict

而如果您有多个核心:

$ ./v8_json_parser_fuzzer json_parser_corpus/ -dict=v8_json_parser_fuzzer.dict -jobs=X -workers=X

注意: -jobs=X X 是您希望 fuzzer 在找到触发特定 job 中止或崩溃的事件之后重新启动 -workers=X 的次数,X 是要使 libFuzzer 利用的 CPU 内核数。

最后,恭喜您现在正在对 V8 进行 fuzzing,我非常希望您能因此而找到一两个漏洞。

专题栏目
最新