Skip to content

Heap overflow to arbitrary read/write

Linear bir heap overflow'u, komşu bir object'in length field'ini (OOB read) ya da pointer field'ini (write-what-where) veya komşu allocator metadata'sını bozarak kontrollü bir read/write'a yükselt.

Mechanism

Note

Bir heap buffer overflow, bir allocation'ın sınırını aşıp fiziksel olarak komşu olan chunk'a yazar. Yükseltme, yan tarafta ne olduğundan gelir. Komşu bir application object'inin length/size field'ını ezmek, sınırlı bir buffer'ı bir out-of-bounds read veya write'a çevirir; komşu bir object'in pointer'ını ezmek ise o pointer üzerinden yapılan sonraki işlemleri arbitrary read/write yapar (write-what-where). Alternatif olarak allocator metadata'sını (size/prev_size, PREV_INUSE) bozmak, free/malloc'u (unlink veya freelist tarzında) kontrollü bir write'a dönüştürür. Aşılan sınır spatial memory safety'dir: contiguous bir write, seçilen bir victim'e karşı kontrollü bir primitive olur.

Walkthrough

Kavramsal reçete (public heap referanslarından):

  1. Heap'i groom et ki kontrol edilebilir bir buffer, bir victim allocation'ın hemen önünde otursun — length taşıyan bir object, pointer taşıyan bir object veya bir chunk header (heap-grooming-feng-shui.md).
  2. Overflow'u tetikle ve victim'in length'ini büyük bir değerle (ya da data pointer'ını bir target adresiyle) ez.
  3. OOB read için: şişirilmiş length'i kullanarak komşu belleği oku ve heap/libc pointer'larını leak'le (ASLR'yi yenerek).
  4. Arbitrary write için: victim'e bozulmuş pointer'ı üzerinden işlem yap ya da metadata'sı bozulmuş bir chunk'ın üzerine yeniden allocate ederek overlapping bir allocation elde et.
  5. Write'ı yüksek değerli bir target'a (GOT, function pointer, __free_hook, bir FILE vtable) yönelt ki control-flow hijack olsun.

Warning

Komşuluk garanti değildir — allocator bin davranışına ve grooming'e bağlıdır; metadata-corruption yolları version'a özgüdür.

Detection

  • AddressSanitizer / heap red-zone'lar komşu chunk'a yapılan write'ları işaretler; ASAN altında fuzz et.
  • Allocator integrity check'leri (glibc malloc "corrupted size vs. prev_size" abort'ları).
  • Guard/quarantine page'leri ve object'ler arası canary'ler.

Mitigation

  • Metadata checksum'ları, inline canary'ler, safe unlinking ve out-of-line/encrypted metadata içeren hardened allocator'lar.
  • length/pointer field'larının bounds validation'ı; memcpy/strcpy için _FORTIFY_SOURCE.
  • ASLR + non-executable heap; untrusted data'yı hassas object'lerden izole et.

References