本文讲的是使用libFuzzer fuzz Chrome V8入门指南

什么是V8? 

V8(也称为Chrome V8)是由Chromium Project开发的用于Google Chrome浏览器的开源JavaScript引擎。使用V8的其他项目包括Couchbase,MongoDB和Node.js.等。在本文的帮助下,可能您会对其有更为深入的了解。

众所周知Google做事情总是会有点不一样,所以它不会像./configure && make那么简单。但是一旦您找出正确的过程,这其实真的并不难。因此再次感谢Google给我指出正确的方向。

克隆depot_tools资料库:

m.googlesource.com/chromium/tools/depot_tools.git

添加depot_tools到您的PATH结尾(您可能想把它放在您的~/.bashrc或~/.zshrc)。假设您克隆depot_tools到/path/to/depot_tools:

$ export PATH="$PATH:/path/to/depot_tools"

现在我们得到了我们将要fuzzing的代码,然后创建chromium用于结帐的目录并更改它:

$ mkdir ~/chromium && cd ~/chromium

从depot_tools 上运行工具fetch以查看代码及其依赖关系。

$ fetch --nohooks --no-history chromium

该–no-history选项将加快速度,因为它不会拉下整个git历史,事实上我们并不是真正需要fuzzing。

其余的说明假设您已切换到src目录:

$ cd src

举个例子,我使用的是Ubuntu 16.04 x64,而如果您正在使用Debian,那么这些说明也应该适用于您。否则,您可能需要调整构建依赖关系。

安装附加的构建依赖项。

$ build/install-build-deps.sh

运行钩子

$ gclient runhooks

现在,您已经有了开始构建fuzzing器所需的代码库和工具。对于这个例子,我使用的是libFuzzer而不是AFL。

构建fuzzer

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

$ 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_behavior_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_behavior_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,我非常希望您能因此而找到一两个漏洞。

原文发布时间为:2017年7月26日
本文作者:鲁班七号
本文来自云栖社区合作伙伴嘶吼,了解相关信息可以关注嘶吼网站。
原文链接

使用libFuzzer fuzz Chrome V8入门指南相关推荐

  1. Node.js 指南(入门指南)

    入门指南 安装Node之后,让我们尝试构建我们的第一个Web服务器,创建名为"app.js"的文件,并粘贴以下代码: const http = require('http');co ...

  2. Asp.Net MVC4入门指南(3):添加一个视图

    在本节中,您需要修改HelloWorldController类,从而使用视图模板文件,干净优雅的封装生成返回到客户端浏览器HTML的过程. 您将创建一个视图模板文件,其中使用了ASP.NET MVC ...

  3. PYTHON系列-从零开始的爬虫入门指南

    入门 0.准备工作 需要准备的东西: Python.scrapy.一个IDE或者随便什么文本编辑工具. 1.技术部已经研究决定了,你来写爬虫. 随便建一个工作目录,然后用命令行建立一个工程,工程名为m ...

  4. Webstorm常用快捷键备忘(Webstorm入门指南)

    WebStorm 是jetbrains公司旗下一款JavaScript 开发工具.被广大中国JS开发者誉为"Web前端开发神器"."最强大的HTML5编辑器". ...

  5. 以太坊是什么 - 以太坊开发入门指南

    本文首发于深入浅出区块链社区 原文链接:以太坊是什么 - 以太坊开发入门指南 很多同学已经跃跃欲试投入到区块链开发队伍当中来,可是又感觉无从下手,本文将基于以太坊平台,以通俗的方式介绍以太坊开发中涉及 ...

  6. 【51单片机快速入门指南】6.4:DHT11、DHT22单总线温湿度传感器

    目录 硬知识 DHT11 DHT22 通信协议 读取步骤 数据解读 DHT11 DHT22 示例程序 DHT11_22.c DHT11_22.h 测试程序 main.c 实验现象 DHT11 DHT2 ...

  7. 【51单片机快速入门指南】6.1:LCD1602的八线、四线控制及自定义符号,完美兼容Proteus仿真

    目录 硬知识 显示特性 接口定义 操作时序 写操作时序 读操作时序 寄存器 忙标志位BF 地址计数器(AC) 显示数据寄存器(DDRAM) CGROM CGRAM 指令 清屏指令 光标归位指令 进入模 ...

  8. html编程入门指南,给萌新HTML5 入门指南

    本文由葡萄城技术团队原创并首发 转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. HTML5的发展改变了互联网技术趋势,前端热度依旧不减,所以对于应用开发人员 ...

  9. DreamFactory入门指南 - 第1章REST和DreamFactory简介

    DreamFactory入门指南 - 第1章REST和DreamFactory简介 无论您在当今的IT行业中扮演什么角色,API都是工作中不可或缺的一部分.营销人员定期将Salesforce,Pipe ...

最新文章

  1. 可以让你玩儿光剑的程序,vc实现方法和代码
  2. java:合并两个排序的整数数组A和B变成一个新的数组。新数组也要有序。
  3. 邮件列表统计(网站推广)
  4. odoo10 ORM操作
  5. 【ES8(2017)】async / await
  6. 比特币近24小时内链上交易额有所上升,约为345.44亿美元
  7. https协议为什么比http协议更加安全
  8. 深入浅出Linux设备驱动编程--引言
  9. 「企业架构」什么是TOGAF?完整的介绍
  10. URL编码的原因及场景
  11. 图书信息管理系统(c语言)
  12. [内附完整源码和文档] 基于Java的人事档案管理系统
  13. Statement cancelled due to timeout or client request 异常的修复【已解决】
  14. 【沃顿商学院学习笔记】管理学——06腐败带来的间接成本和全球制裁状况Indirect Costs and Sanction
  15. 数据结构与算法Python版-第六周作业
  16. Java通过freemaker实现健康报告生成(包含列表、列表合并列)
  17. 信号与系统1-关于卷积的那些事
  18. 半次元获取收藏夹下所有的图片
  19. Android系统签名文件转换为keystore文件
  20. 通信机房,到底长什么样?

热门文章

  1. 从看见到听见,机器人传感能否解决智能制造检测的最后一公里难题?
  2. 中国信通院《新型智慧城市发展研究报告》
  3. 语音公司集体杀入AI芯片 2019场景落地战打响!
  4. 儿子转眼就长大:Hinton、LeCun、Bengio 口述神经网络简史
  5. 北京发自动驾驶车辆考试大纲 难度堪比普通人考驾照
  6. 谷歌、亚马逊、微软、IBM…这些巨头都已如何通过AI赚到钱了?
  7. 当钢铁直男去应聘...... | 每日趣闻
  8. CSDN 湘苗培优,打造高素质技术人才
  9. 程序员学历低,该被歧视吗? | 每日趣闻
  10. Windows和Linux系统下,虚拟环境安装的全面说明和详细步骤