global_max_fast overwrite¶
ptmalloc'un
global_max_fastthreshold'unu devasa bir değerle overwrite et ki büyükfree()'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):
- 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 birmain_arenapointer'ı yazsın (aradaki boşluğu kapatmak için genellikle birkaç ASLR bit'lik tahmin gerekir). global_max_fastartık devasa olduğundan,fastbin_index'e verildiğinde istenen array-dışı offset'e map'lenen birsize'a sahip bir chunk seç.- O chunk'ı
free()et → adresi hedef quadword'e yazılır. - 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-binbkpartial 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.