
riscv से x86 बाइनरी अनुवाद और आधुनिक फ़ज़िंग तकनीकों का उपयोग करके उच्च प्रदर्शन फ़ज़िंग
प्रारंभ तिथि: दिसंबर, 2021
यह एक कवरेज-निर्देशित (coverage-guided), इम्यूलेशन-आधारित ग्रेबॉक्स फज़र है जो नियर-नेटिव प्रदर्शन प्राप्त करने के लिए एक कस्टम जस्ट-इन-टाइम कंपाइलर का उपयोग करता है। यह निष्पादन के दौरान RISC-V elf बाइनरीज़ को x86 में JIT-संकलित करने से पहले उन्हें एक इंटरमीडिएट रिप्रेजेंटेशन में लिफ्ट करके काम करता है। JIT संकलन के दौरान कोड को इंस्ट्रूमेंट किया जाता है ताकि कवरेज ट्रैकिंग, asan, cmpcov, या स्नैपशॉट-आधारित फज़िंग जैसे फज़िंग-सुधार सक्षम हो सकें।

इस परियोजना का उद्देश्य फज़िंग के लिए इम्यूलेटेड वातावरण का उपयोग करने के लाभों को उजागर करना है। इम्यूलेशन पर आधारित कई पिछले फज़र मौजूद हैं, लेकिन वे सभी लगभग विशेष रूप से अंतर्निहित इम्यूलेशन के लिए qemu इम्यूलेशन इंजन का उपयोग करते हैं। हालाँकि इस इंजन में एक काफी परिपक्व जस्ट-इन-टाइम कंपाइलर है और यह बहुत अच्छा कोड उत्पन्न करता है, फिर भी यह फज़िंग के लिए डिज़ाइन नहीं किया गया है। फज़िंग के दौरान, हम एक ही प्रक्रिया को प्रति सेकंड हजारों बार चलाने का इरादा रखते हैं। यह विशेष अनुकूलन के लिए जगह बनाता है, जिनका qemu मजबूती से उपयोग नहीं करता है, जैसे कि प्रत्येक प्रक्रिया रन के लिए समान मेमोरी स्पेस का पुन: उपयोग करना और डर्टी-बिट मैकेनिक्स के माध्यम से केवल सीमित मात्रा में मेमोरी को रीसेट करना।
कई मायनों में, यह एक प्रूफ-ऑफ-कॉन्सेप्ट से अधिक है, जिस पर मैं कंपाइलर इंटर्नल्स सीखने के लिए काम करना चाहता था, और विभिन्न फज़िंग तकनीकों — जैसे अलग-अलग कवरेज मेट्रिक्स, सीड शेड्यूलर और स्नैपशॉट-आधारित फज़िंग — के साथ प्रयोग करने के लिए एक इम्यूलेशन-आधारित प्लेग्राउंड रखना चाहता था। हालाँकि, अधिक JIT अनुकूलन और सबसे महत्वपूर्ण रूप से mips या arm जैसी अधिक लोकप्रिय आर्किटेक्चर शामिल करने वाले एक्सटेंशन के साथ, इसका उपयोग निश्चित रूप से क्लोज़्ड-सोर्स कोड को कुशलतापूर्वक फज़ करने के लिए किया जा सकता है, जिसे केवल पुनर्संकलन द्वारा इंस्ट्रूमेंट नहीं किया जा सकता।
अब तक मेरे द्वारा किए गए परीक्षणों को देखते हुए, sfuzz में कई अन्य लोकप्रिय फज़र की तुलना में काफी कम ओवरहेड है, जिसके परिणामस्वरूप बहुत तेज़ प्रदर्शन मिलता है, विशेषकर छोटे फज़ केसों के लिए।
इस फज़र के लिए किए गए फीचर्स/विकल्पों पर अधिक विवरण संलग्न ब्लॉगपोस्ट (https://seal9055.com/blog/fuzzing/sfuzz) और नीचे सूचीबद्ध दस्तावेज़ फ़ाइलों में दिए गए हैं:
यह पूरा फज़र rust में लिखा गया है, इसलिए रिपॉजिटरी क्लोन करने के बाद, संकलन के लिए बस cargo build --release चलाएँ।
चूँकि फज़र वर्तमान में केवल RISC-V का समर्थन करता है, इसलिए लक्ष्य को नीचे दिए गए टूलचेन (या इसी जैसे किसी अन्य) का उपयोग करके RISC-V में संकलित करना आवश्यक है। वैकल्पिक रूप से, यदि आपके पास पहले से कोई RISC-V बाइनरी है, तो वह भी पूरी तरह से काम करेगी।
एक बार यह सेटअप हो जाने पर, बस इनपुट/आउटपुट डायरेक्ट्रीज़ बनाएँ, इनपुट डायरेक्ट्री में कुछ प्रारंभिक सीड फ़ाइलें जोड़ें और फज़र शुरू कर दें।
./sfuzz -i in -o out -- ./test_cases/simple_test @@
थ्रेड्स की संख्या निर्दिष्ट करने, स्नैपशॉट फज़िंग सक्षम करने, म्यूटेटर में डिक्शनरी जोड़ने, आदि के लिए कमांडलाइन विकल्पों के माध्यम से अतिरिक्त फ्लैग पास किए जा सकते हैं। अतिरिक्त विकल्पों की सूची sfuzz को -h फ्लैग के साथ चलाकर देखी जा सकती है।
यदि आप विभिन्न जटिलता वाले कुछ लक्ष्यों पर फज़र का परीक्षण करना चाहते हैं, तो tools/program_generator पर उपलब्ध progrem_generator का उपयोग विभिन्न जटिलता के प्रोग्राम स्वचालित रूप से उत्पन्न करने के लिए किया जा सकता है। ध्यान दें कि उसके बाद लक्ष्य को संकलित करने के लिए आपको RISC-V टूलचेन की आवश्यकता होगी।
यह riscv बाइनरी संकलित करने के लिए एक टूलचेन सेट करता है जिन्हें इस परियोजना द्वारा लोड/उपयोग किया जा सकता है।
Riscv compiler/tooling:
sudo apt-get install autoconf automake autotools-dev curl python3 libmpc-dev libmpfr-dev \
libgmp-dev gawk build-essential bison flex texinfo gperf libtool patchutils bc zlib1g-dev \
libexpat-dev
git clone https://github.com/riscv/riscv-gnu-toolchain && cd riscv-gnu-toolchain
./configure --prefix=/opt/riscv --with-arch=rv64i
sudo make
Debugger:
gdb-multiarch
यह सूची उन सुविधाओं के समूह को दर्शाती है जिन्हें भविष्य में लागू करने की योजना है।