cd ~/blog

~/vulns/pwnkit-pkexec-cve-2021-4034.md

PwnKit pkexec (CVE-2021-4034)

privescautor: Jordy Pérez Osorio aviso legal
privescpolkitpkexecLinux

~2 min de lectura


1. Descripción técnica

PwnKit, identificada como CVE-2021-4034, es una vulnerabilidad de Local Privilege Escalation en pkexec, un componente de Polkit. pkexec suele instalarse como binario SUID root para ejecutar comandos como otra identidad según las políticas de Polkit.

El fallo es una corrupción de memoria por out-of-bounds: cuando pkexec se ejecuta sin argumentos (argc == 0), su lógica de re-ejecución de la lista de argumentos lee/escribe fuera de los límites del array argv/envp. Manipulando cuidadosamente el entorno, un atacante puede reintroducir una variable de entorno (como GCONV_PATH) que normalmente pkexec sanea, y forzar la carga de una librería compartida maliciosa con privilegios de root, obteniendo ejecución de código como root.

No requiere autenticación ni configuración especial de Polkit: basta con que el binario pkexec SUID esté presente.

2. Impacto de la vulnerabilidad

  • Escalada de privilegios a root local, totalmente fiable y sin dependencias de configuración.
  • Afecta a todas las versiones de pkexec desde su creación (2009) hasta el parche.
  • Por su ubicuidad (pkexec está instalado por defecto), tuvo un impacto enorme; exploits de una sola ejecución.

3. Historia y evolución

  • Descubierta por el equipo de investigación de Qualys y publicada en enero de 2022 (afecta a código de 2009).
  • Aparecieron exploits públicos inmediatos (Almorabea, ly4k/PwnKit, berdav/CVE-2021-4034) que funcionan en C o incluso como binario autónomo.
  • Es uno de los privescs más usados en CTFs por su fiabilidad universal.

4. Condiciones necesarias

  1. Presencia del binario pkexec con bit SUID (instalado por defecto vía Polkit).
  2. Una versión sin parchear de Polkit/pkexec.
  3. Acceso local como usuario sin privilegios.

5. Validación y detección

  • Verificar que pkexec existe y es SUID:
ls -l /usr/bin/pkexec
find / -perm -4000 2>/dev/null | grep pkexec
  • Versión de Polkit:
pkexec --version
dpkg -l policykit-1   # o equivalente
  • LinPEAS / linux-exploit-suggester lo señalan automáticamente.

6. Mitigación

  1. Actualizar Polkit/pkexec a una versión parcheada.
  2. Como mitigación temporal, quitar el bit SUID de pkexec: chmod 0755 /usr/bin/pkexec.

7. Explotación documentada

En 081-beloved, el exploit de Almorabea compila la biblioteca y activa pkexec. 026-pipy y 103-drippingblues documentan el mismo resultado de escalada local sobre instalaciones vulnerables:

beloved@beloved:/tmp$ find / -perm -4000 2>/dev/null
...
/usr/bin/pkexec
...

beloved@beloved:/tmp$ python3 CVE-2021-4034.py
[+] Creating shared library for exploit code.
[+] Finding a libc library to call execve
[+] Call execve() with chosen payload
[+] Enjoy your root shell
# whoami
root

8. Clasificación

  • Tipo: Out-of-bounds Read/Write → Local Privilege Escalation
  • CVE: CVE-2021-4034
  • CWE:
    • CWE-787 – Out-of-bounds Write
    • CWE-125 – Out-of-bounds Read

9. Referencias y conexiones

// relacionados