House of Corrosion¶
global_max_fastüzerinde bir unsorted-bin attack ile leak'siz bir write-after-free'den shell'e; fastbin free'lerini kontrollü write'lara çevirir.
Mechanism¶
House of Corrosion, bir PIE target'ında hiçbir adresi leak'lemeden bir write-after-free'yi
shell execution'a çevirir. Bir unsorted-bin attack'ı global_max_fast'a yöneltir:
freed bir unsorted chunk'ın bk'sini ezerek writeback'in unsorted-bin adresini
global_max_fast'a saklamasını sağlar. global_max_fast devasa olunca, large chunk'lar artık
free sırasında fastbin insertion'a uygun hâle gelir ve fastbin free/alloc'u libc
data bölgesine kontrollü write'lara çevirir.
Note
glibc ~2.23–2.27'yi (Ubuntu 18.04'ün 2.27'si) hedefler, 2.29'a uyarlayan bir ek ile.
Bu write'lar stderr _IO_FILE'ını bozarak _IO_str_overflow'u bir
one-gadget'a sürer — o dönem için "House of Orange'ın güncellenmiş hâli".
Walkthrough¶
global_max_fastüzerinde unsorted-bin attack: bir victim unsorted chunk'ınbk'sinin en düşük anlamlı iki byte'ınıglobal_max_fast'a yakın işaret edecek şekilde ez — bu ~4 bit ASLR entropy'sinin (≈16'da 1) tahminini gerektirir. Sonraki allocation'dan sonraglobal_max_fastdevasa bir değer tutar.- Primitive olarak fastbin write'ları:
global_max_fastbüyütülmüşken, controlled-size chunk'ları free etmek onları boyuta göre index'lenmiş fastbin'lere ekler, dolayısıyla bir free libc'ye seçilen bir offset'te bir değer yazar. README, belirli birdeltaoffset'ini hedeflemek içinchunk size = (delta * 2) + 0x20tanımlar. stderr'ı boz ve ateşle:stderr'ın_flags,_IO_write_ptr,_IO_buf_base,_IO_buf_endve vtable'ını öyle ayarla ki stderr stream aktivitesini tetiklemek_IO_str_overflow()'a ulaşsın ve bir shell için bir one-gadget'a insin.
Warning
Offset'ler ve chunk size formülü belirli libc'ye bağlıdır; ~4-bit'lik tahmin,
exploit'in olasılıksal olduğu anlamına gelir.
Mitigation¶
2.23 ile 2.27 arasında getirilen mitigation'lar etrafında tasarlanmıştır. glibc daha sonra
unsorted bin'i hardened etti (bck->fd == victim check'i) ve 2.29 integrity check'leri artı bazı
exploit edilebilir function pointer'ların kaldırılmasını ekledi, ekstra bypass'lar gerektirerek. Detection: global_max_fast
inandırıcı olmayacak kadar büyük bir değer tutuyor ya da fastbin'ler oversized chunk'lar içeriyor.