La empresa Qualys ha descubierto dos vulnerabilidades (CVE-2021-44731, CVE-2021-44730) en la herramienta snap-confine, que se entrega con la bandera SUID root y es llamada por el proceso snapd para crear un entorno de ejecución para aplicaciones distribuidas en paquetes auto-contenidos en formato snap. Estas vulnerabilidades permiten que un usuario local no privilegiado ejecute código con derechos de root en el sistema. Los problemas han sido solucionados en la actualización de paquetes snapd lanzada hoy para Ubuntu 21.10, 20.04 y 18.04.
La primera vulnerabilidad (CVE-2021-44730) permite realizar un ataque mediante la manipulación de enlaces duros, pero requiere desactivar la protección del sistema para enlaces duros (configurando sysctl fs.protected_hardlinks en 0). El problema es causado por una verificación incorrecta de la ubicación de los archivos ejecutables de las herramientas snap-update-ns y snap-discard-ns, que se ejecutan con privilegios de root. La ruta a estos archivos se calculaba en la función sc_open_snapd_tool() basada en su propia ruta desde /proc/self/exe, lo que permite crear un enlace duro a snap-confine en su propio directorio y colocar allí sus propias versiones de las herramientas snap-update-ns y snap-discard-ns. Al ejecutar el enlace duro, snap-confine con privilegios de root ejecutará desde el directorio actual los archivos snap-update-ns y snap-discard-ns proporcionados por el atacante.
La segunda vulnerabilidad es causada por una condición de carrera y puede ser explotada en la configuración predeterminada de Ubuntu Desktop. Para que el exploit funcione con éxito en Ubuntu Server, se requiere elegir uno de los paquetes de la sección 'Featured Server Snaps' durante la instalación. La condición de carrera se manifiesta en la función setup_private_mount(), que se llama durante la preparación del espacio de nombres de los puntos de montaje para el paquete snap. Esta función crea un directorio temporal '/tmp/snap.$SNAP_NAME/tmp' o utiliza uno existente para montajes bind de los directorios del paquete en formato snap.
Dado que el nombre del directorio temporal es predecible, un atacante puede reemplazar su contenido con un enlace simbólico en el momento después de la verificación del propietario, pero antes de la llamada al sistema mount. Por ejemplo, se puede crear un enlace simbólico "\/tmp\/snap.lxd\/tmp" en el directorio \/tmp\/snap.lxd, apuntando a un directorio arbitrario, y la llamada a mount() seguirá el enlace simbólico y montará el directorio en el espacio de nombres snap. De manera similar, se puede montar su contenido en \/var\/lib y a través de la sustitución de \/var\/lib\/snapd\/mount\/snap.snap-store.user-fstab organizar el montaje de su directorio \/etc en el espacio de nombres del paquete snap para permitir la carga de su biblioteca con derechos de root a través de la sustitución de \/etc\/ld.so.preload.
Se observa que crear un exploit resultó ser una tarea no trivial, ya que la utilidad snap-confine está escrita en Go utilizando técnicas de programación segura, tiene protección basada en perfiles de AppArmor, filtra llamadas del sistema utilizando el mecanismo seccomp y aplica un espacio de nombres para el montaje con fines de aislamiento. Sin embargo, los investigadores lograron preparar un exploit funcional para obtener derechos de root en el sistema. El código del exploit se publicará en unas semanas, después de que los usuarios hayan instalado las actualizaciones proporcionadas.
Fuente: opennet.ru
