Bosh sahifa Wiki Buffer overflow

Buffer overflow

Buffer overflow — dastur ajratilgan buffer chegarasidan tashqariga ko‘proq ma’lumot yozganda yuz beradigan memory safety xatosidir. Ortiqcha yozuv qo‘shni obyekt, allocator metadata, function pointer yoki return addressni buzishi mumkin. Natija crash, noto‘g‘ri hisob, ma’lumot sizishi yoki hujumchi boshqaradigan kod bajarilishi bo‘lishi ehtimol.

Stack va heap overflow

Stack buffer overflow lokal massiv chegarasidan chiqib, ayni stack framedagi control data’ga yetishi mumkin. Heap overflow dinamik blokdan keyingi obyekt yoki allocator metadata’ni buzadi. Global va static bufferlar ham overflow qilishi mumkin. Joylashuv ekspluatatsiya usuliga ta’sir qiladi, lekin barcha holatda ildiz sabab noto‘g‘ri boundsdir.

Off-by-one xato faqat bitta bayt ortiq yozadi, ammo string terminatori, size field yoki pointer pastki baytini buzishi mumkin. Integer overflow count * element_sizeni kichik allocationga aylantirib, keyingi copy katta yozishiga sabab bo‘ladi. Avval arifmetika overflowi tekshiriladi, keyin allocation qilinadi.

Xavfli amallar

Uzunliksiz string copy, format funksiyasi va foydalanuvchi bergan lengthga ishonish keng sababdir. “Destination hajmi yetarli” invariant barcha encoding va terminatorni hisobga oladi. strncpy kabi nomi xavfsiz ko‘ringan API ham terminator va padding semantikasi sabab noto‘g‘ri ishlatilishi mumkin.

Parser field lengthni paketning qolgan bayti va maksimal protokol limitiga solishtiradi. Signed va unsigned conversion manfiy qiymatni juda katta songa aylantirmasligi kerak. Nested lengthlar qo‘shilganda har bosqich checked arithmeticdan foydalanadi.

Ekspluatatsiya va himoya

Hujumchi overflow orqali instruction pointer yoki function pointerga ta’sir qilishga urinadi. NX data sahifada yangi shellcode bajarishni cheklaydi, ASLR mavjud kod manzilini yashiradi, stack canary return addressdan oldingi buzilishni aniqlaydi. CFI va shadow stack control flow himoyasini oshiradi. Bu qatlamlar ma’lumot-only hujum yoki leakni to‘liq bartaraf etmaydi.

Compiler fortification ma’lum buffer hajmida xavfli copy’ni runtime tekshiradi. AddressSanitizer redzone orqali testda out-of-boundsni aniq stack trace bilan topadi. Fuzzing parserga kutilmagan uzunlik, truncation va chegaraviy input beradi. Static analysis source va destination hajmi oqimini tekshiradi.

Tuzatish

Tuzatish faqat buffer’ni kattalashtirish emas. Input uchun protokolga mos maksimal limit, destination sig‘imi va kerakli hajm o‘rtasidagi relation isbotlanadi. Memory-safe container va slice uzunlikni pointer bilan birga saqlaydi. Rust, Java yoki boshqa bounds-checkli til ko‘p xatoni bloklaydi, ammo native library va unsafe kod chegarasi qoladi.

Xato topilganda shu kodga o‘xshash barcha call site qidiriladi, regression test va fuzz corpusga input qo‘shiladi. Agar exploit ehtimoli bo‘lsa patch bilan birga service isolation, credential aylantirish va log tahlili bajariladi. Crashdan oldin hujumchi boshqa amal qilgan bo‘lishi mumkin.

O‘qish chegarasi

Buffer over-read yozish qilmasa ham ajratilgan oralig‘dan tashqaridagi ma’lumotni javobga chiqarishi mumkin. Heartbleed turidagi xatoda e’lon qilingan uzunlik haqiqiy payload bilan solishtirilmaydi. Bir xil length validation funksiyasi read va write yo‘llarida ishlatiladi. Null terminator topilmaganda string funksiyasi keyingi xotirani o‘qib ketmasligi uchun explicit length saqlanadi. Network protokolda frame avval to‘liq kelgani tekshiriladi, so‘ng fieldlar parse qilinadi; TCP bir recvda butun xabarni berishga majbur emas. Partial inputni noto‘g‘ri to‘liq deb talqin qilish overflow yoki stale buffer ma’lumotini ishlatishga olib keladi.

Bog‘liq tushunchalar

Out-of-bounds write, Stack canary, AddressSanitizer, Integer overflow, Memory safety, Fuzzing