tty_operations hijack¶
/dev/ptmx'ten elde edilen birstruct tty_structiçindekiconst struct tty_operations *opspointer'ını leak'le (ya da overwrite et): okumakptm_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:
+0x00magic(4 byte) =0x5401;+0x04kref+0x08dev(struct device *)+0x10driver(struct tty_driver *, geçerli bir adres olmalı)+0x18ops(struct tty_operations *) — leak/overwrite hedefi+0x20index
/* 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-opsdispatch'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.