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.