
Exploit locale di root per Linux per CVE-2014-0038
La syscall recvmmsg X86_X32 non sanifica correttamente il puntatore timeout passato dallo spazio utente.
Passare un puntatore a un indirizzo del kernel come timeout per recvmmsg, se il byte originale a quell'indirizzo è noto, può essere sovrascritto con dati noti. Se il byte meno significativo è 0xff, attendere 255 secondi lo trasformerà in 0x00.
Il primo long all'indirizzo passato (tv_sec) deve essere positivo e il secondo long (tv_nsec) deve essere minore di 1000000000.
Puntare al puntatore a funzione release della struttura ptmx_fops situata nella memoria del kernel non inizializzata (e quindi scrivibile). Azzerare i tre byte più significativi e trasformarlo così in un puntatore a un indirizzo mappabile nello spazio utente. Il puntatore release viene usato perché è seguito da 16 byte 0x00 (quindi tv_nsec è valido). Aprire /dev/ptmx, chiuderlo e godersela.
Non molto elegante, ma dovrebbe essere abbastanza affidabile se i simboli possono essere risolti.
Testato su Ubuntu 13.10
Vedi anche http://blog.includesecurity.com/2014/03/exploit-CVE-2014-0038-x32-recvmmsg-kernel-vulnerablity.html
Recuperare gli indirizzi da /proc/kallsyms ed eseguire l'exploit:
./build.sh && ./timeoutpwn
Se si desidera compilare il binario per un server remoto, provare quanto segue:
ssh user@host 'cat /proc/kallsyms' > syms.txt
CFLAGS=-static ./build.sh syms.txt
scp timeoutpwn user@host:
...
Se ptmx_fops non viene trovato in kallsyms, provare a estrarlo dalla vmlinux
fornita con il pacchetto headers (linux-headers su Arch Linux):
nm /lib/modules/$(uname -r)/build/vmlinux > syms.txt