21 de marzo de 2018

UBUNTU, ARCH y FEDORA afectadas por una vulnerabilidad en el kernel

La vulnerabilidad con código CVE-2013-1763 afecta a un amplio rango de distribuciones, entre ellas Fedora, Ubuntu y Arch Linux. Esta vulnerabilidad, cuenta además con el código para explotarla, que permite obtener privilegios de root. En esta entrada analizaremos cómo se obtienen dichos privilegios.
Esta vulnerabilidad afecta a las versiones del kernel 3.0-37.10 y se encuentra en 'net/core/sock_diag.c' donde la función '__sock_diag_rcv_msg' no hace hace una comprobación de `bounds check` del array 'sock_diag_handles' provocando una 'out-of-bounds exception' y permitiendo a usuarios sin privilegios de root obtenerlo.
En los sistemas Linux de 32 bits, cada proceso virtualizará 4GB de espacio de memoria, siendo 3GB de estos el espacio de usuario y 1GB el espacio del kernel. En este caso el rango de user-space es 00000000 a 0xBFFFFFFF y el espacio de kernel 0xC0000000 a 0xFFFFFFFF. El espacio del kernel es compartido por todos los procesos sin embargo, sólo pueden acceder los procesos que se estén ejecutando en kernel-mode. Los procesos a nivel de usuario pueden acceder a kernel-mode a través de `syscalls`. Si un proceso se ejecuta en kernel-mode, las direcciones generadas pertenecen al espacio del kernel.
Las funciones 'commit_creds' y 'prepare_kernel_cred' son funciones del kernel y para poder ejecutarlas tendríamos que pasar a kernel-mode; por tanto si la función '__sock_diag_rcv_msg' se ejecuta en kernel-mode, podemos aprovecharla para ganar privilegios de root.
Se aplica un mmap al rango de memoria 0x10000-0x120000, incluyendo una serie de NOPs hasta poder colocar correctamente la payload que salta al código que pertenece a kernel-mode. En Ubuntu, no se puede obtener el valor de la variable 'rehash_time' de dicho rango de memoria, por lo que sólo es válido el siguiente método para obtenerla:
`sudo cat /boot/System.map-3.5.0-17-generic`
Tras conseguir toda esta información, el usuario puede obtener privilegios de root. Como contra, para poder ejecutar este exploit más de una vez, es necesario reiniciar el sistema operativo.
Más información:
Linux Kernel < 3.5.0-23 (Ubuntu 12.04.2 x64) - 'SOCK_DIAG' SMEP Bypass Local Privilege Escalation: https://www.exploit-db.com/exploits/44299
Fuente: Hispasec