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
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.