
Exploit local root Linux pour CVE-2014-0038
L'appel système X86_X32 recvmmsg ne nettoie pas correctement le pointeur de timeout passé depuis l'espace utilisateur.
Passer un pointeur vers une adresse noyau comme timeout pour recvmmsg ; si l'octet original à cette adresse est connu, il peut être écrasé avec des données connues. Si l'octet le moins significatif est 0xff, attendre 255 secondes le transformera en 0x00.
Le premier long à l'adresse passée (tv_sec) doit être positif et le second long (tv_nsec) doit être inférieur à 1000000000.
Cibler le pointeur de fonction release de la structure ptmx_fops située dans la mémoire noyau non initialisée (donc inscriptible). Mettre à zéro les trois octets les plus significatifs pour le transformer en un pointeur vers une adresse mappable dans l'espace utilisateur. Le pointeur release est utilisé car il est suivi de 16 octets 0x00 (donc tv_nsec est valide). Ouvrir /dev/ptmx, le fermer et profiter.
Pas très élégant mais devrait être assez fiable si les symboles peuvent être résolus.
Testé sur Ubuntu 13.10
Voir aussi http://blog.includesecurity.com/2014/03/exploit-CVE-2014-0038-x32-recvmmsg-kernel-vulnerablity.html
Récupérer les adresses depuis /proc/kallsyms et exécuter l'exploit :
./build.sh && ./timeoutpwn
Si vous souhaitez construire le binaire pour un serveur distant, essayez ceci :
ssh user@host 'cat /proc/kallsyms' > syms.txt
CFLAGS=-static ./build.sh syms.txt
scp timeoutpwn user@host:
...
Si ptmx_fops n'est pas trouvé dans kallsyms, essayez de l'extraire du vmlinux tel que fourni avec le paquet d'en-têtes (linux-headers sur Arch Linux) :
nm /lib/modules/$(uname -r)/build/vmlinux > syms.txt