Skip to content

tty_operations hijack

/dev/ptmx'ten elde edilen bir struct tty_struct içindeki const struct tty_operations *ops pointer'ını leak'le (ya da overwrite et): okumak ptm_unix98_ops'u açığa çıkarır ve KASLR'ı bozar; yeniden yönlendirmek ise bir function-table dispatch'ini saptırır.

Mechanism

Note

/dev/ptmx açıldığında ptmx_open() çağrılır; bu da tty_alloc_file()'i (bir tty_file_private, kmalloc-32'de) ve tty_init_dev()'i (yaklaşık 0x2B8 byte'lık bir struct tty_struct, kmalloc-1024'te) çağırır. İlk 4 byte magic = TTY_MAGIC (0x5401)'dir; bu sayede saldırgan leak'lenen/reclaim edilen bir tty'yi ilk dword'ü kontrol ederek kesin olarak tanıyabilir. +0x18 offset'inde ops (const struct tty_operations *) bulunur ve ptm_unix98_ops'a (ptmx'ten master taraf) ya da pty_unix98_ops'a işaret eder. Bu hedef kernel base'ine göre sabit bir offset'te durduğundan, ops'u leak'leyip bilinen offset'i çıkarmak KASLR base'ini verir. tty_operations tablosu device aksiyonlarından oluşan bir vtable'dır (open, close, ioctl, write, …), dolayısıyla herhangi bir entry de bir .text adresini leak'ler. tty_ioctl() önce tty_paranoia_check()'i çalıştırır; bu da magic'i doğrular ve yanlışsa -EINVAL döner — yani magic herhangi bir corruption boyunca korunmalıdır.

Walkthrough

Doğrulanmış tty_struct layout'u:

  • +0x00 magic (4 byte) = 0x5401; +0x04 kref
  • +0x08 dev (struct device *)
  • +0x10 driver (struct tty_driver *, geçerli bir adres olmalı)
  • +0x18 ops (struct tty_operations *) — leak/overwrite hedefi
  • +0x20 index
/* validate a reclaimed/leaked object and recover the kernel base */
if (*(int32_t *)magic_buf != 0x5401)
    return false;                  /* not a tty_struct */
unsigned long ops = leaked_ops;    /* read from offset +0x18 */
unsigned long kbase = ops - 0xc39b40;   /* offset is build-specific */

Leak'lenen ops değerinin adresi (alignment nedeniyle low bit'leri tipik olarak 0'dır) ya ptm_unix98_ops'a ya da pty_unix98_ops'a denk gelir; hangisiyse onun bilinen compile-time offset'ini çıkarmak randomize base'i verir.

Warning

tty_operations tablosunun kendisi read-only bellekte yaşar (const / .rodata), dolayısıyla tablo yazılamaz; leak okunabilir pointer'ı suistimal eder. Control-flow suistimali ise bunun yerine ops'u saldırgan kontrolündeki belleğe yeniden yönlendirir (bkz. tty-struct-ops-overwrite-rip-control).

Detection

Deterministik 0x5401 magic, slab corruption'ı ya da kmalloc-1024'ün UAF ile yeniden kullanımını izleyen savunmacılar için güçlü bir heap-integrity oracle'ıdır.

Mitigation

  • CFI (CONFIG_CFI_CLANG / kCFI) indirect-call hedef tipini doğrular ve sahte-ops dispatch'ini engeller.
  • CONFIG_SLAB_FREELIST_RANDOM, dedicated-cache ayrımı ve FG-KASLR, tty cache'ine karşı leak-and-reclaim'in güvenilirliğini azaltır.

References