Skip to content

tty_struct spray

/dev/ptmx'i defalarca açarak kmalloc-1024struct tty_struct nesneleriyle doldur ve free edilmiş bir 1024-cache slot'unu reclaim et — 0x5401 magic'i ve ops pointer'ı onu bir leak ve corruption hedefi yapan güvenilir bir spray primitive'i.

Mechanism

Note

/dev/ptmx açmak ptmx_open()tty_alloc_file() + tty_init_dev()'i tetikler ve kmalloc-1024 slab'ine bir struct tty_struct (~0x2B8 byte) allocate eder (eşlik eden tty_file_private, 0x20 byte, kmalloc-32'ye düşer). /dev/ptmx'i tekrar tekrar açmak kmalloc-1024tty_struct nesneleriyle doldurur ve o boyuttaki free edilmiş slab'leri reclaim eder. İlk alan int magic = TTY_MAGIC (0x5401)'dir; reclaim/leak'i doğrulayan deterministik bir işarettir ve +0x18'deki ops pointer'ı güvenilir bir kernel-base leak kaynağıdır (ptm_unix98_ops gibi bilinen bir sembole işaret eder).

Walkthrough

int ptmx_fd[N];
for (int i = 0; i < N; i++)
    ptmx_fd[i] = open("/dev/ptmx", O_RDWR | O_NOCTTY);  /* sprays tty_struct into kmalloc-1024 */
  1. Free edilmiş bir 1024-cache nesnesini reclaim etmek için: victim'i free et, sonra free edilen slot'u bir tty_struct ile yeniden allocate etmek için /dev/ptmx'i aç.
  2. Leak: nesneyi oku ve magic == 0x5401 ile doğrula; bitişikteki ops pointer'ı kernel base'ini leak'ler.
  3. Spray'lenen nesne ardından ops-overwrite RIP-control tekniğinin (ayrı tutulan) substrate'i olur — herhangi bir corruption magic == 0x5401'i korumalıdır, aksi halde tty_paranoia_check() tty_ioctl()'i ops'a ulaşmadan -EINVAL döndürür.

Warning

tty_struct, kmalloc-1024'ü pek çok başka nesneyle paylaşır, dolayısıyla en çok victim allocation o boyut sınıfında olduğunda (ya da o sınıfa cross-cache edilebildiğinde) işe yarar.

Mitigation

  • CONFIG_SLAB_FREELIST_RANDOM ve freelist hardening reclaim determinizmini azaltır.
  • Dedicated/ayrılmış cache'ler ve CFI (downstream'deki ops call-through'a karşı) takip eden exploitation'ı köreltir.

References