
दोष-इंजेक्शन-आधारित फ़ज़र जो जनरेटर प्रोग्रामों में उत्परिवर्तन करके लक्ष्यों के लिए लगभग-मान्य इनपुट उत्पन्न करता है, जिससे जटिल प्रारूपों और क्रिप्टो-संरक्षित डेटा का व्याकरण अनुमानों के बिना फ़ज़िंग संभव होता है।
Fuzztruction एक शैक्षणिक प्रोटोटाइप है जो एक फ़ज़र है जो सीधे इनपुट को म्यूटेट नहीं करता (जैसा कि अधिकांश फ़ज़र करते हैं), बल्कि इसके बजाय एक तथाकथित जनरेटर एप्लिकेशन का उपयोग करता है ताकि हमारे फ़ज़िंग लक्ष्य के लिए एक इनपुट तैयार किया जा सके। चूंकि डेटा उत्पन्न करने वाले प्रोग्राम आमतौर पर सही प्रतिनिधित्व उत्पन्न करते हैं, हमारा फ़ज़र जनरेटर प्रोग्राम में फ़ॉल्ट इंजेक्ट करके म्यूटेट करता है, ताकि उत्पादित डेटा लगभग मान्य हो। आदर्श रूप से, उत्पादित डेटा हमारे फ़ज़िंग लक्ष्य, जिसे उपभोक्ता कहा जाता है, में पार्सिंग चरणों को पार करता है, लेकिन गहरी प्रोग्राम लॉजिक में अप्रत्याशित व्यवहार को ट्रिगर करता है। यह एन्क्रिप्शन या संदेश अखंडता कोड जैसी क्रिप्टोग्राफी प्रिमिटिव का उपयोग करने वाले लक्ष्यों को भी फ़ज़ करने की अनुमति देता है। हमारे दृष्टिकोण का मुख्य लाभ यह है कि यह भारी प्रोग्राम विश्लेषण तकनीकों, व्याकरण अनुमानों या मानवीय हस्तक्षेप की आवश्यकता के बिना जटिल डेटा उत्पन्न करता है।
अधिक विवरण के लिए, हमारा पेपर देखें। अपने काम को उद्धृत करने के लिए, आप निम्नलिखित BibTeX प्रविष्टि का उपयोग कर सकते हैं:
@inproceedings{bars2023fuzztruction,
title={Fuzztruction: Using Fault Injection-based Fuzzing to Leverage Implicit Domain Knowledge},
booktitle = {32st USENIX Security Symposium (USENIX Security 23)},
publisher = {USENIX Association},
year={2023},
author={Bars, Nils and Schloegel, Moritz and Scharnowski, Tobias and Schiller, Nico and Holz, Thorsten},
}
पेपर से प्रयोगों को पुन: प्रस्तुत करने के निर्देशों के लिए, कृपया इस दस्तावेज़ को पढ़ने के बाद fuzztruction-experiments सबमॉड्यूल दस्तावेज़ीकरण पढ़ें।
संगतता: जबकि हम यह सुनिश्चित करने का प्रयास करते हैं कि हमारा प्रोटोटाइप जितना संभव हो प्लेटफ़ॉर्म स्वतंत्र है, हम सभी प्लेटफ़ॉर्म पर इसका परीक्षण करने में सक्षम नहीं हैं। इस प्रकार, यदि आपको समस्याएँ आती हैं, तो कृपया Ubuntu 22.04.1 का उपयोग करें, जिसका उपयोग विकास के दौरान होस्ट सिस्टम के रूप में किया गया था।
# Clone the repository
git clone --recurse-submodules https://github.com/fuzztruction/fuzztruction.git
# Option 1: Get a pre-built version of our runtime environment.
# To ease reproduction of experiments in our paper, we recommend using our
# pre-built environment to avoid incompatibilities (~30 GB of data will be
# donwloaded)
# Do NOT use this if you don't want to reproduce our results but instead fuzz
# own targets (use the next command instead).
./env/pull-prebuilt.sh
# Option 2: Build the runtime environment for Fuzztruction from scratch.
# Do NOT run this if you executed pull-prebuilt.sh
./env/build.sh
# Spawn a container based on the image built/pulled before.
# To spawn a container using the prebuilt image (if pulled above),
# you need to set USE_PREBUILT to 1, e.g., `USE_PREBUILT=1 ./env/start.sh`
./env/start.sh
# Calling this script again will spawn a shell inside the container.
# (can be called multiple times to spawn multiple shells within the same
# container).
./env/start.sh
# Runninge start.sh the second time will automatically build the fuzzer.
# See `Fuzzing a Target using Fuzztruction` below for further instructions.
Fuzztruction में निम्नलिखित मुख्य घटक शामिल हैं:
शेड्यूलर जनरेटर और उपभोक्ता के बीच अंत:क्रिया का समन्वय करता है। यह फ़ज़िंग अभियान को नियंत्रित करता है, और इसका मुख्य कार्य फ़ज़िंग लूप को व्यवस्थित करना है। इसके अलावा, यह कतार प्रविष्टियों वाली एक कतार भी बनाए रखता है। प्रत्येक प्रविष्टि में जनरेटर को दिया गया बीज इनपुट (यदि कोई हो) और जनरेटर पर लागू सभी म्यूटेशन शामिल होते हैं। ऐसी प्रत्येक कतार प्रविष्टि एक एकल परीक्षण मामले का प्रतिनिधित्व करती है। पारंपरिक फ़ज़िंग में, ऐसा परीक्षण मामला एक फ़ाइल के रूप में दर्शाया जाएगा। शेड्यूलर का कार्यान्वयन scheduler निर्देशिका में स्थित है।
जनरेटर को फ़ज़िंग लक्ष्य, उपभोक्ता के लिए अनुरूप इनपुट उत्पन्न करने के लिए एक बीज जनरेटर माना जा सकता है। जबकि सामान्य फ़ज़िंग दृष्टिकोण बिट-स्तरीय म्यूटेशन के माध्यम से इनपुट को सीधे म्यूटेट करते हैं, हम जनरेटर प्रोग्राम में फॉल्ट इंजेक्ट करके अप्रत्यक्ष रूप से इनपुट को म्यूटेट करते हैं। अधिक सटीक रूप से, हम उन डेटा संचालनों की पहचान करते हैं और उन्हें म्यूटेट करते हैं जिनका उपयोग जनरेटर अपना आउटपुट उत्पन्न करने के लिए करता है। अपने दृष्टिकोण को सुगम बनाने के लिए, हमें एक ऐसे प्रोग्राम की आवश्यकता है जो ऐसे आउटपुट उत्पन्न करता है जो फ़ज़िंग लक्ष्य द्वारा अपेक्षित इनपुट प्रारूप से मेल खाते हैं।
जनरेटर का कार्यान्वयन generator निर्देशिका में पाया जा सकता है। इसमें दो घटक शामिल हैं, जिन्हें निम्नलिखित में समझाया गया है।
कंपाइलर पास (generator/pass) तथाकथित पैच पॉइंट का उपयोग करके लक्ष्य को इंस्ट्रूमेंट करता है। चूंकि इस सुविधा का वर्तमान कार्यान्वयन (LLVM12 और उससे नीचे पर परीक्षण) अस्थिर है, हम इसे अपने दृष्टिकोण के लिए सक्षम करने के लिए LLVM को पैच करते हैं। पैच llvm रिपॉजिटरी (यहाँ सबमॉड्यूल के रूप में शामिल) में पाए जा सकते हैं। कृपया ध्यान दें कि पैच प्रायोगिक हैं और उत्पादन में उपयोग के लिए अभिप्रेत नहीं हैं।
पैच पॉइंट के स्थान संकलित बाइनरी के अंदर एक अलग अनुभाग में रिकॉर्ड किए जाते हैं। इस अनुभाग को पार्स करने से संबंधित कोड lib/llvm-stackmap-rs पर पाया जा सकता है, जिसे हमने crates.io पर भी प्रकाशित किया है।
फ़ज़िंग के दौरान, शेड्यूलर पैच पॉइंट के सेट से एक लक्ष्य चुनता है और अपने निर्णय को एजेंट (नीचे वर्णित) को भेजता है जो दिए गए पैच पॉइंट के लिए वांछित म्यूटेशन लागू करने के लिए जिम्मेदार होता है।
एजेंट, जो generator/agent में कार्यान्वित है, कस्टम कंपाइलर पास के साथ संकलित जनरेटर एप्लिकेशन के संदर्भ में चलता है। इसके मुख्य कार्य फोर्कसर्वर का कार्यान्वयन और शेड्यूलर के साथ संचार करना हैं। शेड्यूलर से साझा मेमोरी और संदेश कतार के माध्यम से भेजे गए निर्देश के आधार पर, एजेंट जनरेटर को म्यूटेट करने के लिए JIT इंजन का उपयोग करता है।
जनरेटर का समकक्ष उपभोक्ता है: यह वह लक्ष्य है जिसे हम फ़ज़ कर रहे हैं जो जनरेटर द्वारा उत्पन्न इनपुट का उपभोग करता है। Fuzztruction के लिए, उपभोक्ता एप्लिकेशन को AFL++ के कंपाइलर पास के साथ संकलित करना पर्याप्त है, जिसका उपयोग हम कवरेज फीडबैक रिकॉर्ड करने के लिए करते हैं। यह फीडबैक जनरेटर के हमारे म्यूटेशन का मार्गदर्शन करता है।
Fuzztruction का उपयोग करने से पहले, डॉकर इमेज के रूप में आने वाले रनटाइम पर्यावरण की आवश्यकता होती है। यह इमेज इसे स्थानीय रूप से बनाकर या पूर्व-निर्मित संस्करण खींचकर प्राप्त किया जा सकता है। दोनों तरीके निम्नलिखित में वर्णित हैं। रनटाइम पर्यावरण तैयार करने से पहले, इस रिपॉजिटरी और सभी उप-रिपॉजिटरी को क्लोन किया जाना चाहिए:
git clone --recurse-submodules https://github.com/fuzztruction/fuzztruction.git
Fuzztruction रनटाइम पर्यावरण को env/build.sh निष्पादित करके बनाया जा सकता है। यह Fuzztruction के लिए एक पूर्ण रनटाइम पर्यावरण वाली डॉकर इमेज स्थानीय रूप से बनाता है। डिफ़ॉल्ट रूप से, हमारे पैच किए गए LLVM संस्करण के पूर्व-निर्मित संस्करण का उपयोग किया जाता है और Docker Hub से खींचा जाता है। यदि आप स्थानीय रूप से निर्मित LLVM संस्करण का उपयोग करना चाहते हैं, तो llvm निर्देशिका देखें।