cd ~/blog

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

PwnKit pkexec (CVE-2021-4034)

privesc 18-06-2026
privescpolkitpkexecLinux

~2 min de lectura


1. Descripción técnica del ataque

PwnKit (CVE-2021-4034) es una vulnerabilidad de escalada de privilegios local en pkexec, un componente de Polkit (PolicyKit) presente por defecto en prácticamente todas las distribuciones Linux. pkexec es un binario SUID root que permite ejecutar comandos como otro usuario 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. Factores que la hacen posible

  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. 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. Ejemplo de explotación real

Máquina Beloved de HMV. Con el exploit de Almorabea (Python que compila la librería y dispara pkexec):

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. Resumen

PwnKit (CVE-2021-4034) es un fallo en pkexec (Polkit) explotable cuando se invoca con argc == 0, permitiendo cargar una librería maliciosa como root vía GCONV_PATH. Como pkexec es SUID y está instalado por defecto, es un privesc universal y fiable presente desde 2009 hasta enero de 2022. La defensa es parchear Polkit o quitar el SUID de pkexec.

// relacionados