Fuzzing — dasturga ko‘p sonli noodatiy, buzilgan, tasodifiy yoki maxsus yaratilgan inputlarni avtomatik berib, crash, hang, memory corruption, assertion failure va boshqa zaifliklarni topish usuli. Jarayon fuzz testing deb ham ataladi. Fuzzing parser, protocol, file format, API, compiler va native kutubxonalarda keng qo‘llanadi.
Fuzzer faqat random byte yuboradigan vosita emas. Zamonaviy usullar code coverage, input structure va oldingi natijalardan foydalanib yangi qiziqarli test case’lar yaratadi.
Fuzz target
Fuzzer chaqiradigan kichik entry point fuzz target yoki harness deyiladi.
U input byte’larini olib, test qilinayotgan function yoki kutubxonaga uzatadi:
bytes
→ parser
→ result
Harness tez, deterministic va tashqi side effectlarsiz bo‘lishi kerak.
Seed corpus
Fuzzer boshlanishida kichik valid yoki qisman valid inputlar to‘plami beriladi.
Masalan:
Yaxshi seed parserning chuqur qismlariga tezroq kirishga yordam beradi.
Mutation
Fuzzer mavjud inputni o‘zgartiradi:
- bit almashtirish;
- byte qo‘shish;
- qismni o‘chirish;
- integer boundary;
- blokni takrorlash;
- dictionary token qo‘shish;
- ikki inputni birlashtirish.
Mutation strategiyasi format va coverage natijasiga moslashishi mumkin.
Generation-based fuzzing
Inputni noldan grammar yoki schema asosida yaratadi.
Masalan, valid JSON structure ichida turli qiymatlar hosil qiladi.
Bu parserning dastlabki validationidan o‘tib, chuqurroq logikani tekshiradi.
Grammar noto‘g‘ri bo‘lsa muhim holatlar yaratilmaydi.
Coverage-guided fuzzing
Fuzzer qaysi input yangi code branch yoki pathni ochganini instrumentation orqali biladi.
Yangi coverage bergan input corpusda saqlanadi va yana mutate qilinadi.
Bu random fuzzingga qaraganda code’ning ko‘proq qismini o‘rganishi mumkin.
Black-box fuzzing
Dastur ichki coverage’sini bilmasdan input yuboradi va output, crash yoki timeoutni kuzatadi.
Closed-source service va network appliance’da ishlatiladi.
Feedback kam bo‘lgani uchun samaradorlik input modeli va protocol bilimiga ko‘proq bog‘liq.
White-box fuzzing
Source, control flow yoki symbolic executiondan foydalanadi.
Path constraintlarni yechib yangi branchga kiradigan input yaratishi mumkin.
Aniqroq, ammo hisoblash qimmat.
Katta dasturda path explosion muammosi mavjud.
Grey-box fuzzing
Coverage kabi yengil ichki feedbackdan foydalanadi, lekin to‘liq symbolic analysis qilmaydi.
Amaliy fuzzing tool’larining katta qismi shu guruhga yaqin.
Tezlik va yo‘naltirilgan qidiruv o‘rtasida muvozanat beradi.
Sanitizer
Native C/C++ fuzzingda sanitizer yashirin memory xatolarini aniqlaydi:
- AddressSanitizer;
- UndefinedBehaviorSanitizer;
- MemorySanitizer;
- ThreadSanitizer.
Oddiy run crash bermasa ham out-of-bounds access sanitizer bilan topilishi mumkin.
Sanitizer build sekinroq ishlaydi.
Crash
Fuzzer quyidagi signallarni failure deb olishi mumkin:
- segmentation fault;
- abort;
- uncaught exception;
- assertion;
- sanitizer report;
- process exit;
- kernel fault.
Har crash security vulnerability emas, ammo tahlil talab qiladi.
Hang va timeout
Input infinite loop yoki juda sekin algorithmga olib kelishi mumkin.
Fuzzer har test case uchun timeout belgilaydi.
Bu denial-of-service va algorithmic complexity muammolarini topadi.
Timeout environment sekinligiga mos kalibrlanadi.
Reproducer
Failure topilganda ayni input artifact sifatida saqlanadi.
Developer uni alohida ishga tushirib bugni takrorlaydi.
Build version, sanitizer va command ham saqlanadi.
Faqat stack trace, input bo‘lmasa diagnostika qiyinlashadi.
Minimization
Crash inputi ko‘pincha katta va keraksiz byte’lardan iborat.
Minimizer failure saqlangan holda inputni kichraytiradi.
Kichik reproducer sababni tushunish va regression test yozishni osonlashtiradi.
Deduplication
Bir bug minglab turli input bilan crash berishi mumkin.
Fuzzer stack hash, coverage yoki fault address orqali ularni guruhlaydi.
Noto‘g‘ri dedup alohida buglarni birlashtirib yuborishi mumkin.
Muhim crashlar manual triage qilinadi.
Dictionary
Formatga xos tokenlar ro‘yxati fuzzergа beriladi:
"Content-Length"
"{"
"</script>"
"SELECT"
Mutation shu tokenlarni inputga qo‘shadi.
Bu structured parser branchlariga kirishni tezlashtiradi.
Stateful protocol
Network protocol bir nechta message ketma-ketligini talab qilishi mumkin:
connect
→ authenticate
→ command
→ data
Bitta paket fuzzing chuqur state’ga bormaydi.
Stateful harness session modelini yaratadi yoki snapshotdan boshlaydi.
File parser
Image, PDF, media va archive parserlar fuzzing uchun muhim, chunki ular untrusted fayl qabul qiladi.
Harness faylni memorydan parse qiladi.
Disk I/Oni kamaytirish execution tezligini oshiradi.
Decode natijasi ishlatilishi kerak, aks holda compiler ayrim kodni olib tashlashi mumkin.
Regression test
Topilgan bug tuzatilgach minimal input normal test suite’ga qo‘shiladi.
Kelajakda ayni crash qaytmasligi tekshiriladi.
Fuzz corpus ham yangi input bilan boyiydi.
Fix faqat crashni yashirib, asl validation muammosini qoldirmasligi kerak.
CI va continuous fuzzing
Qisqa fuzz run har commitda, uzoq campaign esa doimiy serverda ishlashi mumkin.
Yangi build corpus bilan qayta tekshiriladi.
Crash avtomatik issue, artifact va stack bilan yuboriladi.
Resource limit va maxfiy input policy boshqariladi.
Security chegarasi
Fuzzerning o‘zi untrusted input va vulnerable code’ni ishlatadi.
U sandbox yoki containerda, minimal permission bilan bajariladi.
Production credential va ichki networkga access berilmaydi.
Crash artifact personal data saqlamasligi kerak.
Coverage plateau
Uzoq run davomida yangi branch topilmasa coverage plateau kuzatiladi. Yangi seed, dictionary, grammar yoki yaxshiroq harness qo‘shiladi. Faqat ko‘proq CPU berish har doim yangi path ochmaydi.
Bog‘liq tushunchalar
Fuzz testing, Fuzzer, Seed corpus, Mutation, Coverage-guided fuzzing, Sanitizer, Crash reproduction, Input minimization, Security testing, Property-based testing