
Exploit local de escalada de privilegios en Linux para CVE-2014-0038
La llamada al sistema X86_X32 recvmmsg no sanitiza correctamente el puntero de tiempo de espera recibido desde el espacio de usuario.
Pasar un puntero a una dirección del kernel como tiempo de espera para recvmmsg; si se conoce el byte original en esa dirección, se puede sobrescribir con datos conocidos. Si el byte menos significativo es 0xff, esperar 255 segundos lo convertirá en 0x00.
El primer long en la dirección pasada (tv_sec) debe ser positivo y el segundo long (tv_nsec) debe ser menor que 1000000000.
Apuntar al puntero de función release de la estructura ptmx_fops ubicada en memoria del kernel no inicializada (y por tanto escribible). Poner a cero los tres bytes más significativos y así convertirlo en un puntero a una dirección mapeable en espacio de usuario. Se usa el puntero release porque va seguido de 16 bytes 0x00 (por lo que tv_nsec es válido). Abrir /dev/ptmx, cerrarlo y disfrutar.
No muy elegante pero debería ser bastante fiable si se pueden resolver los símbolos.
Probado en Ubuntu 13.10
Ver también http://blog.includesecurity.com/2014/03/exploit-CVE-2014-0038-x32-recvmmsg-kernel-vulnerablity.html
Obtener direcciones de /proc/kallsyms y ejecutar el exploit:
./build.sh && ./timeoutpwn
Si deseas compilar el binario para un servidor remoto, prueba esto:
ssh user@host 'cat /proc/kallsyms' > syms.txt
CFLAGS=-static ./build.sh syms.txt
scp timeoutpwn user@host:
...
Si ptmx_fops no se encuentra en kallsyms, intenta extraerlo del vmlinux proporcionado con el paquete de cabeceras (linux-headers en Arch Linux):
nm /lib/modules/$(uname -r)/build/vmlinux > syms.txt