Skip to content

House of Cat

_IO_wfile_jumps üzerinden _IO_wfile_seekoff'a ulaşan modern-glibc FSOP'u; pointer guard'ı yenmeden arbitrary bir call verir.

Mechanism

House of Cat, _IO_wfile_jumps wide-IO vtable'ı üzerinden _IO_wfile_seekoff'a ulaşan modern-glibc FSOP tekniğidir (House of Apple 2 / House of Emma'nın bir torunu). house-of-emma'nın aksine, TLS-tabanlı pointer-guard'dan (PTR_DEMANGLE) kaçınır çünkü _IO_wfile_seekoff_IO_switch_to_wget_mode yolu, attacker-controlled _wide_data üzerinde _IO_WOVERFLOW'dan geçer.

Note

__malloc_hook/__free_hook'un gittiği modern (glibc 2.35+ dönemi) dünyayı hedefler. House of Apple gibi, (bir offset'te) meşru bir _IO_wfile_jumps pointer'ı kullanarak main-vtable range check'inden sağ çıkar ve validate edilmeyen wide vtable'ı suistimal eder.

Walkthrough

FSOP chain'ini exit'te tetikle: exit()__run_exit_handlers_IO_cleanup_IO_flush_all_lockp_IO_wfile_seekoff_IO_switch_to_wget_mode_IO_WOVERFLOW.

FILE'ın vtable'ını _IO_wfile_jumps + 0x10'a ayarla ki dispatch _IO_wfile_seekoff'a insin, sonra wide-IO field'larını kontrol et ki son indirect call kontrollü bir argümanla seçilen bir function'a çözülsün. Bir writeup, etkin gadget'ı şöyle verir:

rax1 = [rdi + 0xa0]      ; fp->_wide_data
rdx  = [rax1 + 0x20]     ; controlled arg / RDX
rax2 = [rax1 + 0xe0]     ; _wide_data->_wide_vtable
call [rax2 + 0x18]       ; _wide_vtable function pointer

Bu, kontrollü bir argümanla arbitrary bir function call verir; (seccomp/ORW için) setcontext-tarzı SROP'u ya da doğrudan system'i çağırmak için kullanılır.

Warning

FILE-layout offset'leri (0xa0'daki _wide_data, +0x10'daki vtable vb.) belirli bir glibc build'inden alınmıştır; tam target libc'ye karşı doğrula.

Mitigation

Tam olarak Emma-tarzı _IO_cookie yolları pointer mangling ile bloklandığında seçilir. _wide_data->_wide_vtable'ı validate eden hardening ya da IO dispatch üzerindeki CFI onu kırar. Detection: vtable'ı _IO_wfile_jumps'ın ortasına işaret eden (örn. +0x10) ve libc dışında bir _wide_data'ya sahip bir FILE.

References