tty_struct ops overwrite RIP control¶
Bir UAF ya da overflow
kmalloc-1024'teki birtty_struct'ın üzerine saldırgan verisini yerleştirdikten sonra, onunopspointer'ını sahte birtty_operationstablosuna overwrite et; ardından birioctl()bunun üzerinden dispatch eder vetty_struct'ı argüman olarak vererek RIP kontrolü sağlar.
Mechanism¶
Note
Bir UAF ya da slab overflow saldırganın kmalloc-1024'teki bir struct tty_struct'ın
üzerine yazmasına izin verdiğinde (ya da kmalloc-cg-1k'ya düşen bir cross-cache
varyantında), +0x18'deki ops pointer'ını kendi kontrol ettiği sahte bir
tty_operations tablosuna işaret edecek şekilde overwrite eder (heap'e spray'lenmiş, adresi
leak'lenen bir heap pointer'ından türetilmiş). Userspace ptmx fd üzerinde ioctl()
çağırdığında, tty_ioctl() tty'yi file_tty(file) ile alır ve
if (tty->ops->ioctl) retval = tty->ops->ioctl(tty, cmd, arg);'ı çalıştırır — sahte tablonun
üzerinden dispatch ederek RIP kontrolü verir. magic 0x5401 +0x00'da korunmalıdır, çünkü
tty_paranoia_check() dispatch'ten önce çalışır; bozuk bir magic -EINVAL döner ve hijack hiç
tetiklenmez. Üçüncü ioctl argümanı saldırgan kontrolündedir ve tty (dolayısıyla rdi)
tty_struct'a işaret eder.
Walkthrough¶
- Bir
tty_struct'ı reclaim et / corrupt et (same-cache,kmalloc-1024'e/dev/ptmxspray ile; ya dakmalloc-cg-1k'ya cross-cache ile),magic == 0x5401'i koruyarak. ops'u sahte birtty_operationstablosuna işaret ettir.ioctlslot'u tablonun12*8(+0x60) offset'indedir.ioctl(ptmx_fd, cmd, arg)ile tetikle. Bir stack-pivot gadget'ı heap'te yerleşik bir ROP zincirine zincirlenir; PAWNYABLE walkthrough'undan bir örnek:
rsp'i ROP zincirine pivot eder (gadget'tan sonra rbp tekrar tty_struct'a işaret eder).
Warning
Sahte tablodaki teardown handler'ları (close, shutdown, cleanup) ya bir ret gadget'ına
ya da geçerli bir adrese işaret etmelidir; aksi halde fd kapatıldığında kernel panic olur —
exploit'ler bu slot'ları bir ret gadget'ı ile doldururken yalnızca hedeflenen slot pivot'a
işaret eder.
Detection¶
0x5401 magic bütünlüğü ve tty nesnelerinde beklenmedik .rodata-dışı ops pointer'ları
savunma sinyalleridir; CFI altındaki bir control-flow ihlali loglanır.
Mitigation¶
- kCFI/CFI sahte-vtable dispatch'ini bozar (call-target imza uyuşmazlığı).
- Function tablolarını
.rodata'ya taşımak, FG-KASLR, randomize/karantinaya alınmış slab freelist'leri ve hassas nesneleri dedicated cache'lere ayırmak güvenilirliği azaltır.