
Prueba de concepto para la vulnerabilidad Polkit Pkexec: CVE-2021-4034(Pkexec Local Privilege Escalation)
Este repositorio contiene un exploit que desarrollé para entender cómo funciona la vulnerabilidad Polkit Pkexec: CVE-2021-4034 (Pkexec Local Privilege Escalation). Polkit (anteriormente conocido como PolicyKit) es un componente que tiene como función controlar los privilegios en los sistemas operativos tipo Unix. Proporciona de forma organizada una manera para que los procesos sin privilegios se comuniquen con procesos que poseen privilegios. La vulnerabilidad permite que cualquier usuario, un usuario común del sistema, sin privilegios administrativos, alcance el máximo privilegio en el sistema.
La vulnerabilidad ocurre cuando la función main() del pkexec procesa argumentos de línea de comandos donde el argumento es 0. La función intenta acceder a la lista de argumentos y termina intentando acceder al rgvvoid (un controlador de argumentos de línea de comandos), es decir, ocurre cuando pkexec no maneja correctamente los parámetros de llamada y termina intentando ejecutar variables de entorno como comandos. El resultado de esto es que la memoria se lee y escribe fuera de los límites, donde un atacante puede explotar esto e inyectar una variable de entorno que puede hacer que se cargue un código malicioso.
Es simple de entender, el hecho de que estas variables de entorno puedan ser introducidas hace que el código sea vulnerable. La forma que usé para explotar la vulnerabilidad fue la misma que fue utilizada por Qualys. El proceso es simple, basta con inyectar una variable GCONV_PATH en el entorno de trabajo de pkexec, es decir, cualquier directorio disponible para usuarios comunes del sistema. Esta variable ejecutará una biblioteca compartida como root. Debemos dejar claro que esta técnica es ruidosa y deja muchos rastros, ya que la inyección de la variable crea un directorio y este comparte los privilegios con el usuario root.
Si ves que tu sistema es vulnerable, actualízalo lo antes posible. Si aún así crees que eres vulnerable, puedes eliminar el bit SUID de pkexec como una forma de mitigación temporal, de esta manera: # chmod 0755 /usr/bin/pkexec
Más detalles de cómo funciona la vulnerabilidad aquí.
El exploit funcionará instantáneamente en distribuciones vulnerables basadas en Debian, Ubuntu, Fedora y CentOS. Fue creado con fines de estudio sobre la vulnerabilidad y para ver hasta dónde puedo llegar actualmente por mi cuenta con el lenguaje C :D. No uses esto para hacer lo que no debes.
$ git clone https://github.com/Nosferatuvjr/PwnKit
$ cd PwnKit
$ chmod +x ./PwnKit.sh
$ ./PwnKit.sh
# id
O
$ git clone https://github.com/Nosferatuvjr/PwnKit
$ cd PwnKit
$ chmod +x ./PwnKit
$ ./PwnKit
$ ./PwnKit id #shell interactiva

gcc -shared PwnKit.c -o PwnKit -Wl,-e,entry -fPIC