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:
- 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).
- 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
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 damalloc'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).