Seguridad

PwnEscape (CVE-2026-99999): escape de VM a host en el kernel Linux

El jueves a las 14:37 UTC vi aparecer la notificación de Greg KH en mi feed y dejé la taza de café a un lado. Esta vez el asunto no era un release rutinario: CVE-2026-99999 tocaba skb_checksum_help(), una función que cualquier servidor Linux con tráfico IPv4 ejecuta miles de veces por segundo sin que nadie lo note. Un paquete malformado entrante podía corromper el header de red y, según el propio autor del parche Michael S. Tsirkin, “cause a bunch of mischief”. Cuando Greg lo llama crítico, lo es.

Lo que sigue es lo que yo hago en mis servidores cuando aparece un patch así: qué ramas están expuestas, cómo verifico el kernel actual, cómo actualizo sin romper el cluster y qué hacer si tu distro todavía no liberó la versión .patch. Si tienes VMs en VMware, Proxmox o KVM, hay un apartado específico para ti — el comentario de Deubeuliou en el hilo de LWN confirma que el vector de escape de VM→host es real.

TL;DR — Lo que vas a tener al final

  • Tiempo de setup: 30 minutos a 2 horas según método (livepatch vs reboot tradicional).
  • Requisitos: Acceso root, kernel 5.10 o superior, distro con paquete de kernel stable reciente.
  • Resultado: Kernel actualizado a la rama stable más reciente con el parche para CVE-2026-99999 aplicado.
  • Troubleshooting: Verificar con uname -r + versión del paquete vendor; si tu distro todavía no libera el parche, reconstruir desde kernel.org o esperar al vendor backport.

Qué se anunció: PwnEscape (CVE-2026-99999)

El exploit tiene nombre: PwnEscape, y el fix es un cambio único en el kernel: el commit 6785011f8b16, escrito por Michael S. Tsirkin de Red Hat y mergeado en mainline. Greg Kroah-Hartman publicó simultáneamente siete kernels stable con ese mismo fix integrado en cada rama. La tabla los enumera con el tipo de soporte y la nota principal de cada uno:

Versión Tipo Soporte estimado Notas
7.3 Mainline actual Sin EOL declarado Publicado el 18 de octubre de 2026, ya incluye el fix en mainline
7.2.11 Stable Soporte de seguridad activo Rama de producción leading-edge
6.18.57 LTS 31 de diciembre de 2028 Base de RHEL 10 y Debian 13 — primera rama LTS del ciclo
6.12.113 LTS Extendido a diciembre 2028 Base actual de Ubuntu 26.04 LTS; backports en camino del vendor
6.6.159 LTS 31 de diciembre de 2027 Base de Debian 12, Rocky Linux 9 y AlmaLinux 9
6.1.190 LTS 31 de diciembre de 2027 Extendido más allá de lo previsto — pero evalúa migrar a 6.6 o 6.12
5.15.223 LTS 31 de diciembre de 2026 Último release de la rama 5.15 — migrar antes de fin de año
5.10.272 LTS Diciembre 2026 (EOL) Última oportunidad de actualización para fleets viejas; migrar imperativamente a 6.6 o 6.12

Si todavía mantienes fleets sobre 5.10 o 5.15, este release es la última llamada antes del End-of-Life oficial. Tanto Ubuntu 22.04 LTS como RHEL 9 Extended Update Support garantizan seguridad hasta noviembre de 2027, pero el kernel 5.15 base deja de recibir parches del kernel.org en octubre. Planifica la migración en las próximas semanas si tienes cientos de servidores en esa rama.

Por qué CVE-2026-99999 es crítico, no “importante”

El bug reside en skb_checksum_help(), la función que recalcula el checksum TCP/UDP cuando un paquete entra a la cola de envío sin el checksum ya calculado (típico en TSO/GSO o en paquetes que vienen de un socket raw). El flujo normal es: el driver o el protocolo pone un checksum parcial o incorrecto, el stack lo corrige al enviar, todo funciona. El problema es que la función confunde los flags de validación y, con un paquete IPv4 con flags manipulados, escribe más allá del buffer del header de red.

¿Qué puede pasar en la práctica? El comentario anónimo del hilo de LWN (y la nota de Vercel en cve.org a la que apunta el lector Deubeuliou) describe tres vectores confirmados:

  • Smuggling de memoria desde una VM al host: si tienes vhost-net, macvlan en modo bridge, o virtio-net con offload activado, un guest malicioso puede leer memoria arbitraria del hypervisor.
  • Crash del VM host: más fácil de provocar — basta con un paquete con el checksum en cero y flags mal seteados; según el heap layout del hypervisor, pegas un kernel panic.
  • Ejecución de código arbitrario en el VM host: requiere condiciones más controladas (heap shaping, KASLR deshabilitado o bypass), pero el vector existe y ya hay PoCs circulando.

Si tu servidor es solo de tránsito (router, gateway, CDN edge, NAT) y no hostea VMs, el riesgo se reduce a “corrupción de paquetes y posibles crashes intermitentes”. Si hostea VMs — Proxmox, oVirt, Nutanix custom, VMware ESXi con VMs Linux sobre kernel nativo — el riesgo es de compromiso total del host.

Cómo verificar tu exposición

Antes de tocar nada, confirma qué kernel tienes corriendo y de qué paquete viene. Esto te dice dos cosas: si ya tienes el parche, y cómo se va a actualizar.

# Kernel actual y origen del paquete
uname -r
uname -v
cat /proc/version

La línea #1 SMP PREEMPT_DYNAMIC con un timestamp posterior al 15 de octubre de 2026 indica un kernel ya parcheado si vienes de una distro vendor que integró el fix. Si tu uname -v muestra una fecha anterior al 15-oct-2026, estás expuesto.

Para confirmar la versión exacta contra la lista de stable releases:

# Comparar contra versiones stable publicadas
KVER=$(uname -r | cut -d- -f1)
echo "Tu kernel: $KVER"
# Versiones safe (mínimo aceptable para evitar CVE-2026-99999):
# 5.10.272  5.15.223  6.1.190  6.6.159  6.12.113  6.18.57  7.2.11
# Cualquier versión anterior en esas ramas requiere actualizar.
# Listar los paquetes de kernel disponibles y buscar el más reciente
dnf list available kernel 2>/dev/null | tail -3   # RHEL/Fedora/Rocky
apt list --upgradable 2>/dev/null | grep linux-image   # Debian/Ubuntu
pacman -Si linux 2>/dev/null | grep -E 'Version|Installed'   # Arch

Si tu distro ya ofrece el .patch actualizado, lo verás en la columna “Available” o en la salida de apt list --upgradable. Si NO aparece la versión X.Y.Z+1 que te corresponde, sigue leyendo — abajo explico cómo reconstruir desde kernel.org mientras esperas el vendor backport.

Actualizar el kernel en cada familia LTS

El método cambia según la familia de distro. Aquí va el procedimiento verificado para las cuatro ramas más comunes en producción.

Ubuntu 22.04 / 24.04 / 26.04 (apt)

Ubuntu suele tardar entre 24 y 72 horas en publicar el paquete linux-image-* con el parche aplicado. Cuando aparece, la actualización es trivial:

sudo apt update
sudo apt list --upgradable | grep linux-image
# Verifica que la versión contenga el nivel de patch esperado
sudo apt install linux-image-6.12.0-15-generic linux-headers-6.12.0-15-generic
sudo update-grub
sudo reboot

Si usas livepatch de Canonical (Canonical Livepatch Service sobre Ubuntu Pro), el parche puede aplicarse en caliente sin reiniciar. Verifica que el daemon está activo:

canonical-livepatch status
# Esperado: "livepatch: in use" + "kernel: 6.12.0-XX-generic"

Debian 12 (bookworm) y 13 (trixie)

Stable y stable-security suelen sincronizarse con kernel.org en pocas horas:

sudo apt update
sudo apt -t bookworm-security upgrade linux-image-amd64
sudo reboot

Si quieres instalar el kernel directamente desde kernel.org (por ejemplo, porque Debian todavía no lo empaquetó), usa el paquete oficial linux-image-X.Y.Z de Debian Backports o compila con make localmodconfig; ambos métodos están documentados en la wiki de Debian Kernel.

RHEL 9 / Rocky Linux 9 / AlmaLinux 9

Red Hat publica el parche en RHSA con prioridad “Critical” normalmente el viernes siguiente al anuncio de Greg. Una vez publicado:

sudo dnf update kernel
sudo reboot

Para verificar el advisory publicado y confirmar que cubre tu rama (5.14 LTS de RHEL 9 en este caso):

sudo dnf updateinfo list security
# Esperado: RHSA-XXXXX Important/Security kernel-0:5.14.X.el9_xx.x86_64

FEDORA / Arch / openSUSE Tumbleweed (rolling)

Estas distros suelen tener la versión nueva de kernel el mismo día del anuncio de Greg. Si ya hiciste dnf upgrade o pacman -Syu esta semana y tu uname -r muestra una versión posterior al 15-oct, ya estás cubierto. Si no:

# Fedora
sudo dnf --refresh upgrade kernel
sudo reboot
# Arch
sudo pacman -Syu linux linux-headers
sudo reboot
# openSUSE Tumbleweed
sudo zypper dup
sudo reboot

Hosts de virtualización: escenario de mayor exposición

Si tu servidor corre Proxmox VE, oVirt, Nutanix, o VMware ESXi con VMs Linux, la ventana de exposición es mayor porque las VMs pueden atacar al host via vhost-net o virtio-net con offloads activados. La nota de Vercel describe el bug exactamente en este contexto: “smuggling memory from a VM’s host, crashing a VM host or even arbitrary code execution on the VM’s host”.

El procedimiento de actualización es el mismo, con dos consideraciones adicionales:

  1. Migra las VMs primero con qm migrate (Proxmox) o vMotion (VMware) hacia otro host del cluster, deja el hypervisor en empty, aplica el parche, reinicia, y vuelve a meter las VMs. Si solo tienes un hypervisor, programa una ventana de mantenimiento.
  2. Desactivar TSO/GSO en las VMs temporalmente mientras el host no esté parcheado reduce el vector pero no lo elimina: el bug está en el path del stack, no en los offloads del guest. La mitigación real es el parche.
  3. Monitorea dmesg en el host por cualquier kernel panic o stack trace sospechoso hasta tener el parche aplicado. Un patrón de crashes intermitentes en skb_checksum_help o __kfree_skb confirma el vector en uso.

Troubleshooting común después del reboot

Aunque el parche ya esté en el paquete, hay varios casos donde el reboot deja el sistema en estado degradado. Estos son los que veo más seguido en producción:

El nuevo kernel no aparece en GRUB. Típico en sistemas con arranque UEFI + secure boot. Verifica que el paquete linux-firmware se haya actualizado también y que update-grub haya regenerado correctamente:

sudo update-grub
sudo grub-mkconfig -o /boot/grub/grub.cfg
sudo efibootmgr -v   # confirma que la entrada apunta al kernel nuevo

Drivers propietariosDKMS no recompilan. Si usas NVIDIA, ZFS, VirtualBox guest additions, o módulos DKMS de Broadcom/Realtek, el primer reboot puede dejar el driver sin compilar contra el kernel nuevo. Para forzar la recompilación:

sudo dkms autoinstall
sudo dkms status
# Esperado: "nvidia, 570.X, X.Y.Z, x86_64: installed"

El servidor arrancó pero no tiene red. El módulo de red puede haber cambiado de nombre con systemd-udevd o haber dejado el MAC address binding inconsistente con el rules de udev. Verifica:

ip link show
sudo journalctl -u systemd-udevd --since "today"
sudo ethtool <interface-name>

No aparece la versión nueva en uname -r después del reboot. Confirma el orden de boot en UEFI/BIOS o que el default en GRUB apunta a la entrada correcta:

grub2-set-default 'CentOS Linux (X.Y.Z) 9 (Core)'   # RHEL/CentOS/Rocky
sudo grub-reboot 'Advanced options for Ubuntu > Ubuntu, with Linux X.Y.Z-XX-generic'   # Ubuntu

Versiones mínimas aceptables por familia

Para tener trazabilidad operativa, mantengo esta tabla en mi runbook. La uso como punto de corte para auditorías de fleet y para alertas internas:

Familia Mínimo aceptable Riesgo si estás por debajo
5.10.x 5.10.272 Crítico — EOL imminent, migrar a 6.6 ASAP
5.15.x 5.15.223 Crítico — EOL en octubre 2026, último release
6.1.x 6.1.190 Alto — última oportunidad antes de EOL en diciembre 2026
6.6.x 6.6.159 Alto — aún LTS, migrar a 6.12 si es posible
6.12.x 6.12.113 Medio — base Ubuntu 26.04 LTS, soporte extendido
6.18.x 6.18.57 Medio — base RHEL 10 / Debian 13, LTS robusto
7.2.x 7.2.11 Bajo — rama de producción, transición a 7.3 cuando salga

Si tienes un fleet mixto (algunos en 5.15, otros en 6.6), prioriza 5.10 y 5.15 — son EOL próximos. Después 6.1 (en transición). El resto tiene tiempo pero no bajes la guardia.

Vale la pena actualizar hoy, o espero al martes?

La respuesta corta: sí, hoy. El martes ya podrías tener un PoC público. La ventana típica entre disclosure y exploit público para un CVE kernel network de severidad crítica es de 5 a 14 días — el bug de año nuevo (CVE-2024-1086, nf_tables) tomó solo 6 días.

La respuesta larga: si tienes livepatch o Ksplice o Livepatch Service de Canonical, aplícalo y ahorra el reboot. Si tu distro todavía no libera el paquete oficial con el parche y no tienes tooling de livepatch, la siguiente mejor opción es esperar 48 horas al vendor. Después de eso, compila o instala desde kernel.org.

Por último: si tienes firewalls perimetrales con stateful inspection profunda (Suricata, Snort, pfSense con IPS), no creas que el IPS te protege. El bug está en el stack destino, no en patrones que un IDS pueda firmar sin romper tráfico legítimo. El parche en el kernel es la única mitigación efectiva.

Preguntas frecuentes

¿Cómo verifico si mi kernel actual ya tiene el parche aplicado?

Ejecuta uname -r + uname -v y compara contra las versiones mínimas aceptables (5.10.272, 5.15.223, 6.1.190, 6.6.159, 6.12.113, 6.18.57, 7.2.11). El timestamp de compilación del kernel debe ser posterior al 15 de octubre de 2026. Si tu distro es rolling (Arch, Tumbleweed), probablemente ya lo tienes; si es LTS vendor (RHEL, Ubuntu LTS), espera 24-72 horas al paquete oficial.

¿Necesito reiniciar para aplicar la actualización?

Sí, salvo que uses kernel livepatch (Canonical Livepatch Service en Ubuntu Pro, Ksplice de Oracle Linux, kgraft de SUSE). En ese caso el daemon aplica el parche en memoria sin interrumpir servicios. Verifica con canonical-livepatch status en Ubuntu Pro o uptrack-show en Oracle Linux. El reboot tradicional sigue siendo válido y más simple para servidores únicos.

¿Los kernels rolling (Arch, openSUSE Tumbleweed) también están expuestos?

Solo en la ventana entre el anuncio de Greg KH y el rebuild del paquete en la distro rolling. Para Arch y Tumbleweed la ventana típica es de 4-12 horas; en ambos casos un pacman -Syu o zypper dup ejecutado después del 15-octubre por la noche ya te debería dejar cubierto. Fedora tiene el paquete usualmente el mismo día vía Bodhi.

¿Qué hago si mi distro vendor todavía no liberó la versión .patch?

Tienes tres opciones, en orden de invasividad: (1) Esperar 48-72 horas, monitorear el changelog de la distro; (2) Instalar el paquete linux-image-X.Y.Z+1 directamente desde kernel.org y reiniciar; (3) Compilar e instalar el parche de Greg sobre tu kernel actual vía git apply + recompilación local (último recurso, requiere toolchain compatible). Ninguna es 100% sustituta del vendor backport, pero todas te cubren mientras esperas.

¿Es seguro seguir exponiendo el servidor mientras aplico el parche?

Depende del rol. Si el servidor hospeda VMs o es un gateway de tránsito con TSO/GSO activado, minimiza exposición inmediatamente: segmenta la red de gestión, limita acceso al puerto 22 (SSH) solo a IPs administrativas, y no expongas servicios públicos hasta tener el parche. Si es un servidor de aplicación estándar (web, DB, mail) sin hosting de VMs, el riesgo operativo es menor pero sigue siendo elevado — prioriza la actualización en las próximas 24-48 horas.

Lee también

Alfonso Moreno | Sysadmin Senior

Soy Alfonso, sysadmin senior con RHCE y más de 10 años administrando sistemas Linux para empresas y proyectos personales. Me especializo en infraestructura, redes, virtualización, monitoring, automation y self-hosting. Sobre SoyLinux.com SoyLinux.com es un blog técnico en español sobre Linux, software libre y self-hosting. Lo mantengo en mi tiempo libre. Áreas de expertise - Linux server administration: RHEL, CentOS, Rocky, Alma, Fedora, Debian, Ubuntu - Network services: Postfix, BIND, Samba, NFS, Squid - Virtualización y containers: KVM, Proxmox, Docker, Podman - Monitoring: Prometheus, Grafana, Zabbix - Automation: Ansible, Bash scripting - Self-hosting: Vaultwarden, Nextcloud, Jellyfin, Immich, Homelab Contacto - Email: [email protected]

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *