Bosh sahifa Wiki Fuzz testing

Fuzz testing

Fuzz testing — dasturga ko‘p sonli avtomatik yaratilgan, o‘zgartirilgan yoki kutilmagan kirishlarni berib, crash, xotira buzilishi, assertion failure va boshqa nuqsonlarni izlash usulidir. Fuzzer oddiy tasodifiy bayt yuborish bilan cheklanmaydi: zamonaviy coverage-guided vositalar qaysi input yangi kod yo‘lini ochganini o‘lchab, keyingi mutatsiyalarni shunga yo‘naltiradi.

Input hosil qilish

Mutation-based fuzzer mavjud seed corpusdagi fayl yoki paketlarni o‘zgartiradi: bit almashtiradi, blokni takrorlaydi, uzunlikni buzadi yoki maxsus qiymat qo‘shadi. Generation-based fuzzer format grammatikasi yoki protokol modelidan yangi valid va yarim-valid input yaratadi. Birinchi usulni boshlash oson, ikkinchisi murakkab parser qatlamlaridan chuqurroq o‘tishi mumkin.

Corpus kichik, turli xatti-harakatni ochadigan namunalar to‘plamidir. Juda ko‘p bir xil seed mutation vaqtini behuda sarflaydi. Corpus minimization bir xil coverage beradigan ortiqcha namunalardan voz kechadi.

Harness va kuzatuv

Fuzz harness tekshiriladigan funksiyani input baytlari bilan chaqiradigan yupqa adapterdir. U deterministik, tez va tashqi statega imkon qadar kam bog‘liq bo‘ladi. Har iteratsiyada network xizmatini qayta ishga tushirish throughputni keskin kamaytiradi; parser yoki library entry pointini process ichida chaqirish samaraliroq.

Crash yagona oracle emas. AddressSanitizer out-of-bounds va use-after-free xatolarini, UndefinedBehaviorSanitizer aniqlanmagan C/C++ xatti-harakatini topadi. Timeout cheksiz loopni, memory limit esa nazoratsiz allocationni ko‘rsatadi. Logical invariant ham harness ichida assertion bilan tekshirilishi mumkin.

Coverage-guided sikl

Fuzzer inputni bajaradi, yangi edge yoki block coverage kuzatilsa uni corpusga qo‘shadi va shu namunadan yangi avlodlar yaratadi. Bu jarayon parserning oddiy tekshiruvlaridan asta-sekin o‘tib, chuqur kodga yetadi. Magic constant, checksum yoki encryption coverage o‘sishini to‘sishi mumkin; dictionary, custom mutator yoki test builddagi maqsadli instrumentatsiya yordam beradi.

Topilgan crash minimizatsiya qilinib, xatoni saqlagan eng kichik input olinadi. Stack trace, binary build, sanitizer sozlamasi va seed birga saqlansa xato qayta tiklanadi. Bir root cause yuzlab turli crash hosil qilishi mumkin, shuning uchun deduplication stack va fault addressni tahlil qiladi.

Qo‘llanish chegaralari

File parser, serializer, image codec, compiler, protocol decoder va API parameter parser fuzzing uchun qulay. Stateful protokolda xabarlar ketma-ketligi va session holati model qilinadi. Distributed biznes jarayoni yoki access-control xatosini faqat tasodifiy bayt bilan topish qiyin; model-based va property-based tekshiruv bilan birlashtiriladi.

Fuzzer production endpointga nazoratsiz yuborilmaydi. U resursni tugatishi, ma’lumotni o‘zgartirishi yoki monitoringni to‘ldirishi mumkin. Izolyatsiyalangan muhit, sintetik data va aniq scope ishlatiladi. Topilgan input maxfiy materialni o‘z ichiga olsa, artifact accessi ham cheklanadi.

Uzluksiz fuzzing

Qisqa CI job yangi regressiyani tez tekshiradi, uzoq ishlovchi workerlar esa corpusni soatlar yoki kunlar davomida rivojlantiradi. Har build uchun crashlar source revision, compiler flag va sanitizer versiyasi bilan bog‘lanadi. Tuzatilgan input regression testga aylantiriladi; aks holda o‘sha nuqson keyin qaytishi mumkin. Coverage foizini maqsad sifatida yolg‘iz ishlatish yetarli emas, chunki bir block bajarilishi barcha qiymat va state kombinatsiyasi tekshirilganini bildirmaydi.

Fuzzerning o‘zi ham reproducible bo‘lishi uchun random seed va konfiguratsiyani saqlaydi. Nondeterministic thread race bir xil inputda har doim crash bermasligi mumkin; takroriy ishga tushirish va ThreadSanitizer kabi vosita sababni ajratishga yordam beradi.

Bog‘liq tushunchalar

Coverage-guided fuzzing, Corpus, Mutation testing, Property-based testing, AddressSanitizer, Test harness, Crash minimization