
Análisis en profundidad de CVE-2026-41651 (Pack2TheRoot), una escalada de privilegios local en PackageKit. Incluye desglose de la vulnerabilidad, cadena de ataque, IoCs y guía de mitigación.
Escalada de privilegios local en PackageKit (Condición de carrera TOCTOU)
CVSS v3.1: 8.8 (ALTA) | CWE-367 | Publicado: 2026-04-22
Este repositorio recopila un informe de análisis personal y material de investigación sobre la vulnerabilidad de escalada de privilegios local CVE-2026-41651 (Pack2TheRoot) en PackageKit, divulgada en abril de 2026.
| Elemento | Contenido |
|---|---|
| ID CVE | CVE-2026-41651 |
| Nombre de la vulnerabilidad | Pack2TheRoot |
| Software afectado | PackageKit 1.0.2 ~ 1.3.4 |
| Versión del parche | PackageKit 1.3.5 |
| Tipo de ataque | Escalada de privilegios local (LPE) |
| Descubridor | Deutsche Telekom Red Team |
Tres errores en pk-transaction.c de PackageKit actúan de forma combinada y permiten que un usuario local sin privilegios obtenga privilegios de root.
Bug 1: Sobrescritura incondicional de cached_transaction_flags al llamar a InstallFiles() (Línea 4036)
↓
Bug 2: Al rechazar la transición de estado, los flags contaminados permanecen en memoria sin revertirse (Línea 876~881)
↓
Bug 3: Lectura de los flags contaminados al ejecutar pk_transaction_run() (Línea 2273~2277)
↓
Resultado: Bypass de autenticación de polkit → instalación de paquetes arbitrarios como root → creación de bash SUID
InstallFiles(SIMULATE=0x4, dummy) → bypass de autenticación de polkitInstallFiles(NONE=0x0, payload) → contaminación de flags (TOCTOU)NOT_AUTHORIZED de polkit, el paquete ya está instalado/tmp/.suid_bash → obtención de euid=0(root)| Elemento | Contenido |
|---|---|
| Reproducción del PoC | Docker (Ubuntu 24.04.4 LTS) |
| Recopilación de IoC | VirtualBox (Ubuntu 22.04.5 LTS, PackageKit 1.2.5) |
| Análisis de código | GitHub — commit 2149735 de PackageKit (vulnerable) / 76cfb675 (parche) |
CVE-2026-41651-analysis/
├── README.md
└── CVE-2026-41651_분석보고서.docx # Informe de análisis detallado
Durante un intento de ataque, los siguientes patrones de registro quedan registrados en el sistema.
# Comando de detección
journalctl -u packagekit | grep -i "assertion\|emitted\|failed"
PackageKit[PID]: pk_backend_job_emit: assertion 'PK_IS_BACKEND_JOB(job)' failed
PackageKit[PID]: g_signal_emit_valist: assertion 'G_TYPE_CHECK_INSTANCE(instance)' failed
PackageKit[PID]: GLib-Object:CRITICAL: g_object_unref: assertion 'G_IS_OBJECT(object)' failed
PackageKit[PID]: backend job failed
PackageKit[PID]: emit transaction failed
PackageKit[PID]: daemon stop ← Bloqueo
PackageKit[PID]: daemon start ← Reinicio automático
# Detección de archivos SUID
find /tmp -perm -4000 -type f 2>/dev/null
# → Si existe /tmp/.suid_bash, se requiere una respuesta inmediata
# Ubuntu / Debian
sudo apt update && sudo apt upgrade packagekit
# RHEL / Fedora
sudo dnf update PackageKit
# Comprobación de versión (vulnerable si es 1.3.4 o inferior)
dpkg -l | grep -i packagekit # Debian/Ubuntu
rpm -qa | grep -i PackageKit # RHEL/Fedora
# Comprobación del estado del demonio
systemctl status packagekit
# Desactivar PackageKit
sudo systemctl disable --now packagekit
⚠️ Si se desactiva, las herramientas GUI de gestión de paquetes como GNOME Software dejarán de funcionar
Este repositorio ha sido creado con fines de investigación y aprendizaje en seguridad.
La explotación de vulnerabilidades y el acceso no autorizado a sistemas pueden conllevar sanciones legales; todas las pruebas se realizaron en entornos aislados de propiedad propia.
| Fecha | Contenido |
|---|
| 2026-04-08 | Deutsche Telekom Red Team → primer informe a Red Hat/PackageKit |
| 2026-04-10 | Los mantenedores de PackageKit aceptan y confirman la reproducción |
| 2026-04-13 | Redacción del borrador del parche privado |
| 2026-04-15 | Compartición de la vulnerabilidad con Canonical |
| 2026-04-19 | Notificación privada a los proveedores de distribuciones |
| 2026-04-22 | Lanzamiento de PackageKit 1.3.5, asignación de CVE y divulgación pública |