Hace poco Qualys dio a conocer la noticia de que ha identificado una vulnerabilidad (CVE-2021-4034) en el componente del sistema Polkit (anteriormente PolicyKit), que se utiliza en las distribuciones para permitir que los usuarios sin privilegios realicen acciones que requieren derechos de acceso elevados.
La vulnerabilidad permite que un usuario local sin privilegios eleve sus privilegios al usuario root y obtenga control total sobre el sistema. El problema tiene 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.
Se menciona que el problema existe en la utilidad pkexec incluida con PolKit, que viene con el indicador de raíz SUID y está diseñada para ejecutar comandos con los privilegios de otros usuarios de acuerdo con las reglas de PolKit.
Debido al manejo incorrecto de los argumentos de la línea de comandos pasados a pkexec, un usuario sin privilegios podría omitir la autenticación y hacer que su código se ejecute como root, independientemente de las reglas de acceso establecidas. Para un ataque, no importa qué configuraciones y restricciones se establezcan en PolKit, es suficiente que se establezca el atributo raíz SUID para el archivo ejecutable con la utilidad pkexec.
Pkexec no comprueba la corrección del recuento de argumentos de la línea de comandos (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 entrada es NULL o el nombre del comando ejecutado a través de pkexec.
Dado que el contador de argumentos no se comparó con el contenido real de la matriz y se supuso que siempre era mayor que 1, si se pasaba una matriz argv vacía al proceso, lo que permite la función execve de Linux , pkexec trataba a NULL como el primer argumento ( nombre del proceso), y el siguiente después de fuera de la memoria del búfer, como el siguiente contenido de la matriz.
El problema es que después de la matriz argv en la memoria está la matriz envp que contiene las variables de entorno. Por lo tanto, con una matriz argv vacía, pkexec extrae los datos sobre el comando que se ejecuta con privilegios elevados del primer elemento de la matriz con variables de entorno (argv[1] se volvió idéntico a envp[0]), cuyo contenido puede ser controlado por el atacante.
Habiendo recibido el valor argv[1], pkexec intenta determinar la ruta completa al archivo ejecutable utilizando las rutas del archivo en PATH y escribe el puntero en la cadena con la ruta completa de regreso a argv[1], lo que lleva a sobrescribir el valor de la primera variable de entorno también, 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 los programas suid, y disponer que el proceso cargue su biblioteca compartida en el proceso.
El exploit de trabajo usa la sustitución de variables GCONV_PATH, que se usa para determinar la ruta a la biblioteca de transcodificación de símbolos que se carga dinámicamente cuando se llama a la función g_printerr(), que usa iconv_open() en su código.
Al redefinir la ruta en GCONV_PATH, el atacante puede lograr cargar no la biblioteca iconv normal, sino su propia biblioteca, cuyos controladores se ejecutarán durante el mensaje de error en la etapa en que pkexec todavía se está ejecutando como root y antes de la verificación de permisos de inicio.
Se observa que, aunque el problema se debe a la corrupción de la memoria, se puede explotar de manera confiable y repetible, independientemente de la arquitectura de hardware utilizada.
El exploit preparado se probó con éxito en Ubuntu, Debian, Fedora y CentOS, pero también se puede usar 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 de la revisión lo antes posible en los sistemas multiusuario.
Polkit también está disponible para sistemas BSD y Solaris, pero no se ha explorado para su explotación. Lo que se sabe es que el ataque no se puede realizar en OpenBSD, ya que el kernel de OpenBSD no permite pasar un valor argc nulo al llamar a execve().
El problema ha estado presente desde mayo de 2009 cuando se agregó el comando pkexec. La corrección de la vulnerabilidad en PolKit todavía está disponible como parche (la versión de corrección no se ha formado), pero dado que los desarrolladores de la distribución fueron notificados con anticipación sobre el problema, la mayoría de las distribuciones publicaron una actualización al mismo tiempo que la divulgación de información sobre la vulnerabilidad.
Finalmente si estás interesado en conocer más al respecto, puedes consultar los detalles en el siguiente enlace.
Fuente obtenida de: https://blog.desdelinux.net/una-vulnerabilidad-polkit-permitia-obtener-acceso-root-en-la-mayoria-de-las-distribuciones-de-linux/