Skip to content

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.

References