Bosh sahifa Wiki Fuzzing

Fuzzing

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:

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