
एक उपकरण जो लाइब्रेरी के आधार पर स्वचालित रूप से फ़ज़िंग हारनेस बनाता है
AutoHarness एक उपकरण है जो स्वचालित रूप से आपके लिए फ़ज़िंग हार्नेस उत्पन्न करता है। यह विचार आज फ़ज़िंग कोडबेस में एक समवर्ती समस्या से उत्पन्न होता है: बड़े कोडबेस में हजारों फ़ंक्शन और कोड के टुकड़े होते हैं जिन्हें लाइब्रेरी में काफी गहराई तक एम्बेड किया जा सकता है। स्मार्ट फ़ज़र्स के लिए उस कोडपाथ तक पहुंचना बहुत कठिन या कभी-कभी असंभव भी होता है। यहां तक कि oss-fuzz जैसी बड़ी फ़ज़िंग परियोजनाओं के लिए भी, कोडबेस के कुछ हिस्से ऐसे हैं जो फ़ज़िंग में कवर नहीं होते हैं। इसलिए, यह प्रोग्राम कुछ हद तक इस समस्या को कम करने का प्रयास करता है, साथ ही सुरक्षा शोधकर्ताओं को एक कोड बेस का प्रारंभिक परीक्षण करने के लिए एक उपकरण प्रदान करता है। यह प्रोग्राम केवल उन कोड बेस को सपोर्ट करता है जो C और C++ में कोडित हैं।
यह प्रोग्राम libfuzzer के लिए llvm और clang, फ़ंक्शन खोजने के लिए Codeql, और सामान्य प्रोग्राम के लिए python का उपयोग करता है। इस प्रोग्राम का परीक्षण llvm 12 और python 3 के साथ Ubuntu 20.04 पर किया गया था। यहाँ प्रारंभिक सेटअप है।
sudo apt-get update;
sudo apt-get install python3 python3-pip llvm-12* clang-12 git;
pip3 install pandas lief subprocess os argparse ast;
Codeql के लिए इंस्टॉलेशन प्रक्रिया का पालन https://github.com/github/codeql पर करें। CLI टूल्स और लाइब्रेरीज़ को इंस्टॉल करना सुनिश्चित करें। मेरे परीक्षण के लिए, मैंने टूल्स और लाइब्रेरीज़ दोनों को एक फ़ोल्डर में संग्रहीत किया है। अंत में, इस रिपॉजिटरी को क्लोन करें या कोई रिलीज़ डाउनलोड करें। यहाँ nginx पर एकाधिक आर्गुमेंट मोड सेट के साथ चलाने के बाद प्रोग्राम का आउटपुट है। यह वह कमांड है जो मैंने उपयोग किया था।
python3 harness.py -L /home/akshat/nginx-1.21.0/objs/ -C /home/akshat/codeql-h/ -M 1 -O /home/akshat/autoharness/ -D nginx -G 1 -Y 1 -F "-I /home/akshat/nginx-1.21.0/objs -I /home/akshat/nginx-1.21.0/src/core -I /home/akshat/nginx-1.21.0/src/event -I /home/akshat/nginx-1.21.0/src/http -I /home/akshat/nginx-1.21.0/src/mail -I /home/akshat/nginx-1.21.0/src/misc -I /home/akshat/nginx-1.21.0/src/os -I /home/akshat/nginx-1.21.0/src/stream -I /home/akshat/nginx-1.21.0/src/os/unix" -X ngx_config.h,ngx_core.h
परिणाम:
संकलन को और डीबग करके, अधिक हेडर फ़ाइलें जोड़कर इत्यादि द्वारा सफलता को बढ़ाना निश्चित रूप से संभव है। ध्यान दें कि nginx प्रोजेक्ट में संकलन के बाद कोई शेयर्ड ऑब्जेक्ट नहीं है। हालाँकि, इस प्रोग्राम में एक सुविधा है जो PIE एक्ज़ीक्यूटेबल्स को शेयर्ड लाइब्रेरीज़ में बदल सकती है।
एकाधिक आर्गुमेंट वाले फ़ंक्शन को फ़ज़ करने के लिए प्रोग्राम में वर्तमान में लागू विधि fuzzing data provider का उपयोग करती है। इस एकीकरण में कुछ सुधार किए जाने हैं; हालाँकि, मेरा मानना है कि मैं इस सुविधा को डेटा संरचनाओं के साथ शामिल कर सकता हूँ। इसे कोड करते समय एक समस्या जो मुझे आती है वह है codeql और नेस्टेड स्ट्रक्ट्स के साथ। बिना कई क्वेरी लिखे जो प्रत्येक फ़ंक्शन के लिए भिन्न हों, यह विशेष रूप से कठिन हो जाता है। संक्षेप में, इस सुविधा पर और काम करने की आवश्यकता है। मैं protobufs का उपयोग करके एक सरल समाधान के बारे में भी सोच रहा था।
Codeql का उपयोग करके, एक कंट्रोल फ़्लो ग्राफ़ उत्पन्न करना संभव है जो मैप करता है कि किसी फ़ंक्शन में पैरामीटर कैसे इनिशियलाइज़ किए जाते हैं। उस जानकारी का उपयोग करके, हम एक बेहतर हार्नेस बना सकते हैं। दूसरा तरीका है कि लाइब्रेरी में मौजूद फ़ंक्शन के कार्यान्वयन को देखें और उस जानकारी का उपयोग करके हार्नेस के रूप में फ़ंक्शन के कार्यान्वयन पर एक शिक्षित अनुमान लगाएं। इसके साथ मेरी वर्तमान समस्याएं codeql के साथ कंट्रोल फ़्लो ग्राफ़ उत्पन्न करना हैं।
मैं एक सरल प्रोग्राम बना सकता हूँ जो सभी हार्नेस चलाता है और ASAN का उपयोग करके किसी भी सामान्य गलत सकारात्मक को पकड़ता है। इसके अलावा, मैं एक नया इंटरफ़ेस बना सकता हूँ जो सभी हार्नेस को एक साथ चलाता है और उनके आँकड़े प्रदर्शित करता है।
यदि आपको इस प्रोग्राम में कोई बग मिलता है, तो कृपया एक issue बनाएँ। मैं एक समाधान लाने का प्रयास करूँगा। साथ ही, यदि आपके पास किसी नई सुविधा या प्रदर्शन उन्नयन या वर्तमान नियोजित सुविधाओं को लागू करने के तरीके के बारे में कोई विचार है, तो कृपया टैग (contribution) के साथ एक pull request या issue बनाएँ।
यह उपकरण कुछ गलत सकारात्मक उत्पन्न करता है। कृपया पहले क्रैश का विश्लेषण करें और देखें कि यह एक वैध बग है या केवल एक कार्यान्वयन बग। इसके अलावा, यदि कुछ फ़ंक्शन संकलित नहीं हो रहे हैं तो आप डीबग मोड को सक्षम कर सकते हैं। इससे आपको यह समझने में मदद मिलेगी कि क्या कुछ हेडर फ़ाइलें गायब हैं या कोई लिंकेज समस्या है। यदि आप जिस प्रोजेक्ट पर काम कर रहे हैं उसमें शेयर्ड लाइब्रेरीज़ नहीं हैं बल्कि एक एक्ज़ीक्यूटेबल है, तो सुनिश्चित करें कि एक्ज़ीक्यूटेबल को PIE रूप में संकलित करें ताकि यह प्रोग्राम इसे शेयर्ड लाइब्रेरी में बदल सके।