Skip to content

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:

  1. Groom yap ki magazine rack / magazine (ya da bir tcache bin'inin pointer stack'i) overflow edebileceğin bir region'a komşu allocate edilsin ya da bir UAF üzerinden erişilebilir olsun.
  2. 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.
  3. 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.
  4. 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.

References