
Esta es mi implementación simple de un exploit para la vulnerabilidad PwnKit.
Nota: Este repositorio y su contenido forman parte de un Trabajo de Fin de Grado (TFG), creado únicamente con fines didácticos y para la investigación académica.
Este repositorio contiene una prueba de concepto (PoC - Proof of Concept) para la vulnerabilidad CVE-2021-4034 (también conocida como PwnKit). Esta vulnerabilidad de corrupción de memoria afecta al componente pkexec de Polkit en sistemas Linux. Al ejecutar pkexec con una lista de argumentos vacía (argc == 0), las variables de entorno pueden manipularse para forzar la carga de una biblioteca compartida arbitraria, logrando así una escalada local de privilegios.
A continuación se detallan los pasos necesarios para preparar el entorno de ejecución con el fin de explotar el fallo. Este proceso describe cómo se aprovecha el error de lectura/escritura en memoria de pkexec:
gconv)Este exploit abusa de la forma en que GLib gestiona la conversión de caracteres al intentar imprimir un mensaje de error. Para ello, el primer paso es crear una estructura de directorios concreta que funcione para GLib como un repositorio local de módulos de conversión GCONV.
La clave de la vulnerabilidad consiste en inyectar la variable de entorno GCONV_PATH, aprovechando la escritura fuera de los límites provocada por la condición argc == 0 en pkexec. De este modo, se obliga al programa a utilizar un juego de caracteres anómalo, lo que indica a GLib que debe buscar los módulos de conversión de caracteres en el directorio controlado creado en el paso anterior.
.so)Para ejecutar nuestro código, es necesario compilar una biblioteca compartida (shared object o .so). Cuando pkexec intente procesar un juego de caracteres que no puede encontrar, cargará esta biblioteca desde nuestro directorio gconv falso. Dado que pkexec es un binario con el bit SUID activado (se ejecuta como root), al cargar esta biblioteca nuestro código obtendrá privilegios de root, tomando el control total del sistema (por ejemplo, abriendo una shell de root).
gconv-modulesFinalmente, es necesario crear un archivo de configuración llamado gconv-modules en ese directorio local. Este archivo actúa como un índice: le indica a GLib qué biblioteca concreta (.so) debe cargar para realizar la conversión del juego de caracteres específico solicitado. Este archivo vincula la conversión solicitada por pkexec con la biblioteca compartida creada en el paso 3.
El proyecto incluye un Makefile para automatizar la compilación del binario en C y la limpieza del entorno.
Para compilar el proyecto: $ make
Para limpiar los archivos generados (temporales, carpetas y binarios): $ make clean