Skip to content

tty_struct ops overwrite RIP control

Bir UAF ya da overflow kmalloc-1024'teki bir tty_struct'ın üzerine saldırgan verisini yerleştirdikten sonra, onun ops pointer'ını sahte bir tty_operations tablosuna overwrite et; ardından bir ioctl() bunun üzerinden dispatch eder ve tty_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

  1. Bir tty_struct'ı reclaim et / corrupt et (same-cache, kmalloc-1024'e /dev/ptmx spray ile; ya da kmalloc-cg-1k'ya cross-cache ile), magic == 0x5401'i koruyarak.
  2. ops'u sahte bir tty_operations tablosuna işaret ettir. ioctl slot'u tablonun 12*8 (+0x60) offset'indedir.
  3. ioctl(ptmx_fd, cmd, arg) ile tetikle. Bir stack-pivot gadget'ı heap'te yerleşik bir ROP zincirine zincirlenir; PAWNYABLE walkthrough'undan bir örnek:
push rdx ; xor eax, 0x415b004f ; pop rsp ; pop rbp ; ret   ; offset 0x14fbea (build-specific)

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.

References