Skip to content

Controlled-size allocation

Bir chunk'ı belirli bir bin / slab cache'e yönlendirmek için allocation size'ını seçmek.

Mechanism

ptmalloc/glibc'de malloc'tan istenen size, bir chunk free edildiğinde düşeceği free-list'i deterministik biçimde seçer: küçük istekler per-thread tcache ve fastbin'lere, daha büyük olanlar smallbin'lere, unsorted bin'e ya da largebin'lere gider; her bin sabit bir size class'ı kapsar. Size argümanını kontrol eden bir attacker, belirli bir bin'i doldurmak ya da boşaltmak için seçtiği bir size'daki chunk'ları kasıtlı olarak allocate ve free edebilir; böylece bir victim object attacker-controlled data'ya komşu düşer.

Note

Kernel analoğu birebir aynıdır: bir allocation size'ı seçmek object'i belirli bir kmalloc-N slab cache'ine yönlendirir; böylece bir UAF/overflow object'i kullanışlı bir target ile overlap edecek hale getirilebilir. Bu, heap-grooming-feng-shui'in altındaki atomik building block'tur.

Walkthrough

x86-64'te fastbin aralığı kabaca <= 0x80 byte'lık user data'dır; tcache her size class için 7 entry tutar. Free'lenmiş bir chunk'ı tcache'i geçirip fastbin'e zorlamak için önce o size class'ı için tcache'i doyurursun, sonra free yaparsın:

// saturate tcache (7 entries) for size-class 0x40
void *t[7];
for (int i = 0; i < 7; i++) t[i] = malloc(0x38);
for (int i = 0; i < 7; i++) free(t[i]);   // tcache[idx] now full

void *v = malloc(0x38);                   // malloc(0x38) -> 0x40 chunk (size-class rounding)
free(v);                                  // tcache full -> falls into fastbin

0x38 user byte (chunk size 0x40) seçmek kasıtlı bir tercihtir: fastbin aralığına düşer. Bunun yerine 0x418 istemek chunk'ı unsorted bin'e / bir largebin'e yönlendirirdi. Aynı kaldıraç house-of-spirit'in de temelindedir; orada fake chunk'ın size field'ı tam olarak 0x40'a ayarlanır ki free() onu bir fastbin'e dosyalasın.

pwndbg'de bin yerleşimini doğrulamak
pwndbg> bins
tcachebins
0x40 [  7]: 0x...  (full)
fastbins
0x40: 0x5555...010  <- our chunk fell through here

Mitigation

Kendi başına bir bug sınıfı değil — bir primitive'dir. Onu bozan hardening: randomize edilmiş tcache/fastbin layout'u, slab randomization (kernel'de CONFIG_SLAB_FREELIST_RANDOM) ve size-class isolation güvenilirliği azaltır ama kaldıracı ortadan kaldırmaz.

References