Skip to content

global_max_fast overwrite

ptmalloc'un global_max_fast threshold'unu devasa bir değerle overwrite et ki büyük free()'ler out-of-bounds index'lenen fastbin insert'lerine dönüşsün ve neredeyse arbitrary bir pointer write üretsin.

Mechanism

Note

global_max_fast, free edilen bir chunk'ın bir fastbin'e konup konmayacağına karar veren size threshold'udur. free() chunksize(p) <= global_max_fast'i kontrol eder ve öyleyse fastbin_index(size) ile bir bin slot'u hesaplayıp chunk'ı bağlar. Security boundary, bu index'in yalnızca küçük fastbin array'inin içine düşmesinin beklenmesidir. global_max_fast'i çok büyük bir değerle overwrite etmek (genellikle içine bir main_arena adresi yazan bir unsorted-bin attack ile), büyük free'lerin fastbin insert'i olarak nitelenmesini sağlar. fastbin_index(size) doğrudan (artık devasa olan) size'dan, üst sınır yeniden kontrolü olmadan türetildiğinden, hesaplanan slot gerçek fastbin array'inin çok ötesine düşer — böylece free(), free edilen chunk'ın adresini fastbin base'ine göreli, saldırganın seçtiği bir quadword'e yazar (House of Corrosion'un ilk primitive'i).

Walkthrough

Kavramsal tarif (House of Corrosion'dan):

  1. Bir unsorted-bin (veya eşdeğeri) write elde et; bir victim chunk'ın bk'sini kısmen overwrite et ki unlinking &global_max_fast'e bir main_arena pointer'ı yazsın (aradaki boşluğu kapatmak için genellikle birkaç ASLR bit'lik tahmin gerekir).
  2. global_max_fast artık devasa olduğundan, fastbin_index'e verildiğinde istenen array-dışı offset'e map'lenen bir size'a sahip bir chunk seç.
  3. O chunk'ı free() et → adresi hedef quadword'e yazılır.
  4. Arbitrary bir hedefin yakınına (örneğin sonradan dereference edilen libc data'sına) sahte bir fastbin pointer'ı yerleştirmek için seçilen size'larla tekrarla.
target_offset ≈ fastbin_index(forged_size)   /* deliberately out of the fastbin array */
free(chunk_of_forged_size)  →  *target = &chunk

Warning

Kesin fastbin_index macro'su ve array layout'u glibc malloc/malloc.c'de yaşar ve sürümler arasında kayar; offset'leri hedef libc başına doğrula.

Detection

  • global_max_fast'in meşru küçük default'unda (DEFAULT_MXFAST) kaldığını assert et; herhangi bir büyük değer anormaldir.
  • fastbin_index(size)'i gerçek array uzunluğuna karşı bounds-check eden instrumented/debug malloc.
  • &global_max_fast'i gösteren unsorted-bin bk partial overwrite'ları.

Mitigation

  • Modern glibc free() size sanity check'leri ve tcache/fastbin integrity hardening'i.
  • ASLR partial-pointer tahmininin maliyetini yükseltir.
  • Bounded bin index'leri ve fastbin fd'sinin pointer mangling'i olan hardened allocator'lar.

References