jemalloc Thread cache (magazine) corruption¶
Per-thread cache'lenmiş bir free-region pointer'ını corrupt et ki sonraki same-size
malloc()attacker-chosen bir adres döndürsün.
Mechanism¶
Kırılan invariant
Arena-lock contention'ından kaçınmak için jemalloc, yakın zamanda free edilmiş region'ların
size class'a göre gruplanmış bir per-thread cache'ini tutar. Klasik magazine
varyantında per-thread yapı, per-bin magazine'lerden (mag_t) oluşan bir magazine rack'tir
(mag_rack_t); bir magazine esasen free region'lara pointer'lardan oluşan bir array
(rounds[]) artı bir count'tur. Modern jemalloc'ta karşılığı per-bin pointer stack'leri
olan tcache_t'dir. Cache, allocator'ın fast path'te yeniden doğrulamadan döndürdüğü
raw pointer'ların bir LIFO'sudur — ve (public write-up'lara göre) bu metadata da sıradan
malloc() ile allocate edilir, dolayısıyla normal region'lar arasında yaşar ve aynı
overflow/UAF primitive'leriyle erişilebilir.
Cache'lenmiş bir pointer'ı (ya da rounds[] array'ini / count'unu) corrupt et, o thread'deki
sonraki same-size malloc() attacker-chosen bir adres döndürür — bir
arbitrary-allocation ("malloc-anywhere") primitive'i.
Walkthrough¶
Üst düzey, Phrack #68'den (Firefox'un jemalloc'u magazine kullanmadığı için en derin public ele alış burasıdır) ve Project Zero MMS write-up'ından:
- Groom yap ki magazine rack / magazine (ya da bir
tcachebin'inin pointer stack'i) overflow edebileceğin bir region'a komşu allocate edilsin ya da bir UAF üzerinden erişilebilir olsun. - Cache'lenmiş bir free-region pointer'ını bir target'ın adresiyle overwrite et — örn. bir function pointer, vtable pointer ya da saved size'ın bulunduğu yer.
- O thread'de eşleşen size class'ın bir allocation'ını tetikle; fast path poison'lanmış pointer'ı pop'lar ve attacker-controlled memory döndürür.
- Program sonra o "taze" allocation üzerinden caller-controlled data yazar; bu da cache corruption'ı seçilen adreste kontrollü bir write'a çevirir.
Determinism neden yardımcı olur
Project Zero MMS write-up'ı aynı size'ın malloc → free → malloc'unun aynı adresi
döndürdüğünü belirtir — cache-state saldırılarını ve UAF reclamation'ını pratikte
güvenilir kılan tam olarak budur.
Detection¶
- Pop'ta cache'lenmiş pointer'ları doğrula: alignment, adresin doğru size class/arena'nın bir region'ı içinde durduğu ve managed bir chunk içine düştüğü.
- tcache/magazine yapılarını canary/red-zone'la; cache'lenmiş region'ları junk-fill et ki hijack edilmiş bir pointer'ın içeriği yanlış görünsün.
- Returned-pointer locality'sinde anomaly detection — bilinen chunk'ların dışında bir adres döndüren bir tcache güçlü bir corruption sinyalidir.
Mitigation¶
- Cache'lenmiş free pointer'ların pointer obfuscation / safe-linking tarzı XOR-masking'i, böylece kullanılabilir bir pointer forge etmek de bir per-thread/per-run secret gerektirir.
- Cache control yapılarını attacker-reachable data'dan uzakta, guarded ya da randomize edilmiş konumlarda sakla; metadata'yı user region'lardan ayır.
- Hardened build'lerde her fast-path pointer'ını bounds- ve ownership-validate et; magazine count'larını cap/poison et ki corrupt edilmiş bir count out-of-range read'leri süremesin.