
AFL/QEMU फज़िंग, पूर्ण-सिस्टम इम्यूलेशन के साथ।
नया: जो लोग TriforceAFL और TLSF के साथ प्रयोग करना चाहते हैं, उनके लिए Richard Johnson ने एक Dockerfile बनाई है जो दोनों को इंस्टॉल करती है (और आपके लिए Linux कर्नेल भी बनाती है)। यह यहाँ उपलब्ध है https://hub.docker.com/r/moflow/afl-triforce/tags/।
एक और नई बात: afl-tmin अब forkserver के साथ काम करता है!
https://github.com/nccgroup/TriforceAFL Jesse Hertz [email protected] Tim Newsham [email protected]
यह AFL का एक पैच किया हुआ संस्करण है जो QEMU का उपयोग करके पूर्ण-सिस्टम फ़ज़िंग का समर्थन करता है। शामिल QEMU को अपडेट किया गया है ताकि x86_64 के लिए सिस्टम इम्यूलेटर चलाते समय branch ट्रेसिंग की जा सके। AFL के forkserver को शुरू करने, फ़ज़ सेटिंग्स बनाने, और टेस्ट केस के आरंभ और समाप्ति को चिह्नित करने के लिए अतिरिक्त निर्देश जोड़े गए हैं।
नोट: सभी AFL टूल्स का नए बदलावों के साथ परीक्षण नहीं किया गया है। इन टूल्स का कुछ परीक्षण किया गया है:
निर्माण के लिए:
make
कवरेज मैप प्राप्त करने के लिए:
echo hello > /tmp/hello
./afl-showmap -o coverage.txt -QQ --
./afl-qemu-system-trace -kernel ../bzImage
-initrd ../initramfs.cpio.gz -m 1G -nographic
-append "console=ttyS0" -aflFile /tmp/hello
cat coverage.txt
फ़ज़ करने के लिए:
egrep ' (panic|log_store)$' ../mykern/kallsyms ffffffff8108e570 t log_store ffffffff8181064b T panic
mkdir inputs
echo hello > inputs/hello
./afl-fuzz -i inputs -o outputs -QQ --
afl-qemu-system-trace -kernel bzImage -initrd root.cpio.gz
-m 1G -nographic -append "console=ttyS0"
-aflPanicAddr ffffffff8181064b -aflDmesgAddr ffffffff8108e570
-aflFile @@
(नोट: "-Q" विकल्प का उपयोग करते समय के विपरीत, "-QQ" विकल्प का उपयोग करते समय आपको afl-qemu-system-trace की पूरी कमांड लाइन निर्दिष्ट करनी होगी)।
AFL के इस संशोधित संस्करण का उपयोग कैसे करें, इसके अधिक विवरण के लिए, हमारा Linux syscall फ़ज़र देखें: https://github.com/nccgroup/TriforceLinuxSyscallFuzzer.
नए AFL फ़्लैग: -QQ - user-mode (-Q) के बजाय पूर्ण-सिस्टम इम्यूलेशन में qemu का उपयोग करें
नए QEMU फ़्लैग: -aflFile - फ़ज़र इनपुट वाली फ़ाइल का नाम -aflPanicAddr - panic पहचान के लिए कर्नेल panic एड्रेस का पता -aflDmesgAddr - लॉगिंग का पता लगाने और लॉग संदेशों को इंटरसेप्ट करने के लिए dmesg लॉगिंग फ़ंक्शन का Linux कर्नेल एड्रेस
नए QEMU निर्देश: 0f 24 - aflCall edi=1 startForkserver(esi=enableTicks) AFL का fork server शुरू करें। इस बिंदु के बाद प्रत्येक टेस्ट एक अलग forked child में चलेगा। यदि enableTicks गैर-शून्य है, तो QEMU child को fork करने के बाद CPU का टाइमर फिर से सक्षम करेगा, अन्यथा इसे सक्षम नहीं किया जाएगा। edi=2 getWork(esi=ptr, edx=sz) ptr[0..sz] को अगले इनपुट टेस्ट केस से भरें। भरा गया वास्तविक आकार लौटाता है (<= sz)। edi=3 startWork(esi=ptr) AFL को ट्रेसिंग शुरू करने के लिए कहें। तर्क एक बफर की ओर इशारा करता है जिसमें दो quadwords हैं जो ट्रेस किए जाने वाले कोड के आरंभ और समाप्ति एड्रेस देते हैं। इस सीमा के बाहर के निर्देश ट्रेस नहीं किए जाते हैं। edi=4 doneWork(esi=exitCode) AFL को बताएं कि टेस्ट केस पूरा हो गया है। यदि panic का पता चलता है, तो AFL टेस्ट केस को तुरंत रोक देगा। अन्यथा यह doneWork कॉल होने तक चलता रहेगा। निर्दिष्ट exitCode AFL को लौटा दिया जाता है। (कोड सभी exit codes में 64 मान OR कर सकता है, हालाँकि वर्तमान में ऐसा नहीं करता, यदि टेस्ट केस के दौरान कोई dmesg लॉग पाया गया हो।)
नया QEMU ब्लॉक ड्राइवर: -drive filename=privmem: यह ब्लॉक ड्राइवर ड्राइव की इमेज को copy-on-write मेमोरी में रखता है ताकि परिवर्तन कभी डिस्क पर सहेजे न जाएँ। एक टेस्ट केस द्वारा किए गए परिवर्तन अन्य टेस्ट केसों से अलग रखे जाते हैं।
Michal Zalewski [email protected] द्वारा लिखित और अनुरक्षित
कॉपीराइट 2013, 2014, 2015, 2016 Google Inc. सर्वाधिकार सुरक्षित। Apache License, Version 2.0 की शर्तों और नियमों के अंतर्गत जारी।
नए संस्करणों और अतिरिक्त जानकारी के लिए देखें: http://lcamtuf.coredump.cx/afl/
अन्य उपयोगकर्ताओं से विचारों का आदान-प्रदान करने या प्रमुख नई सुविधाओं के बारे में सूचित होने के लिए, [email protected] पर मेल भेजें।
** यदि आपके पास इस फ़ाइल को पढ़ने का समय नहीं है तो QuickStartGuide.txt देखें। **
फ़ज़िंग वास्तविक दुनिया के सॉफ़्टवेयर में सुरक्षा समस्याओं की पहचान करने के लिए सबसे शक्तिशाली और सिद्ध रणनीतियों में से एक है; यह आज तक सुरक्षा-महत्वपूर्ण सॉफ़्टवेयर में पाए गए रिमोट कोड एक्ज़ीक्यूशन और प्रिविलेज एस्केलेशन बगों के विशाल बहुमत के लिए ज़िम्मेदार है।
दुर्भाग्य से, फ़ज़िंग अपेक्षाकृत उथली भी है; अंधा, यादृच्छिक उत्परिवर्तन परीक्षण किए जा रहे कोड में कुछ कोड पथों तक पहुँचने की संभावना को बहुत कम कर देते हैं, जिससे कुछ कमज़ोरियाँ इस तकनीक की पहुँच से पूरी तरह बाहर रह जाती हैं।
इस समस्या को हल करने के कई प्रयास हुए हैं। शुरुआती दृष्टिकोणों में से एक
अन्य, अधिक परिष्कृत शोध ने प्रोग्राम फ़्लो विश्लेषण ("concolic execution"), प्रतीकात्मक निष्पादन (symbolic execution), या स्थैतिक विश्लेषण जैसी तकनीकों पर ध्यान केंद्रित किया है। ये सभी विधियाँ प्रयोगात्मक सेटिंग्स में अत्यंत आशाजनक हैं, लेकिन व्यावहारिक उपयोगों में विश्वसनीयता और प्रदर्शन समस्याओं से ग्रस्त होती हैं - और वर्तमान में "डंब" फ़ज़िंग तकनीकों का कोई व्यवहार्य विकल्प प्रदान नहीं करती हैं।
American Fuzzy Lop एक brute-force फ़ज़र है जो एक अत्यंत सरल लेकिन अत्यंत मज़बूत instrumentation-निर्देशित आनुवंशिक एल्गोरिदम से जुड़ा है। यह प्रोग्राम नियंत्रण प्रवाह में सूक्ष्म, स्थानीय-स्तरीय परिवर्तनों को सहजता से पकड़ने के लिए एज कवरेज के एक संशोधित रूप का उपयोग करता है।
थोड़ा सरल करते हुए, समग्र एल्गोरिदम को इस प्रकार संक्षेपित किया जा सकता है:
उपयोगकर्ता-आपूर्ति किए गए प्रारंभिक टेस्ट केसों को क्यू में लोड करें,
क्यू से अगली इनपुट फ़ाइल लें,
टेस्ट केस को सबसे छोटे आकार में trim करने का प्रयास करें जो प्रोग्राम के मापे गए व्यवहार को नहीं बदलता,
पारंपरिक फ़ज़िंग रणनीतियों की एक संतुलित और सुशोधित विविधता का उपयोग करके फ़ाइल को बार-बार उत्परिवर्तित करें,
यदि उत्पन्न उत्परिवर्तनों में से कोई भी instrumentation द्वारा दर्ज की गई नई स्थिति संक्रमण का परिणाम देता है, तो उत्परिवर्तित आउटपुट को क्यू में एक नई प्रविष्टि के रूप में जोड़ें।
चरण 2 पर जाएँ।
खोजे गए टेस्ट केसों को समय-समय पर समाप्त भी किया जाता है ताकि उन्हें हटाया जा सके जो नए, उच्च-कवरेज खोजों द्वारा अप्रचलित हो गए हैं; और कई अन्य instrumentation-संचालित प्रयास न्यूनीकरण चरणों से गुजरते हैं।
फ़ज़िंग प्रक्रिया के एक पार्श्व परिणाम के रूप में, टूल दिलचस्प टेस्ट केसों का एक छोटा, स्व-निहित corpus बनाता है। ये अन्य श्रम- या संसाधन-गहन परीक्षण व्यवस्थाओं को सीड करने के लिए अत्यंत उपयोगी हैं - उदाहरण के लिए, ब्राउज़रों, ऑफ़िस अनुप्रयोगों, ग्राफ़िक्स सुइट्स, या बंद-स्रोत टूल्स का स्ट्रेस-टेस्टिंग करने के लिए।