Skip to content

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

  1. global_max_fast üzerinde unsorted-bin attack: bir victim unsorted chunk'ın bk'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 sonra global_max_fast devasa bir değer tutar.
  2. Primitive olarak fastbin write'ları: global_max_fast bü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 bir delta offset'ini hedeflemek için chunk size = (delta * 2) + 0x20 tanımlar.
  3. stderr'ı boz ve ateşle: stderr'ın _flags, _IO_write_ptr, _IO_buf_base, _IO_buf_end ve 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.

References