Vulnerabilidad crítica en PolKit que permite acceso root en la mayoría de distribuciones de Linux

Qualys ha identificado una vulnerabilidad (CVE-2021-4034) en el componente del sistema Polkit (anteriormente PolicyKit) utilizado en distribuciones para permitir a usuarios sin privilegios realizar acciones que requieren derechos de acceso elevados. La vulnerabilidad permite a un usuario local sin privilegios escalar sus privilegios a root y obtener control total del sistema. El problema recibió el nombre en código PwnKit y se destaca por producir un exploit funcional que se ejecuta en la configuración predeterminada en la mayoría de las distribuciones de Linux.

El problema está presente en la utilidad pkexec de PolKit, que viene con el indicador raíz SUID y está diseñada para ejecutar comandos con los privilegios de otro usuario de acuerdo con las reglas especificadas de PolKit. Debido al manejo incorrecto de los argumentos de la línea de comando pasados ​​a pkexec, un usuario sin privilegios podría omitir la autenticación y ejecutar su código como root, independientemente de las reglas de acceso establecidas. Para un ataque, no importa qué configuraciones y restricciones se especifiquen en PolKit, basta con que el atributo raíz SUID esté configurado para el archivo ejecutable con la utilidad pkexec.

Pkexec no verifica la validez del recuento de argumentos de la línea de comando (argc) pasado al iniciar un proceso. Los desarrolladores de pkexec asumieron que la primera entrada en la matriz argv siempre contiene el nombre del proceso (pkexec), y la segunda un valor NULL o el nombre del comando iniciado a través de pkexec. Dado que el recuento de argumentos no se comparó con el contenido real de la matriz y se supuso que siempre era mayor que 1, si a un proceso se le pasaba una matriz argv vacía, como lo permite la función execve de Linux, pkexec trataría NULL como el primer argumento ( el nombre del proceso) y el siguiente como fuera de la memoria intermedia, como el contenido posterior de la matriz. |———+———+——+————|———+———+——+————| | argv[0] | argv[1] | ... | argv[argc] | entorno[0] | entorno[1] | ... | envp[envc] | |—-|—-+—-|—-+——+——|——|—-|—-+—-|—-+——+——|——| VVVVVV "programa" "-opción" NULL "valor" "RUTA=nombre" NULL

El problema es que después de la matriz argv hay una matriz envp en la memoria que contiene variables de entorno. Por lo tanto, si la matriz argv está vacía, pkexec extrae datos sobre el comando ejecutado con privilegios elevados del primer elemento de la matriz con variables de entorno (argv[1] se volvió idéntico a envp[0]), cuyo contenido se puede controlar. por el atacante.

Habiendo recibido el valor de argv[1], pkexec intenta, teniendo en cuenta las rutas de los archivos en PATH, determinar la ruta completa al archivo ejecutable y escribe un puntero a la cadena con la ruta completa a argv[1], que conduce a sobrescribir el valor de la primera variable de entorno, ya que argv[1] es idéntico a envp[0]. Al manipular el nombre de la primera variable de entorno, un atacante puede sustituir otra variable de entorno en pkexec, por ejemplo, sustituir la variable de entorno "LD_PRELOAD", que no está permitida en programas suid, y organizar que su biblioteca compartida se cargue en el proceso.

El exploit funcional implica sustituir la variable GCONV_PATH, que se utiliza para determinar la ruta a la biblioteca de transcodificación de símbolos, cargada dinámicamente al llamar a la función g_printerr(), cuyo código usa iconv_open(). Al redefinir la ruta en GCONV_PATH, un atacante puede asegurarse de que no se carga la biblioteca iconv estándar, sino su propia biblioteca, cuyos controladores se ejecutarán cuando se muestre un mensaje de error en la etapa en la que pkexec todavía se está ejecutando con Se verifican los derechos de root y antes de iniciar los permisos.

Cabe señalar que, a pesar de que el problema se debe a una corrupción de la memoria, se puede explotar de forma fiable y repetitiva independientemente de la arquitectura de hardware utilizada. El exploit preparado se ha probado con éxito en Ubuntu, Debian, Fedora y CentOS, pero también se puede utilizar en otras distribuciones. El exploit original aún no está disponible públicamente, lo que indica que es trivial y otros investigadores pueden recrearlo fácilmente, por lo que es importante instalar la actualización del parche lo antes posible en sistemas multiusuario. Polkit también está disponible para sistemas BSD y Solaris, pero no ha sido estudiado para su uso en ellos. Lo que se sabe es que el ataque no se puede llevar a cabo en OpenBSD, ya que el kernel de OpenBSD no permite pasar un valor argc nulo cuando se llama a execve().

El problema ha estado presente desde mayo de 2009, desde la incorporación del comando pkexec. La solución para la vulnerabilidad PolKit está disponible actualmente como parche (no se ha publicado ningún parche), pero como los desarrolladores de la distribución fueron notificados del problema con antelación, la mayoría de las distribuciones publicaron la actualización simultáneamente con la divulgación de información sobre la vulnerabilidad. El problema se solucionó en RHEL 6/7/8, Debian, Ubuntu, openSUSE, SUSE, Fedora, ALT Linux, ROSA, Gentoo, Void Linux, Arch Linux y Manjaro. Como medida temporal para bloquear la vulnerabilidad, puede eliminar el indicador raíz SUID del programa /usr/bin/pkexec (“chmod 0755 /usr/bin/pkexec”).



Fuente: opennet.ru

Añadir un comentario