
पायथन अनुप्रयोगों के लिए कवरेज-आधारित फ़ज़र
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:<त्रुटि फ़ाइल>।
रिपोर्ट निर्देशिका निम्नलिखित रूप में है:
├── out
│ ├── id:<क्रैश ID>,err:<त्रुटि प्रकार>,err_file:<त्रुटि फ़ाइल>,err_pos:<त्रुटि स्थान>
│ ├── message
│ ├── input
│ ├── 0
│ ├── <inputfile1>
│ ├── ...
│ ├── ...
प्रत्येक क्रैश रिपोर्ट में एक message फ़ाइल होती है जिसमें त्रुटि संदेश होता है।
प्रत्येक कवरेज वृद्धि रिपोर्ट कवरेज फ़ोल्डर (डिफ़ॉल्ट रूप से ./cov) में coverage_<ID> नामक फ़ोल्डर में सहेजी जाती है, और रिपोर्ट निर्देशिका क्रैश रिपोर्ट निर्देशिकाओं के समान रूप में होती है।
एक फ़ंक्शन को पास किए गए इनपुट को pickle मॉड्यूल का उपयोग करके क्रमबद्ध किया जाता है, इससे पहले कि उन्हें <report_folder>/input फ़ाइल में सहेजा जाए। इसलिए फ़ाइल की सामग्री को पढ़ने के लिए इसे डिसीरियलाइज़ करना आवश्यक है। यह क्रिया frelatage-report कमांड के साथ की जा सकती है।
$ frelatage-report input
Frelatage को सेट करने के दो तरीके हैं:
एक कॉन्फ़िगरेशन उदाहरण:
export FRELATAGE_DICTIONARY_ENABLE=1 &&
export FRELATAGE_SAVE_NEW_COVERAGE=1 &&
export FRELATAGE_TIMEOUT_DELAY=2 &&
export FRELATAGE_INPUT_FILE_TMP_DIR="/tmp/frelatage" &&
export FRELATAGE_INPUT_MAX_LEN=4096 &&
export FRELATAGE_MAX_THREADS=8 &&
export FRELATAGE_MAX_STAGES=1000000 &&
export FRELATAGE_MAX_CYCLES_WITHOUT_NEW_PATHS=5000 &&
export FRELATAGE_INPUT_DIR="./in" &&
export FRELATAGE_DICTIONARY_DIR="./dict" &&
python3 fuzzer.py
import frelatage
def myfunction(input1_string, input2_int):
pass
input1 = frelatage.Input(value="initial_value")
input2 = frelatage.Input(value=2)
f = frelatage.Fuzzer(
# वह विधि जिसे आप फ़ज़ करना चाहते हैं
method=myfunction,
# कोर्पस
corpus=[[input1], [input2]],
# धागों की संख्या
threads_count=8,
# अपवाद जिन पर ध्यान दिया जाएगा
exceptions_whitelist=(OSError),
# अपवाद जिन पर ध्यान नहीं दिया जाएगा
exceptions_blacklist=(),
# निर्देशिका जहाँ त्रुटि रिपोर्ट संग्रहीत की जाएंगी
output_directory="./out",
# निर्देशिका जहाँ कवरेज वृद्धि रिपोर्ट संग्रहीत की जाएंगी
coverage_directory="./cov",
# साइलेंट मोड सक्षम या अक्षम करें
silent=False,
# अनंत फ़ज़िंग सक्षम या अक्षम करें
infinite_fuzz=False
)
f.fuzz()
कृपया ध्यान रखें कि कई अन्य कम्प्यूटेशनल-गहन कार्यों के समान, फ़ज़िंग आपके हार्डवेयर और OS पर दबाव डाल सकती है। विशेष रूप से:
आपका CPU गर्म होगा और उसे पर्याप्त शीतलन की आवश्यकता होगी। अधिकांश मामलों में, यदि शीतलन अपर्याप्त है या ठीक से काम करना बंद कर देता है, तो CPU की गति स्वचालित रूप से कम हो जाएगी। हालाँकि, विशेष रूप से कम उपयुक्त हार्डवेयर (लैपटॉप, स्मार्टफोन, आदि) पर फ़ज़िंग करते समय, कुछ विस्फोट होना पूरी तरह से असंभव नहीं है।
लक्षित प्रोग्राम अनियमित रूप से गीगाबाइट मेमोरी हथिया सकते हैं या डिस्क स्थान को कबाड़ फ़ाइलों से भर सकते हैं। Frelatage बुनियादी मेमोरी सीमाएँ लागू करने का प्रयास करता है, लेकिन हर संभावित दुर्घटना को नहीं रोक सकता। निचली पंक्ति यह है कि आपको उन सिस्टमों पर फ़ज़िंग नहीं करनी चाहिए जहाँ डेटा हानि की संभावना एक स्वीकार्य जोखिम नहीं है।
फ़ज़िंग में फ़ाइलसिस्टम पर अरबों रीड और राइट शामिल हैं। आधुनिक सिस्टमों पर, यह आमतौर पर भारी कैश्ड होगा, जिसके परिणामस्वरूप काफी मामूली "भौतिक" I/O होगा - लेकिन ऐसे कई कारक हैं जो इस समीकरण को बदल सकते हैं। संभावित परेशानी की निगरानी करना आपकी जिम्मेदारी है; बहुत भारी I/O के साथ, कई HDD और SSD की उम्र कम हो सकती है।
Linux पर डिस्क I/O की निगरानी करने का एक अच्छा तरीका 'iostat' कमांड है:
$ iostat -d 3 -x -k [...वैकल्पिक डिस्क ID...]
मैं Rog3rSm1th हूँ, मैं 21 साल का हूँ और एक फ्रांसीसी कंप्यूटर और साइबर सुरक्षा उत्साही हूँ। मुझे उपकरण विकसित करना (OSINT, फ़ज़िंग...) और CTFs/Wargames खेलना पसंद है। मेरे और मेरी परियोजनाओं के बारे में अधिक जानने के लिए, बस यहाँ क्लिक करें।
➜ यदि आप मुझे अपनी किसी एक परियोजना (प्रोग्रामिंग, साइबर सुरक्षा...) के लिए काम पर रखना चाहते हैं, तो बस मुझसे [email protected] पर संपर्क करें और हम आपकी आवश्यकताओं का एक साथ आकलन करेंगे।
किसी भी टिप्पणी, सुझाव, बग रिपोर्ट के लिए, या यदि आपको Frelatage का उपयोग करके कोई बग मिला है, तो आप मुझसे [email protected] या ट्विटर पर @Rog3rSm1th पर संपर्क कर सकते हैं।
| ENV चर | विवरण | संभावित मान | डिफ़ॉल्ट मान |
|---|
| FRELATAGE_DICTIONARY_ENABLE | शब्दकोश तत्वों पर आधारित उत्परिवर्तन के उपयोग को सक्षम करें | 1 सक्षम करने के लिए, 0 अन्यथा | 1 |
| FRELATAGE_SAVE_NEW_COVERAGE | नए कवरेज इनपुट को बाद में पुन: उपयोग करने के लिए सहेजें | 1 सक्षम करने के लिए, 0 अन्यथा | 1 |
| FRELATAGE_TIMEOUT_DELAY | सेकंड में देरी जिसके बाद एक फ़ंक्शन TimeoutError लौटाएगा | 1 - अनंत | 2 |
| FRELATAGE_INPUT_FILE_TMP_DIR | अस्थायी फ़ोल्डर जहाँ इनपुट फ़ाइलें संग्रहीत की जाती हैं | एक फ़ोल्डर का पूर्ण पथ, जैसे /tmp/custom_dir | /tmp/frelatage |
| FRELATAGE_INPUT_MAX_LEN | बाइट्स में एक इनपुट चर का अधिकतम आकार | 4 - अनंत | 4094 |
| FRELATAGE_MAX_THREADS | एक साथ धागों की अधिकतम संख्या | 8 - अनंत | 8 |
| FRELATAGE_MAX_STAGES | एक फ़ज़्ड फ़ंक्शन के लिए चरणों की अधिकतम संख्या | 1 - अनंत | 1000000 |
| FRELATAGE_MAX_CYCLES_WITHOUT_NEW_PATHS | नए पथों के बिना चक्रों की संख्या जिसके बाद हम अगले चरण पर जाते हैं | 10 - अनंत | 5000 |
| FRELATAGE_INPUT_DIR | प्रारंभिक इनपुट फ़ाइलों वाली निर्देशिका। इसे एक सापेक्ष पथ (फ़ज़िंग फ़ाइल के पथ के सापेक्ष) होना चाहिए | एक फ़ोल्डर का सापेक्ष पथ, जैसे ./in | ./in |
| FRELATAGE_DICTIONARY_DIR | शब्दकोशों के लिए डिफ़ॉल्ट निर्देशिका। इसे एक सापेक्ष पथ (फ़ज़िंग फ़ाइल के पथ के सापेक्ष) होना चाहिए | एक फ़ोल्डर का सापेक्ष पथ, जैसे ./dict | ./dict |
| FRELATAGE_DEBUG_MODE | डीबग मोड सक्षम करें (जब Frelatage क्रैश होता है तो त्रुटि दिखाएँ) | 1 सक्षम करने के लिए, 0 अन्यथा | 1 |