天天看點

使用libFuzzer fuzz Chrome V8入門指南

本文講的是<b>使用libFuzzer fuzz Chrome V8入門指南</b>,

什麼是V8? 

V8(也稱為Chrome V8)是由Chromium Project開發的用于Google Chrome浏覽器的開源JavaScript引擎。使用V8的其他項目包括Couchbase,MongoDB和Node.js.等。在本文的幫助下,可能您會對其有更為深入的了解。

衆所周知Google做事情總是會有點不一樣,是以它不會像./configure &amp;&amp; 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>

繼續閱讀