
Exploit local de root no Linux para CVE-2014-0038
A chamada de sistema recvmmsg X86_X32 não sanitiza adequadamente o ponteiro de timeout passado do espaço do usuário.
Passe um ponteiro para um endereço do kernel como timeout para recvmmsg; se o byte original nesse endereço for conhecido, ele pode ser sobrescrito com dados conhecidos. Se o byte menos significativo for 0xff, esperar 255 segundos o transformará em 0x00.
O primeiro long no endereço passado (tv_sec) tem que ser positivo e o segundo long (tv_nsec) tem que ser menor que 1000000000.
Vise o ponteiro de função release da estrutura ptmx_fops localizada em memória do kernel não inicializada (e portanto gravável). Zere os três bytes mais significativos e assim transforme-o em um ponteiro para um endereço mapeável no espaço do usuário. O ponteiro release é usado porque é seguido por 16 bytes 0x00 (portanto o tv_nsec é válido). Abra /dev/ptmx, feche-o e aproveite.
Não é muito bonito, mas deve ser razoavelmente confiável se os símbolos puderem ser resolvidos.
Testado no Ubuntu 13.10
Veja também http://blog.includesecurity.com/2014/03/exploit-CVE-2014-0038-x32-recvmmsg-kernel-vulnerablity.html
Obtenha os endereços de /proc/kallsyms e execute o exploit:
./build.sh && ./timeoutpwn
Se você quiser compilar o binário para um servidor remoto, tente isto:
ssh user@host 'cat /proc/kallsyms' > syms.txt
CFLAGS=-static ./build.sh syms.txt
scp timeoutpwn user@host:
...
Se ptmx_fops não puder ser encontrado no kallsyms, tente extraí-lo do vmlinux
fornecido com o pacote de headers (linux-headers no Arch Linux):
nm /lib/modules/$(uname -r)/build/vmlinux > syms.txt