
Lokaler Linux-Root-Exploit für CVE-2014-0038
Der X86_X32 recvmmsg-Syscall bereinigt den von Userspace übergebenen Timeout-Zeiger nicht ordnungsgemäß.
Übergib einen Zeiger auf eine Kernel-Adresse als Timeout für recvmmsg. Ist das ursprüngliche Byte an dieser Adresse bekannt, kann es mit bekannten Daten überschrieben werden. Wenn das niederwertigste Byte 0xff ist, wird es nach 255 Sekunden Wartezeit zu 0x00.
Der erste Long an der übergebenen Adresse (tv_sec) muss positiv sein, und der zweite Long (tv_nsec) muss kleiner als 1000000000 sein.
Ziele auf die release-Funktionszeiger der ptmx_fops-Struktur, die sich im nicht initialisierten (und daher beschreibbaren) Kernel-Speicher befindet. Setze die drei höchstwertigen Bytes auf Null und verwandle sie so in einen Zeiger auf eine im Userspace kartierbare Adresse. Der release-Zeiger wird verwendet, da ihm 16 0x00-Bytes folgen (sodass tv_nsec gültig ist). Öffne /dev/ptmx, schließe es und genieße.
Nicht sehr schön, aber ziemlich zuverlässig, wenn Symbole aufgelöst werden können.
Getestet auf Ubuntu 13.10
Siehe auch http://blog.includesecurity.com/2014/03/exploit-CVE-2014-0038-x32-recvmmsg-kernel-vulnerablity.html
Adressen aus /proc/kallsyms auslesen und den Exploit ausführen:
./build.sh && ./timeoutpwn
Wenn du das Binary für einen entfernten Server erstellen möchtest, versuche dies:
ssh user@host 'cat /proc/kallsyms' > syms.txt
CFLAGS=-static ./build.sh syms.txt
scp timeoutpwn user@host:
...
Falls ptmx_fops in kallsyms nicht gefunden werden kann, versuche es aus der vmlinux zu extrahieren, die mit dem Paket linux-headers (auf Arch Linux) bereitgestellt wird:
nm /lib/modules/$(uname -r)/build/vmlinux > syms.txt