Skip to content

Pseudomonarchia jemallocum

argp & huku tarafından Phrack 68:10 — jemalloc içselleri ve onun run/chunk/region metadata'sının nasıl bozulduğuna dair temel çalışma; çünkü jemalloc'ta suistimal edilecek klasik bir unlink/frontlink yok.

Mechanism

"Pseudomonarchia jemallocum" ("jemalloc'un sahte krallığı") jemalloc'un hiyerarşisini haritalar ve onun exploitation'ının ptmalloc'tan neden farklı olduğunu gösterir. jemalloc memory'yi şöyle düzenler: lock contention'ı azaltmak için per-thread arena'lar (arena_t), bunlar chunk'ları (arena_chunk_t, large aligned bölgeler) tutar, chunk'lar bin'ler (arena_bin_t) tarafından düzenlenen eşit-boyutlu region'ların run'larına (arena_run_t) bölünür ve thread-local tcache/magazine'ler (tcache_t/mag_t) free region'ları cache'ler.

Note

jemalloc allocation metadata'sını kasıtlı olarak band dışı tutar ve hiçbir inline boundary tag, "unlinking" ya da "frontlinking" kullanmaz — dolayısıyla ptmalloc-tarzı unlink write primitive'i mevcut değildir. Sınır bunun yerine paper'ın formalize ettiği iki rota üzerinden düşer: (1) adjacent-region corruption — aynı-boyutlu region'lar aralarında inline metadata olmadan bitişik oturur, böylece bir overflow doğrudan bir victim nesnesinin (örn. bir C++ vptr) içine yürür; ve (2) metadata corruption — bir run header'ının regs_minelm / region bitmap'ini üzerine yazmak malloc'u zaten canlı bir region'ı geri vermeye zorlar, ya da arena-chunk header'ları boyunca overflow etmek. Exploitation hedefi, doğrudan bir arbitrary write elde etmek değil, malloc'u zaten initialize edilmiş bir region döndürmeye zorlamaktır.

Walkthrough

Makaleden üst düzey yaklaşım:

  1. Seçilmiş bir size class'ının öngörülebilir run'larını düzenlemek için Heap Feng Shui uygula; allocation sırasını stratejik free'lerle kontrol et (heap-grooming-feng-shui.md).
  2. Bir overflow kullanarak ya komşu aynı-boyutlu bir region'ı ya da bir run header'ının region-allocation bitmap'ini boz:

// conceptual: clobber the run-header bookkeeping so the next malloc
// reissues a region that is still in use elsewhere
run_header->regs_minelm / bitmap  <-  attacker value
3. Artık canlı bir nesneyi aliasing yapan bir allocation'ı tetikle; hassas field'ları (vtable'lar, uzunluklar, pointer'lar) okumak ya da yeniden yazmak için kontrollü bir overlap verir.

Neden unlink yok

Paper, jemalloc'un "'unlinking' ya da 'frontlinking' gibi kavramları implemente etmediğini" vurgular, dolayısıyla teknikler bir linked-list write'ı kandırmak yerine initialize edilmiş memory'nin yeniden verilmesini zorlamaya pivot eder — sonraki jemalloc çalışmalarının üzerine inşa ettiği bir tema.

Warning

Offset'ler/field layout'ları jemalloc-sürümüne ve build'e özgüdür (standalone, FreeBSD, Firefox, Android varyantları farklılaşır); 2012 paper'ı modeli belgeler, taşınabilir bir offset tablosunu değil. Bkz. jemalloc-exploitation.md ve sonraki vaka çalışması a-tale-of-two-jemallocs-exploiting-vlc.md.

Detection

  • arena_run_* / arena_bin_* path'leri içindeki crash'ler, ya da malloc'un hâlâ referans verilen bir nesneyi aliasing yapan bir pointer döndürmesi (double-issued region).
  • Tekniği besleyen adjacent-region overflow'unu ortaya çıkaran ASan/heap fuzzing.
  • jemalloc debug build'leri (--enable-debug, redzone'lar/junk-fill) bozulmuş run'ları işaretler.

Mitigation

  • Hardening'li (junk filling, redzone'lar, pointer/size sanity) güncel bir jemalloc kullan ve mevcut olduğunda size-class metadata integrity check'lerini etkin tut.
  • Güvenlik-hassas kodu test sırasında ASan ile build et; kök overflow/UAF'ı düzelt.
  • Attacker-etkili buffer'ları aynı size class'ında hassas nesnelerle bir arada konumlandırmaktan kaçın (allocator isolation / partitioning).

References