本文讲的是<b>使用libFuzzer fuzz Chrome V8入门指南</b>,
什么是V8?
V8(也称为Chrome V8)是由Chromium Project开发的用于Google Chrome浏览器的开源JavaScript引擎。使用V8的其他项目包括Couchbase,MongoDB和Node.js.等。在本文的帮助下,可能您会对其有更为深入的了解。
众所周知Google做事情总是会有点不一样,所以它不会像./configure && make那么简单。但是一旦您找出正确的过程,这其实真的并不难。因此再次感谢Google给我指出正确的方向。
克隆depot_tools资料库:
添加depot_tools到您的PATH结尾(您可能想把它放在您的~/.bashrc或~/.zshrc)。假设您克隆depot_tools到/path/to/depot_tools:
现在我们得到了我们将要fuzzing的代码,然后创建chromium用于结帐的目录并更改它:
从depot_tools 上运行工具fetch以查看代码及其依赖关系。
该–no-history选项将加快速度,因为它不会拉下整个git历史,事实上我们并不是真正需要fuzzing。
其余的说明假设您已切换到src目录:
举个例子,我使用的是Ubuntu 16.04 x64,而如果您正在使用Debian,那么这些说明也应该适用于您。否则,您可能需要调整构建依赖关系。
安装附加的构建依赖项。
运行钩子
现在,您已经有了开始构建fuzzing器所需的代码库和工具。对于这个例子,我使用的是libFuzzer而不是AFL。
构建fuzzer
首先,我们将运行这个命令来设置我们的目标:
这将使构建得这个系统去使用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一下看看弹出的内容:
我觉得v8_json_parser_fuzzer看起来是一个不错的选择。所以为了构建这个特定的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选项文件一起来让您可以使用它定义各种东西。但我们现在不会对此进行深入。各位可以随意探索。
接下来为您的起始语料库创建一个目录,并根据所需将其命名为:
使用您的json文件填写json_parser_corpus。这里我没有使用附带的V8fuzzing语料库,因为每个人以及他们的fuzzing都被填满了。如果您不想自己找一个示例,那么您可以使用下面这个:
如果您只有一个核心,那么您的命令行将是:
而如果您有多个核心:
注意: -jobs=X X是您希望fuzzer在找到触发特定job中止或崩溃的事件之后重新启动-workers=X的次数,X是要使libFuzzer利用的CPU内核数。
最后,恭喜您现在正在对V8进行fuzzing,我非常希望您能因此而找到一两个漏洞。
原文发布时间为:2017年7月26日
本文作者:鲁班七号
本文来自云栖社区合作伙伴嘶吼,了解相关信息可以关注嘶吼网站。
<a href="http://www.4hou.com/info/news/6191.html" target="_blank">原文链接</a>