Allocation primitive shaping¶
Kontrollü allocation ve free'leri (size, count, order, timing) tetikleyerek heap'i takip eden bir corruption için deterministik biçimde diz.
Mechanism¶
Note
Genel amaçlı heap allocator'lar deterministiktir: aynı malloc/free
dizisi verildiğinde chunk'lar tahmin edilebilir konumlara düşer ve yeni
free'lenmiş chunk'lar tanımlı bir sırada (bin'ler/free-list'ler) geri
dönüştürülür. "Allocation primitive shaping", o diziyi sürmenin attacker
kabiliyetidir — chunk size'ını, count'unu, order'ını ve timing'ini
seçerek — böylece heap, bir bug'ın exploitable olduğu bir layout'a ulaşır.
İstismar edilen invariant determinizmdir: aynı operasyon dizisi aynı yerleşimi ürettiği için attacker hole'lar açıp bunları doldurarak bir victim object'in nereye düşeceğini kontrol edebilir. Bir memory bug'ını probabilistik olmaktan güvenilir olmaya yükselten budur ve heap grooming / feng shui'in temelidir. Bu, sadece içeriği geniş çapta depolayan ama kesin layout'u kontrol etmeyen heap spraying'den ayrıdır.
Walkthrough¶
Kontrollü bir alloc/free primitive'i kullanan kanonik bir grooming dizisi:
A = alloc(0x80); B = alloc(0x80); C = alloc(0x80); D = alloc(0x80) # contiguous
free(D); free(B) # deterministic holes in the 0x80 free-list; B freed last
victim = alloc(0x80) # LIFO -> allocator reuses B's slot -> victim adjacent to A,C
tcache/fastbin destekli bir allocator'da free'lenmiş chunk'lar bir LIFO list
oluşturur; bu yüzden bir sonraki aynı boyutlu malloc en son free'lenmiş slot'u
döndürür — bu da victim'i tam istediğin yere yerleştirmene izin verir:
void *a = malloc(0x50);
void *b = malloc(0x50);
free(b); // b -> tcache[0x50] head
void *v = malloc(0x50); // v == b : v now sits where b was, next to a
Beklenen davranış: v free'lenmiş hole'u güvenilir biçimde işgal eder; onu
ya kontrollü chunk'lara komşu konumlandırır (bir overflow için hazırlık) ya da
hâlâ referans verilen bir pointer ile çakıştırır (UAF /
overlapping chunks için hazırlık). Asıl corruption
primitive'i o zaman şansa değil deterministik biçimde tetiklenir.
Detection¶
- Hardened allocator'lar determinizmi kırmak için free-list sırasını randomize eder (Safe-Linking, freelist shuffling).
- Allocator instrumentation / guard page'leri (Electric Fence, GWP-ASan) komşuluk tabanlı grooming'i probabilistik olarak tespit edilebilir kılar.
Mitigation¶
- Randomize edilmiş allocation sırası ve per-slab guard page'leri güvenilirliği düşürür.
- Shaping'in kendisi bir bug değil — bir building block'tur; fix, onun hazırladığı corruption'ı hedef alır.