
एक जावास्क्रिप्ट इंजन फ़ज़र
गतिशील भाषा इंटरप्रेटरों के लिए एक (कवरेज-निर्देशित) फजर, जो एक कस्टम मध्यवर्ती भाषा ("FuzzIL") पर आधारित है, जिसे उत्परिवर्तित (mutate) कर जावास्क्रिप्ट में अनुवादित किया जा सकता है।
इस फजर का उपयोग करने के मूल चरण हैं:
swift build [-c release].swift run [-c release] FuzzilliCli --profile=<profile> [अन्य क्ली विकल्प] /path/to/jsshell. यह भी देखें swift run FuzzilliCli --help।फजली और समर्थित जावास्क्रिप्ट इंजनों को डॉकर और Google Compute Engine के अंदर बनाना और चलाना भी समर्थित है।
Fuzzilli लाइब्रेरी के उपयोग का एक उदाहरण देखने और विभिन्न कॉन्फ़िगरेशन विकल्पों के साथ खेलने के लिए main.swift देखें। इसके बाद, उच्च-स्तरीय फजिंग लॉजिक के लिए Fuzzer.swift देखें। वहाँ से किसी भी दिलचस्प हिस्से में गोता लगाएँ।
इस परियोजना में पैच, परिवर्धन, अन्य योगदान आदि का बहुत स्वागत है! हालाँकि, योगदानकर्ताओं के लिए नोट्स जल्दी से देख लें। Fuzzilli मोटे तौर पर Google के Swift के लिए कोड शैली गाइड का अनुसरण करता है।
यदि आप इस परियोजना की मदद से पाई गई किसी भेद्यता के लिए [email protected] पर एक संक्षिप्त नोट (संभवतः CVE नंबर सहित) भेज सकते हैं या एक पुल अनुरोध खोल सकते हैं तो बहुत सराहना की जाएगी ताकि इसे बग शोकेस अनुभाग में शामिल किया जा सके। इसके अलावा आप निश्चित रूप से किसी भी बग बाउंटी, CVE क्रेडिट आदि का दावा कर सकते हैं :)
जब मुख्य इंटरप्रेटर बग, जैसे कि JIT कंपाइलर में, के लिए फजिंग की जाती है, तो उत्पन्न प्रोग्रामों की सिमैंटिक शुद्धता एक चिंता का विषय बन जाती है। यह अधिकांश अन्य परिदृश्यों के विपरीत है, उदाहरण के लिए रनटाइम API की फजिंग, जहाँ सिमैंटिक शुद्धता को जनरेटेड कोड को try-catch कंस्ट्रक्ट में लपेटकर आसानी से दरकिनार किया जा सकता है। स्वीकार्य दर पर सिमैंटिकली सही नमूने प्राप्त करने के लिए अलग-अलग संभावनाएँ हैं, उनमें से एक उत्परिवर्तन दृष्टिकोण है जिसमें कोष में सभी नमूने भी सिमैंटिकली मान्य होते हैं। उस स्थिति में, प्रत्येक उत्परिवर्तन में एक मान्य नमूने को अमान्य में बदलने की संभावना कम होती है।
एक उत्परिवर्तन-आधारित जावास्क्रिप्ट फजर को लागू करने के लिए, जावास्क्रिप्ट कोड पर उत्परिवर्तन को परिभाषित करना होता है। किसी प्रोग्राम के AST या अन्य सिंटैक्टिक तत्वों को उत्परिवर्तित करने के बजाय, एक कस्टम मध्यवर्ती भाषा (IL) को परिभाषित किया जाता है जिस पर प्रोग्राम के नियंत्रण और डेटा प्रवाह में उत्परिवर्तन अधिक सीधे किए जा सकते हैं। इस IL का बाद में निष्पादन के लिए जावास्क्रिप्ट में अनुवाद किया जाता है। मध्यवर्ती भाषा मोटे तौर पर इस प्रकार दिखती है:
v0 <− LoadInteger '0'
v1 <− LoadInteger '10'
v2 <− LoadInteger '1'
v3 <− LoadInteger '0'
BeginFor v0, '<', v1, '+', v2 −> v4
v6 <− BinaryOperation v3, '+', v4
Reassign v3, v6
EndFor
v7 <− LoadString 'Result: '
v8 <− BinaryOperation v7, '+', v3
v9 <− LoadGlobal 'console'
v10 <− CallMethod v9, 'log', [v8]
जिसे आसानी से निम्नलिखित जावास्क्रिप्ट कोड में अनुवादित किया जा सकता है:
const v0 = 0;
const v1 = 10;
const v2 = 1;
let v3 = 0;
for (let v4 = v0; v4 < v1; v4 = v4 + v2) {
const v6 = v3 + v4;
v3 = v6;
}
const v7 = "Result: ";
const v8 = v7 + v3;
const v9 = console;
const v10 = v9.log(v8);
या मध्यवर्ती अभिव्यक्तियों को इनलाइन करके निम्नलिखित जावास्क्रिप्ट कोड में:
let v3 = 0;
for (let v4 = 0; v4 < 10; v4++) {
v3 = v3 + v4;
}
console.log("Result: " + v3);
FuzzIL में कई गुण हैं:
Reassign निर्देश के माध्यम से पुन: असाइन किया जा सकता है।इन प्रोग्रामों पर कई उत्परिवर्तन किए जा सकते हैं:
Fuzzilli कैसे काम करता है इसकी अधिक विस्तृत चर्चा यहाँ पाई जा सकती है।
फजर Swift में लागू किया गया है, जिसमें कुछ भाग (जैसे कवरेज माप, सॉकेट इंटरैक्शन, आदि) C में लागू किए गए हैं।
एक फजर इंस्टेंस (Fuzzer.swift में लागू) निम्नलिखित केंद्रीय घटकों से बना होता है:
इसके अलावा, कई मॉड्यूल वैकल्पिक रूप से उपलब्ध हैं: