
Windows, macOS, Linux और Android के लिए बाइनरी, कवरेज-गाइडेड फ़ज़र
Copyright 2020 Google LLC
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
https://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
जैकालोप एक अनुकूलन योग्य, वितरित, कवरेज-निर्देशित फ़ज़र है जो ब्लैक-बॉक्स बाइनरी के साथ काम करने में सक्षम है।
जबकि कई अच्छे कवरेज-निर्देशित फ़ज़र हैं जो उन लक्ष्यों पर काम करते हैं जहाँ स्रोत कोड उपलब्ध है, ब्लैक बॉक्स बाइनरी पर काम करने वाले अपेक्षाकृत कम हैं, विशेष रूप से Windows और macOS ऑपरेटिंग सिस्टम पर, और जो मौजूद हैं वे मुख्य रूप से ऐसे कोडबेस पर आधारित हैं जिन्हें अनुकूलित करना बहुत आसान नहीं है। जैकालोप के प्रारंभिक लक्ष्य हैं:
जैकालोप का उपयोग स्टैंड-अलोन किया जा सकता है, लेकिन लाइब्रेरी के रूप में उपयोग किए जाने पर यह अधिक शक्तिशाली होता है, जहाँ उपयोगकर्ता कस्टम घटकों को प्लग कर सकते हैं जो डिफ़ॉल्ट व्यवहार को बदल देंगे। डिफ़ॉल्ट रूप से, जैकालोप के साथ आता है:
जैकालोप को समानांतर में चलाया जा सकता है
-nthreads कमांड लाइन पैरामीटर के माध्यम से फ़ज़िंग थ्रेड्स की संख्या पास करके-start_server कमांड लाइन फ़्लैग) और वर्कर मशीनों पर फ़ज़र को इस सर्वर से कनेक्ट करके (-server कमांड लाइन फ़्लैग)। सर्वर तब वर्कर के बीच सैंपल, क्रैश और कवरेज एकत्र और वितरित करता है।जैकालोप में वर्तमान में उन्नत म्यूटेशन रणनीतियाँ शामिल नहीं हैं। इसके बजाय यह सामान्य म्यूटेटर के एक सेट के साथ आता है, जो कई लक्ष्यों के लिए काम करेगा, हालांकि उपयोगकर्ताओं को उन लक्ष्यों के अनुसार कस्टम म्यूटेटर और म्यूटेशन रणनीतियाँ लिखने के लिए प्रोत्साहित किया जाता है जिन्हें वे फ़ज़ करना चाहते हैं।
वर्तमान में, ब्लैक-बॉक्स बाइनरी की फ़ज़िंग Windows, macOS, Linux और Android ऑपरेटिंग सिस्टम पर समर्थित है।
Linux पर, जैकालोप Sanitizer Coverage (लक्ष्य का स्रोत कोड आवश्यक) के साथ भी चलने में सक्षम है। इस मोड को एक अलग दस्तावेज़ में प्रलेखित किया गया है।
पूर्व-आवश्यकता: Python 3
एक टर्मिनल खोलें और यदि आवश्यक हो तो अपना बिल्ड वातावरण सेट करें। Windows पर, एक सामान्य कमांड प्रॉम्प्ट खोलने के बजाय, आप उस प्लेटफ़ॉर्म के लिए Visual Studio कमांड प्रॉम्प्ट खोलना चाहेंगे जिसके लिए आप बना रहे हैं, या vcvars64.bat / vcvars32.bat चलाएँ।
स्रोत वाली निर्देशिका पर नेविगेट करें।
निम्नलिखित कमांड चलाएँ:
cd Jackalope
git clone --recurse-submodules [email protected]:googleprojectzero/TinyInst.git
(alternately: git clone --recurse-submodules https://github.com/googleprojectzero/TinyInst.git)
mkdir build
cd build
cmake <generator arguments> ..
cmake --build . --config Release
जनरेटर तर्क आपके वातावरण पर निर्भर करते हैं। macOS पर आप -G Xcode का उपयोग करना चाहेंगे, जबकि उदाहरण के लिए Visual Studio 2019 और 64-बिट बिल्ड के साथ Windows पर आप -G "Visual Studio 16 2019" -A x64 का उपयोग करेंगे। Linux पर, किसी जनरेटर तर्क की आवश्यकता नहीं है। Android के लिए क्रॉस-कंपाइल करते समय अतिरिक्त cmake तर्कों की आवश्यकता होती है, वे TinyInst build instructions for Android में वर्णित के समान हैं। यदि आप /dev/shm के माध्यम से साझा मेमोरी का समर्थन करने वाले VM पर Android को फ़ज़ कर रहे हैं, तो -DANDROID_TARGET=VM साझा मेमोरी सैंपल डिलीवरी को सक्षम करता है।
macOS पर arm64e बाइनरी के विरुद्ध चलाने के लिए बिल्डिंग के लिए, यहाँ देखें।
macOS पर No CMAKE_C_COMPILER could be found त्रुटि मिल रही है? cmake को अपडेट करने का प्रयास करें। यह भी सुनिश्चित करें कि Xcode स्थापित है और आपने इसे कम से कम एक बार चलाया है (यह पहली बार चलाने पर कुछ घटक स्थापित करता है)।
उपयोग:
./fuzzer <fuzzer arguments> <instrumentation and other components arguments> -- <target command line>
निम्नलिखित कमांड लाइन तर्क समर्थित हैं:
-in - इनपुट निर्देशिका (प्रारंभिक सैंपल सेट वाली निर्देशिका)। यदि इनपुट निर्देशिका "-" है, तो फ़ज़र पिछले सत्र को पुनर्स्थापित करने का प्रयास करता है (जो -restore फ़्लैग का उपयोग करने के समान है)।
-out - आउटपुट निर्देशिका
-t - ms में सैंपल टाइमआउट
-t1 - लक्ष्य आरंभीकरण के लिए टाइमआउट (उदाहरण के लिए, यदि परिभाषित हो तो लक्ष्य विधि तक पहुँचने से पहले)। सैंपल टाइमआउट पर डिफ़ॉल्ट।
-nthreads - फ़ज़र थ्रेड्स की संख्या। डिफ़ॉल्ट 1 है।
-delivery <file|shmem> - उपयोग करने के लिए सैंपल डिलीवरी मैकेनिज्म। यदि file, तो प्रत्येक सैंपल को फ़ाइल के रूप में आउटपुट किया जाता है और लक्ष्य तर्कों में "@@" को फ़ाइल के पथ से बदल दिया जाता है। यदि shmem, तो फ़ज़र इसके बजाय साझा मेमोरी बनाता है और लक्ष्य तर्कों में "@@" को साझा मेमोरी के नाम से बदल देता है। इस मामले में साझा मेमोरी खोलने और सैंपल निकालने की जिम्मेदारी लक्ष्य की है। डिफ़ॉल्ट file है।
-file_extension - file सैंपल डिलीवरी का उपयोग करते समय, निर्दिष्ट एक्सटेंशन को फ़ाइल नाम में जोड़ता है। यदि लक्ष्य इनपुट फ़ाइलों से एक निश्चित एक्सटेंशन की अपेक्षा करता है तो उपयोगी है।
-restore या -resume - पिछले फ़ज़िंग सत्र को पुनर्स्थापित और फिर से शुरू करता है। फ़ज़र और सर्वर प्रक्रिया दोनों पुनर्स्थापित करने का समर्थन करते हैं।
-server - उपयोग करने के लिए कवरेज सर्वर निर्दिष्ट करता है।
-start_server - फ़ज़िंग प्रक्रिया के बजाय एक सर्वर प्रक्रिया चलाएँ।
-crash_retry - क्रैश को पुन: उत्पन्न करने का प्रयास करने की संख्या। डिफ़ॉल्ट 10 है। क्रैश जो इस संख्या में पुनः प्रयास के भीतर पुन: उत्पन्न नहीं होते हैं या इंस्ट्रूमेंटेशन के बिना चलने पर पुन: उत्पन्न नहीं होते हैं, उन्हें फ़्लैकी के रूप में चिह्नित किया जाता है।
-coverage_retry - नए कवरेज को पुन: उत्पन्न करने का प्रयास करने की संख्या। कवरेज जिसे इस संख्या में पुनः प्रयास के भीतर मज़बूती से पुन: उत्पन्न नहीं किया जा सकता है, उसे फ़्लैकी माना जाता है। केवल फ़्लैकी कवरेज वाले सैंपल सहेजे नहीं जाते हैं।
-clean_target_on_coverage - कवरेज को पुन: उत्पन्न करते समय लक्ष्य को पुनरारंभ करें। डिफ़ॉल्ट true है।
-minimize_samples - कॉर्पस में सहेजने से पहले नए सैंपल को कम करने का प्रयास करें। डिफ़ॉल्ट true है।
-iterations_per_round - अगले सैंपल पर जाने से पहले कॉर्पस से एक सैंपल को म्यूटेट और चलाने की संख्या। डिफ़ॉल्ट 1000 है। आप बहुत धीमे लक्ष्यों के लिए इस मान को कम करने पर विचार कर सकते हैं।
-deterministic_mutations - गैर-निर्धारित म्यूटेशन के अतिरिक्त निर्धारित म्यूटेशन का उपयोग करें। डिफ़ॉल्ट true है जब तक कि -server फ़्लैग का उपयोग नहीं किया जाता है।
-deterministic_only - निर्धारित म्यूटेशन को प्राथमिकता दें। ध्यान दें: इस फ़्लैग के साथ भी, फ़ज़र अभी भी गैर-निर्धारित म्यूटेशन का उपयोग करेगा, लेकिन सभी निर्धारित म्यूटेशन समाप्त होने के बाद ही। -server के साथ चलने पर एक एकल क्लाइंट इंस्टेंस को निर्धारित म्यूटेशन करने के लिए उपयोगी हो सकता है।