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

La empresa Qualys ha descubierto una vulnerabilidad (CVE-2021-4034) en el componente del sistema Polkit (anteriormente PolicyKit), utilizado en distribuciones para permitir que los usuarios no privilegiados realicen acciones que requieren permisos elevados. La vulnerabilidad permite a un usuario local no privilegiado aumentar sus privilegios a los de root y obtener control total sobre el sistema. Este problema ha sido apodado PwnKit y es notable por la disponibilidad de un exploit funcional que opera en la configuración predeterminada de la mayoría de las distribuciones de Linux.

El problema se presenta en la herramienta pkexec que forma parte de PolKit, la cual se distribuye con la bandera SUID root y está destinada a ejecutar comandos con los privilegios de otro usuario según las reglas definidas en PolKit. Debido a un manejo incorrecto de los argumentos de la línea de comandos que se pasan a pkexec, un usuario no privilegiado podría eludir la autenticación y conseguir ejecutar su código con privilegios de root, independientemente de las restricciones de acceso establecidas. No importa qué configuraciones y limitaciones estén definidas en PolKit, basta con que el ejecutable pkexec tenga el atributo SUID root.

Pkexec no verifica la validez del contador de argumentos de la línea de comandos (argc) que se pasan al iniciar el proceso. Los desarrolladores de pkexec asumieron que el primer elemento del arreglo argv siempre contiene el nombre del proceso (pkexec), y que el segundo elemento es ya sea NULL o el nombre del comando que se va a ejecutar a través de pkexec. Como el contador de argumentos no se verificaba en comparación con el contenido real del arreglo y se suponía que siempre era mayor que 1, en el caso de que se pase un arreglo argv vacío al proceso, lo cual es permitido por la función execve en Linux, pkexec interpreta el valor NULL como el primer argumento (nombre del proceso) y la memoria posterior al límite como el contenido siguiente del arreglo. |———+———+——+————|———+———+——+————| | argv[0] | argv[1] | … | argv[argc] | envp[0] | envp[1] | … | envp[envc] | |—-|—-+—-|—-+——+——|——|—-|—-+—-|—-+——+——|——| V V V V V V «program» «-option» NULL «value» «PATH=name» NULL

El problema es que inmediatamente después del array argv en memoria se coloca el array envp, que contiene las variables de entorno. Así, con un array argv vacío, pkexec extrae datos sobre el comando que se ejecuta con privilegios elevados del primer elemento del array de variables de entorno (argv[1] se vuelve idéntico a envp[0]), cuyo contenido puede ser controlado por el atacante.

Una vez obtenido el valor de argv[1], pkexec intenta determinar la ruta completa al archivo ejecutable teniendo en cuenta los caminos de los archivos en el PATH y escribe el puntero a la cadena con la ruta completa de nuevo en argv[1], lo que lleva a sobrescribir el valor de la primera variable de entorno, ya que argv[1] es idéntico a envp[0]. Mediante la manipulación del nombre de la primera variable de entorno, el atacante puede reemplazar otra variable de entorno en pkexec, por ejemplo, insertar la variable de entorno "LD_PRELOAD", que no se permite en programas suid, y organizar la carga de su propia biblioteca compartida en el proceso.

En el exploit funcional se realiza la sustitución de la variable GCONV_PATH, la cual se utiliza para definir la ruta a la biblioteca de conversión de caracteres, cargada dinámicamente al invocar la función g_printerr(), en cuyo código se utiliza iconv_open(). Al redefinir la ruta en GCONV_PATH, el atacante puede forzar la carga de una biblioteca iconv no estándar, sino su propia biblioteca, cuyos manejadores se ejecutarán durante la salida del mensaje de error en un momento en que pkexec aún se está ejecutando con privilegios de root y antes de la verificación de los permisos de ejecución.

Se observa que, a pesar de que el problema es causado por un daño en la memoria, puede ser explotado de manera confiable y repetible independientemente de la arquitectura de hardware utilizada. El exploit preparado ha sido probado exitosamente en Ubuntu, Debian, Fedora y CentOS, pero también puede usarse en otras distribuciones. El exploit original aún no está disponible públicamente, lo que indica que es trivial y puede ser fácilmente recreado por otros investigadores; por lo tanto, en sistemas multinivel es crucial instalar la actualización con la corrección lo antes posible. Polkit también está disponible para sistemas BSD y Solaris, pero no se ha investigado la posibilidad de explotación en ellos. Se sabe solo que el ataque no puede llevarse a cabo en OpenBSD, ya que el núcleo de OpenBSD no permite pasar un valor nulo argc en la llamada execve().

El problema ha estado presente desde mayo de 2009, desde la adición del comando pkexec. La corrección de la vulnerabilidad en PolKit está disponible en forma de parche (no se ha generado una versión correctiva), pero dado que los desarrolladores de distribuciones fueron informados sobre el problema con anticipación, la mayoría de las distribuciones publicaron una actualización al mismo tiempo que se reveló la vulnerabilidad. El problema ha sido solucionado 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, se puede quitar la bandera SUID root del programa /usr/bin/pkexec (“chmod 0755 /usr/bin/pkexec”).



Fuente: opennet.ru
Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS 🔥 Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS | ProHoster