
पुन: प्रयोज्य प्राइमेटिव्स से फ़ज़िंग लूप्स को बनाने के लिए एक DSL (HierarFlow) के साथ मॉड्यूलर फ़ज़िंग फ्रेमवर्क। स्वचालित भेद्यता खोज के लिए AFL, libFuzzer, VUzzer और अधिक को समर्थन करता है।
fuzzuf (fuzzing unification framework) एक फ़ज़िंग फ्रेमवर्क है जिसमें फ़ज़िंग प्रिमिटिव के बिल्डिंग ब्लॉक्स को जोड़कर फ़ज़िंग लूप का वर्णन करने के लिए अपनी स्वयं की DSL है।
निर्माण निर्देशों और ट्यूटोरियल के लिए, कृपया building.md और tutorial.md का अनुसरण करें।
fuzzuf प्रत्येक फ़ज़र में परिभाषित फ़ज़िंग लूप की एक लचीली परिभाषा को सक्षम बनाता है, इसे DSL नोटेशन के साथ बिल्डिंग ब्लॉक्स के संयोजन के रूप में वर्णित करता है, साथ ही इसके मूल फ़ज़र के लिए विस्तारशीलता बनाए रखता है। इसमें पहले से ही AFL, VUzzer, और libFuzzer सहित विभिन्न फ़ज़र कार्यान्वयन हैं जिन्हें उपयोगकर्ताओं द्वारा और अधिक बढ़ाया जा सकता है।
fuzzuf फ़ज़िंग लूप स्टेटमेंट के लिए HierarFlow नामक अपनी स्वयं की DSL का उपयोग करता है। इसे C++ भाषा के ऊपर इस प्रकार के व्याकरण के साथ कार्यान्वित किया गया है जो एक पेड़ संरचना जैसा दिखता है, ताकि फ़ज़िंग लूप को बिल्डिंग ब्लॉक्स के संयोजन के रूप में वर्णित किया जा सके।
HierarFlow के साथ, हम मौजूदा और नए दोनों फ़ज़र्स को साफ-सुथरे तरीके से लिख सकते हैं, क्योंकि फ़ज़िंग लूप की संरचना स्पष्ट रूप से दिखाई देती है। उदाहरण के लिए, हम एक AFL फ़ज़र (जो fuzzuf पर पहले से ही एक टेम्पलेट के रूप में कार्यान्वित है!) को कई फ़ज़िंग प्रिमिटिव में विभाजित कर सकते हैं जिनमें PUT निष्पादक, म्यूटेटर (नियतात्मक और यादृच्छिक दोनों), शब्दकोश अद्यतनकर्ता, इत्यादि शामिल हैं। उपयोगकर्ता प्रत्येक प्रिमिटिव को C++ कोड में कार्यान्वित कर सकते हैं और उन्हें HierarFlow के ऑपरेटर से जोड़कर अंततः उस फ़ज़र का फ़ज़िंग लूप बना सकते हैं जिसे वे प्राप्त करना चाहते हैं।
निम्नलिखित छोटा स्निपेट HierarFlow में AFL को दर्शाता है:
fuzz_loop << (
cull_queue
|| select_seed
);
select_seed << (
consider_skip_mut
|| retry_calibrate
|| trim_case
|| calc_score
|| apply_det_muts << (
bit_flip1 << execute << (normal_update || construct_auto_dict)
|| bit_flip_other << execute.HardLink() << normal_update.HardLink()
|| byte_flip1 << execute.HardLink() << (normal_update.HardLink()
|| construct_eff_map)
|| byte_flip_other << execute.HardLink() << normal_update.HardLink()
|| arith << execute.HardLink() << normal_update.HardLink()
|| interest << execute.HardLink() << normal_update.HardLink()
|| user_dict_overwrite << execute.HardLink() << normal_update.HardLink()
|| auto_dict_overwrite << execute.HardLink() << normal_update.HardLink()
)
|| apply_rand_muts << (
havoc << execute.HardLink() << normal_update.HardLink()
|| splicing << execute.HardLink() << normal_update.HardLink()
)
|| abandon_node
);
यह सरलता से दिखाता है कि HierarFlow कितना लचीला और शक्तिशाली है। अधिक जानकारी के लिए कृपया दस्तावेज़ देखें।
fuzzuf फ्रेमवर्क पर फ़ज़र लिखने के मुख्यतः चार लाभ हैं:
प्रत्येक फ़ज़िंग प्रिमिटिव के संयोजन के साथ फ़ज़िंग लूप का वर्णन कर सकते हैं fuzzuf फ़ज़िंग प्रिमिटिव (फ़ज़िंग लूप में एक व्यक्तिगत चरण) को बिल्डिंग ब्लॉक्स की तरह जोड़कर एक फ़ज़िंग लूप का निर्माण करता है। चूंकि प्रत्येक ब्लॉक को जोड़ा, हटाया, बदला और पुन: उपयोग किया जा सकता है, fuzzuf प्रत्येक परिभाषित फ़ज़िंग लूप की उच्च मॉड्यूलरिटी बनाए रख सकता है।
एक लचीला, उपयोगकर्ता-परिभाषित फ़ज़िंग लूप चूंकि मौजूदा फ़ज़िंग फ्रेमवर्क में अक्सर निश्चित या हार्ड-कोडेड फ़ज़िंग लूप होते हैं, उनके उपयोगकर्ता उनके व्यवहार में हेरफेर नहीं कर सकते। fuzzuf प्रत्येक विभाजित फ़ज़िंग प्रिमिटिव के लिए एक रूटीन निर्दिष्ट और कार्यान्वित कर सकता है, और उपयोगकर्ता की इच्छानुसार फ़ज़िंग लूप की संरचना का वर्णन और संशोधन कर सकता है।
व्युत्पन्न फ़ज़र की तुलना इसके मूल से करना आसान यह दुर्लभ नहीं है कि फ़ज़िंग शोधकर्ता और उत्साही किसी मौजूदा फ़ज़र को फोर्क करके उसके ऊपर अपना विचार लागू करें। वास्तव में, कई शैक्षणिक कार्यों ने अपने विचार को प्रतिबिंबित करने वाले कई AFL-आधारित फ़ज़र्स का प्रदर्शन किया है। fuzzuf DSL की बिल्डिंग ब्लॉक जैसी विशेषताओं का लाभ उठाकर और मौजूदा फ़ज़िंग प्रिमिटिव का पुन: उपयोग करके, उपयोगकर्ता अपने नए फ़ज़र की विकास प्रक्रिया को अत्यधिक गति दे सकते हैं। इसके अलावा, मूल फ़ज़र और इसके व्युत्पन्नों के बीच DSL के अंतरों की तुलना करके, संवर्द्धन को आसानी से एक नज़र में देखा जा सकता है (न केवल उपयोगकर्ताओं के लिए, बल्कि समीक्षकों और अन्य शोधकर्ताओं के लिए भी)।
AFL फ़ज़र एक टेम्पलेट के रूप में fuzzuf पर, AFL एक फ़ज़र (C++) टेम्पलेट के रूप में भी उपलब्ध है। इसका मतलब है कि इसका उपयोग करके एक नए या मौजूदा AFL-आधारित फ़ज़र को लागू करने और समीक्षा करने की लागत बहुत कम हो गई है। उदाहरण के लिए, fuzzuf का AFLFast इस टेम्पलेट पर बनाया गया है। रूटीन और एक स्ट्रक्ट में केवल कुछ संशोधनों की आवश्यकता होती है जो फ़ज़र स्थिति रिकॉर्ड करता है, और यह इसके मूल प्रवाह को अपरिवर्तित रखता है।
fuzzuf डिफ़ॉल्ट रूप से निम्नलिखित फ़ज़र्स के साथ आता है। उनका अवलोकन देखने और CLI से उनका उपयोग कैसे करें, इसके लिए कृपया नीचे दिए गए लिंक का अनुसरण करें।
ध्यान दें, CLI से fuzzuf का उपयोग करते समय, आपको वैश्विक विकल्पों (सभी फ़ज़र्स के लिए उपलब्ध विकल्प) और स्थानीय विकल्पों (फ़ज़र विशिष्ट विकल्प) को -- से अलग करना होगा।
हमने फ्रेमवर्क को C++ से Rust में स्थानांतरित करने पर विचार किया था क्योंकि यह अधिक सुरक्षित है और विकास के दौरान इसका एक साफ-सुथरा पारिस्थितिकी तंत्र है। हालांकि, प्रयासों और चर्चाओं के बावजूद, हमने निष्कर्ष निकाला कि हम भाषा नहीं बदलेंगे। इसका कारण यहाँ विस्तार से बताया गया है।
doxygen द्वारा उत्पन्न API संदर्भ यहाँ उपलब्ध है।
fuzzuf GNU Affero General Public License v3.0 के तहत लाइसेंस प्राप्त है। बाहरी परियोजनाओं से उत्पन्न कुछ कोड अपने स्वयं के लाइसेंस के तहत लाइसेंस प्राप्त हैं। कृपया विवरण के लिए LICENSE देखें।
इस परियोजना को सुरक्षा 2020 (JPJ004596) के लिए अभिनव विज्ञान और प्रौद्योगिकी पहल के तहत अधिग्रहण, प्रौद्योगिकी और रसद एजेंसी (ATLA) से वित्त पोषण प्राप्त हुआ है।
| फ़ज़र | प्रकार | विवरण | CLI उपयोग | एल्गोरिदम अवलोकन | Frida मोड |
|---|
| AFL | ग्रेबॉक्स | सामान्य प्रयोजन फ़ज़र का पुन: कार्यान्वयन, CGF का प्रतिनिधित्व करता है। इसके व्युत्पन्नों के लिए एक टेम्पलेट के रूप में भी उपलब्ध। | fuzzuf के AFL CLI का उपयोग कैसे करें | एल्गोरिदम अवलोकन | ✅ |
| AFLFast | ग्रेबॉक्स | AFLFast का कार्यान्वयन, AFL टेम्पलेट का उपयोग करते हुए। एल्गोरिदम पावर शेड्यूल में हेरफेर करके अपना प्रदर्शन बढ़ाने का प्रयास करता है। | CLI उपयोग | एल्गोरिदम अवलोकन | ✅ |
| IJON | ग्रेबॉक्स | एक फ़ज़र जो PUTs को मैन्युअल एनोटेशन के साथ आंतरिक-स्थिति-जागरूक तरीके से फ़ज़ कर सकता है। | CLI उपयोग | एल्गोरिदम अवलोकन | |
| VUzzer | ग्रेबॉक्स | एक म्यूटेशन-आधारित फ़ज़र जो PUT के नियंत्रण प्रवाह और डेटा प्रवाह का विश्लेषण करके डेटा संरचनाओं का अनुमान लगाता है। | पहले पूर्वापेक्षा पढ़ें, फिर CLI पर उपयोग | एल्गोरिदम अवलोकन | |
| libFuzzer | ग्रेबॉक्स | LLVM प्रोजेक्ट की compiler-rt लाइब्रेरीज़ में शामिल CGF। | fuzzuf पर libFuzzer का उपयोग कैसे करें | libFuzzer क्या है? | |
| Nezha | ग्रेबॉक्स | libFuzzer से उत्पन्न एक फ़ज़र जो समान इनपुट के साथ विभिन्न कार्यान्वयन वाले प्रोग्रामों को निष्पादित करके और उनके निष्पादन परिणामों की तुलना करके प्रोग्राम में दोष खोजने का प्रयास करता है (डिफरेंशियल फ़ज़िंग)। | fuzzuf पर Nezha का उपयोग कैसे करें | TBD | |
| DIE | ग्रेबॉक्स | JavaScript इंजनों के लिए एक फ़ज़र जो म्यूटेशन प्रक्रिया के दौरान परीक्षण मामलों के पहलू को संरक्षित करता है। | CLI पर उपयोग | एल्गोरिदम का अवलोकन | |
| Nautilus | ग्रेबॉक्स | एक कवरेज-निर्देशित व्याकरण-आधारित फ़ज़र जो उपयोगकर्ता-परिभाषित व्याकरण के अनुसार परीक्षण मामले उत्पन्न करता है। | CLI पर उपयोग | एल्गोरिदम का अवलोकन | |
| MOpt | ग्रेबॉक्स | AFL के ऊपर कण झुंड अनुकूलन पर आधारित एल्गोरिदम। | CLI उपयोग | एल्गोरिदम अवलोकन | |
| SymCC | कंकोलिक | कुशल कंपाइलर-आधारित प्रतीकात्मक निष्पादन | TBA | TBA | |
| Eclipser | ग्रेबॉक्स कंकोलिक | ग्रेबॉक्स कंकोलिक परीक्षण | CLI पर उपयोग | TBA |