tty_struct spray¶
/dev/ptmx'i defalarca açarakkmalloc-1024'üstruct tty_structnesneleriyle doldur ve free edilmiş bir 1024-cache slot'unu reclaim et —0x5401magic'i veopspointer'ı 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-1024'ü tty_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 */
- Free edilmiş bir 1024-cache nesnesini reclaim etmek için: victim'i free et, sonra free edilen
slot'u bir
tty_structile yeniden allocate etmek için/dev/ptmx'i aç. - Leak: nesneyi oku ve
magic == 0x5401ile doğrula; bitişiktekiopspointer'ı kernel base'ini leak'ler. - Spray'lenen nesne ardından
ops-overwrite RIP-control tekniğinin (ayrı tutulan) substrate'i olur — herhangi bir corruptionmagic == 0x5401'i korumalıdır, aksi haldetty_paranoia_check()tty_ioctl()'iops'a ulaşmadan-EINVALdö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_RANDOMve freelist hardening reclaim determinizmini azaltır.- Dedicated/ayrılmış cache'ler ve CFI (downstream'deki
opscall-through'a karşı) takip eden exploitation'ı köreltir.