
पायथन अनुप्रयोगों के लिए कवरेज-आधारित फ़ज़र
pip3 install frelatage
फ़ज़र जिसकी दुनिया हक़दार है
स्थापना | यह कैसे काम करता है | विशेषताएँ | Frelatage का उपयोग | कॉन्फ़िगरेशन
Frelatage एक कवरेज-आधारित Python फ़ज़िंग लाइब्रेरी है जिसका उपयोग Python कोड को फ़ज़ करने के लिए किया जा सकता है। Frelatage के विकास को विभिन्न अन्य फ़ज़र्स से प्रेरणा मिली, जिनमें AFL/AFL++, Atheris और PythonFuzz शामिल हैं। परियोजना का मुख्य उद्देश्य इन फ़ज़र्स की सर्वोत्तम विशेषताओं का लाभ उठाना और उन्हें एक नए उपकरण में एकत्रित करना है ताकि Python अनुप्रयोगों को कुशलतापूर्वक फ़ज़ किया जा सके।
अस्वीकरण : यह परियोजना अल्फा चरण में है और अभी भी कई अप्रत्याशित व्यवहार उत्पन्न कर सकती है। इस समय Frelatage का उपयोग उत्पादन वातावरण में नहीं किया जाना चाहिए।
pip3 install frelatage
डेवलपर्स के लिए अनुशंसित। यह स्वचालित रूप से frelatage रेपो से मुख्य शाखा को क्लोन करता है और स्रोत से स्थापित करता है।
# स्वचालित रूप से Frelatage रिपॉजिटरी को क्लोन करें और स्रोत से Frelatage स्थापित करें
bash <(wget -q https://raw.githubusercontent.com/Rog3rSm1th/Frelatage/main/scripts/autoinstall.sh -O -)
Frelatage के डिज़ाइन के पीछे का विचार एक आनुवंशिक एल्गोरिथ्म का उपयोग करना है जो उत्परिवर्तन उत्पन्न करता है जो अधिक से अधिक कोड को कवर करेगा। एक फ़ज़िंग चक्र की कार्यप्रणाली को इस आरेख के साथ मोटे तौर पर संक्षेपित किया जा सकता है:
graph TB
m1(उत्परिवर्तन 1) --> |input| function(फ़ज़्ड फ़ंक्शन)
m2(उत्परिवर्तन 2) --> |input| function(फ़ज़्ड फ़ंक्शन)
mplus(उत्परिवर्तन ...) --> |input| function(फ़ज़्ड फ़ंक्शन)
mn(उत्परिवर्तन n) --> |input| function(फ़ज़्ड फ़ंक्शन)
function --> generate_reports(रिपोर्ट उत्पन्न करें)
generate_reports --> rank_reports(रिपोर्ट को रैंक करें)
rank_reports --> select(सर्वश्रेष्ठ n रिपोर्ट चुनें)
select --> |mutate| nm1(उत्परिवर्तन 1) & nm2(उत्परिवर्तन 2) & nmplus(उत्परिवर्तन ...) & nmn(उत्परिवर्तन n)
subgraph चक्र उत्परिवर्तन
direction LR
m1
m2
mplus
mn
end
subgraph अगले चक्र के उत्परिवर्तन
direction LR
nm1
nm2
nmplus
nmn
end
style function fill:#5388e8,stroke:white,stroke-width:4px
Frelatage एक फ़ंक्शन को इनपुट के रूप में फ़ाइल पास करके फ़ज़ करने की अनुमति देता है।
import frelatage
import my_vulnerable_library
def MyFunctionFuzz(data):
my_vulnerable_library.parse(data)
input = frelatage.Input(value="initial_value")
f = frelatage.Fuzzer(MyFunctionFuzz, [[input]])
f.fuzz()
Frelatage आपको फ़ाइल प्रकार के इनपुट पैरामीटर को फ़ज़ करने की संभावना देता है। इन फ़ाइलों के मान को प्रारंभ करने के लिए, आपको इनपुट फ़ोल्डर (डिफ़ॉल्ट रूप से ./in) में फ़ाइलें बनानी होंगी।
यदि हम फ़ज़ करने के लिए उपयोग की जाने वाली फ़ाइल के मान को प्रारंभ करना चाहते हैं, तो हम इसे इस प्रकार कर सकते हैं:
echo "initial value" > ./in/input.txt
और फिर फ़ज़र चलाएँ:
import frelatage
import my_vulnerable_library
def MyFunctionFuzz(data):
my_vulnerable_library.load_file(data)
input = frelatage.Input(file=True, value="input.txt")
f = frelatage.Fuzzer(MyFunctionFuzz, [[input]])
f.fuzz()
import frelatage
import my_vulnerable_library
input = frelatage.Input(file=True, value="input.txt")
@frelatage.instrument([[input]])
def MyFunctionFuzz_1(data):
my_vulnerable_library.load_file(data)
@frelatage.instrument([[input]])
def MyFunctionFuzz_1(data):
my_vulnerable_library.load_file_but_different(data)
# और इसी तरह
# यह इंस्ट्रूमेंटेड विधियों को एक के बाद एक फ़ज़ करेगा
frelatage.Fuzzer.fuzz_all()
यदि आपको एक साथ कई फ़ाइलों को कोर्पस में लोड करने की आवश्यकता है (यदि आप एक बड़े कोर्पस का उपयोग करते हैं तो उपयोगी) तो आप Frelatage के अंतर्निहित फ़ंक्शन load_corpus का उपयोग कर सकते हैं। यह फ़ंक्शन इनपुट की एक सूची लौटाता है।
load_corpus(directory: str, file_extensions: list) -> list[Input]
./, ./images["jpeg", "gif"], ["pdf"]import frelatage
import my_vulnerable_library
def MyFunctionFuzz(data):
my_vulnerable_library.load_file(data)
my_vulnerable_library.load_file(data2)
# ./in निर्देशिका में प्रत्येक फ़ाइल लोड करें
corpus_1 = frelatage.load_corpus(directory="./")
# ./in/images उपनिर्देशिका में सभी .gif/.jpeg फ़ाइलें लोड करें
corpus_2 = frelatage.load_corpus(directory="./images", file_extension=["gif", "jpeg"])
f = frelatage.Fuzzer(MyFunctionFuzz, [corpus_1, corpus_2])
f.fuzz()
आप यहाँ स्थित एक या अधिक शब्दकोशों को शब्दकोशों के लिए समर्पित निर्देशिका (डिफ़ॉल्ट रूप से ./dict) में कॉपी कर सकते हैं।
डिफरेंशियल फ़ज़िंग एक लोकप्रिय सॉफ़्टवेयर परीक्षण तकनीक है जो कई लाइब्रेरी/प्रोग्राम को समान इनपुट प्रदान करके और उनके व्यवहार में अंतर देखकर बग का पता लगाने का प्रयास करती है। आपको यहाँ json और ujson लाइब्रेरी के साथ Frelatage के साथ डिफरेंशियल फ़ज़िंग के उपयोग का एक उदाहरण मिलेगा।
आप उदाहरण निर्देशिका में फ़ज़र्स और कोर्पस के और उदाहरण पा सकते हैं।
प्रत्येक क्रैश रिपोर्ट आउटपुट फ़ोल्डर (डिफ़ॉल्ट रूप से ./out) में एक फ़ोल्डर में सहेजी जाती है, जिसका नाम होता है: id:<क्रैश ID>,err:<त्रुटि प्रकार>,err_pos:<त्रुटि>,err_file:<त्रुटि फ़ाइल>।