
स्थैतिक विश्लेषण ढांचा जो स्रोत कोड और बाइनरी में fuzzable फंक्शन लक्ष्यों की पहचान करता है, harness टेम्पलेट उत्पन्न करता है, और स्वचालित भेद्यता खोज के लिए AFL++ और libFuzzer के साथ एकीकृत होता है।
स्टैटिक विश्लेषण के साथ फज़ करने योग्य लक्ष्य की खोज को स्वचालित करने के लिए फ्रेमवर्क

सॉफ्टवेयर पर सुरक्षा मूल्यांकन करने वाले भेद्यता शोधकर्ता अक्सर AFL++ और libFuzzer जैसे शक्तिशाली टूल्स के माध्यम से कवरेज-निर्देशित फ़ज़िंग की क्षमताओं का उपयोग करते हैं। यह महत्वपूर्ण है क्योंकि यह बग हंटिंग प्रक्रिया को स्वचालित करता है और लक्ष्यों में शोषण योग्य स्थितियों को तेजी से प्रकट करता है। हालांकि, बड़े और जटिल कोडबेस या बंद-स्रोत बाइनरी का सामना करते समय, शोधकर्ताओं को मैन्युअल रूप से ऑडिट करने और उन्हें रिवर्स इंजीनियर करने में काफी समय देना पड़ता है ताकि उन फ़ंक्शनों की पहचान की जा सके जहाँ फ़ज़िंग-आधारित अन्वेषण उपयोगी हो सकता है।
फ़ज़बल एक फ्रेमवर्क है जो C/C++ स्रोत कोड और बाइनरी दोनों के साथ एकीकृत होता है ताकि भेद्यता शोधकर्ताओं को फ़ज़िंग के लिए उपयुक्त फ़ंक्शन लक्ष्यों की पहचान करने में सहायता मिल सके। यह सॉफ्टवेयर में जोखिम भरे व्यवहारों और उन्हें निष्पादित करने वाले फ़ंक्शनों को इंगित करने के लिए कई स्थैतिक विश्लेषण-आधारित ह्यूरिस्टिक्स लागू करके किया जाता है। शोधकर्ता फिर फ्रेमवर्क का उपयोग बुनियादी हार्नेस टेम्पलेट उत्पन्न करने के लिए कर सकते हैं, जिनका उपयोग भेद्यता की खोज के लिए या Google के oss-fuzz प्रोजेक्ट जैसे सतत फ़ज़िंग पाइपलाइन के हिस्से के रूप में एकीकृत करने के लिए किया जा सकता है।
एक स्टैंडअलोन टूल के रूप में चलने के अलावा, Fuzzable को Binary Ninja डिस्सेम्बलर के लिए एक प्लगइन के रूप में भी एकीकृत किया गया है, और अन्य डिस्सेम्बली बैकएंड के लिए समर्थन विकसित किया जा रहा है।
टूल के बारे में मूल ब्लॉग पोस्ट यहाँ देखें, जो स्थैतिक विश्लेषण ह्यूरिस्टिक्स के तकनीकी विनिर्देशों और यह टूल कैसे अस्तित्व में आया, पर प्रकाश डालता है। यह टूल Black Hat Arsenal USA 2022 में भी प्रदर्शित किया गया है।
कुछ बाइनरी लक्ष्यों को कुछ सैनिटाइज़िंग (जैसे सिग्नेचर मैचिंग, या इनलाइनिंग से फ़ंक्शनों की पहचान) की आवश्यकता हो सकती है, और इसलिए fuzzable मुख्य रूप से Binary Ninja को एक डिस्सेम्बली बैकएंड के रूप में उपयोग करता है क्योंकि यह इन समस्याओं को प्रभावी ढंग से हल करने में सक्षम है। इसलिए, इसका उपयोग स्टैंडअलोन टूल और प्लगइन दोनों के रूप में किया जा सकता है।
चूंकि Binary Ninja सभी के लिए सुलभ नहीं है और सुरक्षा मूल्यांकन के लिए और संभावित रूप से क्लाउड में स्केल करने की मांग हो सकती है, एक angr फ़ॉलबैक बैकएंड भी समर्थित है। मैं भविष्य में अन्य डिस्सेम्बलरों को भी शामिल करने की आशा करता हूं (प्राथमिकता: Ghidra)।
यदि आपके पास Binary Ninja Commercial है, तो स्टैंडअलोन हेडलेस उपयोग के लिए API स्थापित करना सुनिश्चित करें:
$ python3 /Applications/Binary\ Ninja.app/Contents/Resources/scripts/install_api.py
pip से स्थापित करें:
$ pip install fuzzable
हम निर्भरता प्रबंधन और बिल्डिंग के लिए poetry का उपयोग करते हैं। मैनुअल बिल्ड करने के लिए, तृतीय-पक्ष मॉड्यूल के साथ रिपॉजिटरी क्लोन करें:
$ git clone --recursive https://github.com/ex0dus-0x/fuzzable
मैन्युअल रूप से स्थापित करने के लिए:
$ cd fuzzable/
# poetry के बिना
$ pip install .
# poetry के साथ
$ poetry install
# विकास virtualenv के लिए poetry के साथ
$ poetry shell
अब आप टूल के साथ बाइनरी और/या स्रोत कोड का विश्लेषण कर सकते हैं!
# एकल साझा ऑब्जेक्ट लाइब्रेरी बाइनरी का विश्लेषण
$ fuzzable analyze examples/binaries/libbasic.so
# एकल C स्रोत फ़ाइल का विश्लेषण
$ fuzzable analyze examples/source/libbasic.c
# एकाधिक C/C++ फ़ाइलों और हेडर वाले वर्कस्पेस का विश्लेषण
$ fuzzable analyze examples/source/source_bundle/
fuzzable को Binary Ninja प्लगइन मार्केटप्लेस के माध्यम से आसानी से स्थापित किया जा सकता है Binary Ninja > Manage Plugins पर जाकर और इसे खोजकर। यहाँ fuzzable प्लगइन चलने का एक उदाहरण है,
फ़ज़िंग और आगे भेद्यता मूल्यांकन के लिए लक्ष्यों की सटीकता से पहचान करना:

fuzzable आपके विश्लेषण को बेहतर ढंग से ट्यून करने में मदद करने के लिए विभिन्न विकल्पों के साथ आता है। भविष्य की योजनाओं और किसी भी सुविधा अनुरोध में और अधिक समर्थित किया जाएगा।
फ़ज़ क्षमता निर्धारित करने के लिए, fuzzable यह निर्धारित करने के लिए कई ह्यूरिस्टिक्स का उपयोग करता है कि गतिशील विश्लेषण के लिए कौन से लक्ष्य सबसे अधिक व्यवहार्य हैं। इन ह्यूरिस्टिक्स को scikit-criteria लाइब्रेरी का उपयोग करके अलग-अलग भार दिया जाता है, जो सर्वोत्तम उम्मीदवारों को निर्धारित करने के लिए मल्टी-क्राइटेरिया निर्णय विश्लेषण का उपयोग करता है। ये मीट्रिक और उनके भार यहाँ देखे जा सकते हैं:
जैसा कि उल्लेख किया गया है, अधिक गहन जानकारी के लिए तकनीकी ब्लॉग पोस्ट देखें कि इन मीट्रिक का उपयोग क्यों और कैसे किया जाता है।
कई मीट्रिक बड़े पैमाने पर Vincenzo Iozzo के 0-नॉलेज फ़ज़िंग में मूल कार्य से प्रेरित थे।
आप जिस भी लक्ष्य का विश्लेषण करना चाहते हैं वह विविध है, और fuzzable प्रोग्राम लक्ष्य में हर एज केस व्यवहार का हिसाब नहीं रख पाएगा। इसलिए, विश्लेषण के दौरान इन भारों को ट्यून करना महत्वपूर्ण हो सकता है ताकि यह देखा जा सके कि क्या अलग-अलग परिणाम आपके उपयोग के मामले के लिए अधिक समझ में आते हैं। CLI में इन भारों को ट्यून करने के लिए, बस --score-weights तर्क निर्दिष्ट करें:
$ fuzzable analyze <TARGET> --score-weights=0.2,0.2,0.2,0.2,0.2
डिफ़ॉल्ट रूप से, fuzzable निम्नलिखित मानदंडों के आधार पर फ़ंक्शन लक्ष्यों को फ़िल्टर करेगा:
static हैं और हेडर के माध्यम से उजागर नहीं होते हैं।fuzzable द्वारा फ़िल्टर किए गए कॉल को देखने के लिए, --list_ignored फ़्लैग सेट करें:
$ fuzzable analyze --list-ignored <TARGET>
Binary Ninja में, आप इस सेटिंग को Settings > Fuzzable > List Ignored Calls में चालू कर सकते हैं।
यदि fuzzable गलती से उन महत्वपूर्ण कॉलों को फ़िल्टर कर देता है जिनका विश्लेषण किया जाना चाहिए, तो रन के दौरान उन्हें शामिल करने के लिए --include-* तर्कों का उपयोग करने की अनुशंसा की जाती है:
# फ़िल्टर किए गए सभी गैर-शीर्ष-स्तरीय कॉल शामिल करें
$ fuzzable analyze --include-nontop <TARGET>
# विशेष प्रतीक शामिल करें जो फ़िल्टर किए गए थे
$ fuzzable analyze --include-sym <SYM> <TARGET>
Binary Ninja में, यह Settings > Fuzzable > Include non-top level calls और Symbols to Exclude के माध्यम से समर्थित है।
अब जब आपको अपने फ़ज़ करने के लिए आदर्श उम्मीदवार मिल गए हैं, तो fuzzable आपको फ़ज़िंग हार्नेस उत्पन्न करने में भी मदद करेगा जो (लगभग) फ़ाइल-आधारित फ़ज़र (जैसे AFL++, Honggfuzz) या इन-मेमोरी फ़ज़र (libFuzzer) के साथ उपयोग के लिए इंस्ट्रूमेंट और कंपाइल करने के लिए तैयार हैं। CLI में ऐसा करने के लिए:
# एक उम्मीदवार से हार्नेस उत्पन्न करें
$ fuzzable create-harness target --symbol-name=some_unsafe_call
# हार्नेस में न्यूनतम और आवश्यक संशोधन करें
$ vim target_some_unsafe_call_harness.cpp
# AFL-QEMU के लिए उदाहरण संकलन, जो उत्पन्न हार्नेस की टिप्पणियों में निर्दिष्ट है
$ clang target_some_unsafe_call_harness.cpp -no-pie -o target_some_unsafe_call_harness -ldl
# अपने आधार बीज बनाएं, आदर्श रूप से इनपुट के लिए अधिक अच्छी तरह से बने होने चाहिए
$ mkdir in/
$ echo "seed" >> in/seed
# ब्लैक बॉक्स फ़ज़िंग शुरू करें
$ afl-fuzz -Q -m none -i in/ -o out/ -- ./target_some_unsafe_call_harness
यदि यह लक्ष्य एक स्रोत कोडबेस है, तो सामान्य स्रोत टेम्पलेट का उपयोग किया जाएगा।
यदि लक्ष्य एक बाइनरी है, तो सामान्य ब्लैक-बॉक्स टेम्पलेट का उपयोग किया जाएगा, जिसका उपयोग आदर्श रूप से AFL-QEMU जैसे फ़ज़िंग एमुलेशन मोड के साथ किया जा सकता है। यदि प्रतीक सीधे dlopen करने के लिए निर्यात नहीं किया गया है, तो LIEF का उपयोग करके बाइनरी की एक प्रति को साझा ऑब्जेक्ट के रूप में भी बनाया जाएगा।
फिलहाल, यह सुविधा काफी प्रारंभिक है, क्योंकि यह केवल उपयुक्त मापदंडों के साथ एक स्टैंडअलोन C++ हार्नेस बनाएगा, और किसी भी रनटाइम व्यवहार (जैसे संरचनाओं को तत्काल करना और मुक्त करना) के लिए आवश्यक कोड स्वचालित रूप से उत्पन्न नहीं करेगा। हालांकि, fuzzable के लिए बनाए गए टेम्पलेट आपको अभी भी जल्दी से चालू कर देंगे। यहाँ कुछ महत्वाकांक्षी विशेषताएं हैं जिन्हें मैं भविष्य में लागू करना चाहूंगा:
fuzzable विभिन्न स्वरूपों में रिपोर्ट उत्पन्न करने का समर्थन करता है। वर्तमान में समर्थित हैं JSON, CSV और Markdown। यह उपयोगी हो सकता है यदि आप इसे ऑटोमेशन के हिस्से के रूप में उपयोग कर रहे हैं जहाँ आप आउटपुट को एक क्रमबद्ध स्वरूप में इनजेस्ट करना चाहेंगे।
CLI में, बस उपयुक्त एक्सटेंशन के साथ फ़ाइल नाम के साथ --export तर्क पास करें:
$ fuzzable analyze --export=report.json <TARGET>
Binary Ninja में, Plugins > Fuzzable > Export Fuzzability Report > ... पर जाएँ और वह प्रारूप चुनें जिसमें आप निर्यात करना चाहते हैं और वह पथ जहाँ आप इसे लिखना चाहते हैं।
यह टूल लगातार विकसित किया जाएगा, और बाहरी अनुरक्षकों से कोई भी मदद सराहनीय है!
Fuzzable MIT लाइसेंस के तहत लाइसेंस प्राप्त है।
| ह्यूरिस्टिक | विवरण | भार |
|---|
| फ़ज़ फ्रेंडली नाम | प्रतीक नाम ऐसे व्यवहार को दर्शाता है जो फ़ाइल/बफर इनपुट को अंतर्ग्रहण करता है | 0.3 |
| जोखिम भरे सिंक | तर्क जो जोखिम भरे कॉल में प्रवाहित होते हैं (जैसे memcpy) | 0.3 |
| प्राकृतिक लूप्स | डोमिनेंस फ्रंटियर के साथ पाए गए लूपों की संख्या | 0.05 |
| चक्रीय जटिलता | किनारों + नोड्स पर आधारित फ़ंक्शन लक्ष्य की जटिलता | 0.05 |
| कवरेज गहराई | लक्ष्य जितने कैलीज़ में प्रवेश करता है उनकी संख्या | 0.3 |