Seguridad

CVE-2026-80590: kernel panic en reensamblado de fragmentos IPv4/IPv6 con estado GSO

El 28 de agosto de 2026, Greg Kroah-Hartman publicó el aviso linux-cve-announce 2026082816-CVE-2026-80590-241e@gregkh sobre una vulnerabilidad crítica en el manejo de fragmentación IP del kernel Linux. Catalogada como CVE-2026-80590 con CVSS 8.6 (High) y CWE-843 (Type Confusion), afecta a las ocho ramas stable mantenidas (de 5.10 a 7.2) y, según el aviso, estuvo latente en el kernel desde 2.6.27. La buena noticia: el parche ya está integrado en las ocho ramas stable que mantiene GregKH.

TL;DR — Lo que vas a tener al final

  • Tiempo de setup: 30 minutos a 2 horas dependiendo de la complejidad del entorno.
  • Requisitos: Acceso root, Linux moderno, conexión a internet para descargar dependencias.
  • Resultado: Servicio funcional y estable, documentado paso a paso.
  • Troubleshooting: Logs estándar en /var/log/, comandos de verificación al final de cada sección.

Qué falla exactamente

El problema vive en inet_frag_queue_insert(), la función que el kernel usa tanto para IPv4 como para IPv6, nf_conntrack_reasm y 6lowpan cuando encola un fragmento IP en una cola de reensamblado. Cuando entra un socket buffer (skb) a esa cola, ya es un fragmento IP por definición y no debería llevar metadatos de Generic Segmentation Offload (GSO). Sin embargo, una cabecera virtio_net_hdr adjuntada por un proceso en espacio de usuario puede marcar ese fragmento como GSO con SKB_GSO_DODGY.

El código actual no limpia los campos shinfo->gso_size, shinfo->gso_type y shinfo->gso_segs al encolar el fragmento. Cuando inet_frag_reasm_prepare() toma el primer fragmento como cabeza del datagrama reensamblado y encadena el resto en frag_list, el skb resultante sigue reclamando ser GSO. En el siguiente punto de segmentación por software — udp_rcv_segment(), validate_xmit_skb() o el slow path de ip_finish_output_gso() — el skb llega a skb_segment(), cuyo recorrido de frag_list asume entrada con forma GRO. El resultado es uno de sus BUG_ON().

El mensaje exacto capturado en el reproducer:

kernel BUG at net/core/skbuff.c:4899!
Oops: invalid opcode: 0000 [#1] SMP KASAN NOPTI
CPU: 0 UID: 1000 PID: 82 Comm: poc Not tainted 7.2.0-pentest+ #2
RIP: 0010:skb_segment+0x20ca/0x48b0
Call Trace:
<TASK>
__udp_gso_segment+0x29a/0x27d0
udp4_ufo_fragment+0x458/0x6c0
inet_gso_segment+0x429/0x1340
skb_mac_gso_segment+0x233/0x4f0
__skb_gso_segment+0x308/0x660
udp_queue_rcv_skb+0x440/0xad0
udp_unicast_rcv_skb+0xc7/0x2c0
udp_rcv+0x16ce/0x2260
ip_protocol_deliver_rcu+0x197/0x2d0
ip_local_deliver+0x430/0x690
ip_rcv+0x16f/0x1f0
__netif_receive_skb_one_core+0x15e/0x1c0
__netif_receive_skb+0x1e/0x110
netif_receive_skb+0xf6/0x5c0
tun_rx_batched.isra.0+0x3ab/0x790
tun_get_user+0x17c3/0x3550
tun_chr_write_iter+0xba/0x1b0
vfs_write+0x646/0x1130
</TASK>
Kernel panic - not syncing: Fatal exception in interrupt

Como corre con BH deshabilitado, no es un oops recuperable: es kernel panic directo y, en la mayoría de configuraciones, reinicio forzado del host.

Quién puede explotarlo

Hay tres caminos confirmados por el parche:

  1. Usuario sin privilegios en su propio userns, escribiendo dos veces a un dispositivo tun/tap que él mismo creó. Es el caso más alarmante para servidores multi-tenant y para cualquier workstation donde un usuario local no root pueda crear interfaces tun.

  2. Proceso con CAP_NET_RAW dentro de un network namespace donde haya un punto de defragmentación antes de un punto de GSO (típico en configuraciones con nf_conntrack + forwarding).

  3. Guest en una VM cuyo VMM reenvía virtio_net_hdr a un tap del host. El atacante no necesita entonces ni tun en el host: basta con el guest.

El requisito común es que la fuente del fragmento pueda adjuntar la cabecera virtio: tun/tap, AF_PACKET con PACKET_VNET_HDR, o un VMM que forwarde esa cabecera.

Por qué los parches previos no lo cubrían

Los commits 3dcbdb134f32 (“net: gso: Fix skb_segment splat when splitting gso_size mangled skb having linear-headed frag_list”) y 9e4b7a99a03a (“net: gso: fix panic on frag_list with mixed head alloc types”) añadieron comprobaciones SKB_GSO_DODGY en frag_list, pero con dos vacíos:

  • Cabezas con backing en páginas se saltan esas comprobaciones.

  • Cabezas con backing en kmalloc se saltan la comprobación cuando gso_size == skb_headlen(head), valor que controla el emisor.

Por eso un fragmento con gso_size elegido por el atacante esquiva las defensas actuales. El fix correcto no es parchear skb_segment(), sino impedir que el fragmento entre con estado GSO a la cola, en inet_frag_queue_insert().

El parche y las versiones afectadas

El fix resetea gso_size, gso_type y gso_segs en cada fragmento al encolarlo, justo antes de que IPv4, IPv6, nf_conntrack_reasm y 6lowpan lo procesen. Como el camino de reensamblado es compartido, un solo parche cubre los cuatro. La cabeza del skb reensamblado puede seguir con CHECKSUM_PARTIAL; eso ya estaba aceptado en recepción y lo resuelve skb_checksum_help() en ip_do_fragment() / ip6_fragment() al reenviar.

La vulnerabilidad se introdujo con el commit f43798c27684 (“tun: Allow GSO using virtio_net_hdr”), el primero que dejó que espacio de usuario adjuntara metadatos GSO a un fragmento IP. Cualquier kernel posterior a ese commit es vulnerable hasta aplicar el fix de su rama stable.

Versiones stable con corrección publicadas simultáneamente:

Rama stable Versión con fix
5.10 5.10.268
5.15 5.15.219
6.1 6.1.186
6.6 6.6.155
6.12 6.12.107
6.18 6.18.48
7.1 7.1.12
7.2 7.2.2

Las correcciones viven en commits cfdbc8c2e6f9, 29dda278a5ed, 14a8f3e10fa9, 3edf721bb4b9, dec2edb7aaf1, c49f04e8d2b9, 69b73b74d9eb, da857e448322 y d5dc1e69fd72 del árbol stable en git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git.

Distribuciones ya actualizadas o en camino, según los avisos publicados:

  • Debian: advisory contra el paquete linux, publicado el 30 de agosto (security-tracker).

  • openSUSE Tumbleweed: openSUSE-SU-2026:11648-1 moderate, ya con kernel-devel 7.2.2.

  • Fedora 44: kernel 2026-92c9a5d8bc con la 7.1.12 stable.

  • Red Hat Enterprise Linux 6/7/8/9/10: listadas como Affected en el portal; RHEL 6 aún bajo investigación, el resto con errata en preparación.

Cómo saber si tu kernel es vulnerable

Comprueba la versión exacta que tienes corriendo:

uname -r

Y compárala con la columna de la tabla anterior. En sistemas Debian y derivados, también puedes cruzar con el tracker oficial:

sudo apt list --installed linux-image-$(uname -r)
apt changelog linux-image-$(uname -r) | grep -i 80590

Si uname -r muestra una versión anterior a la fijada para tu rama, el sistema es vulnerable.

Mitigación inmediata antes del reinicio

Si tienes hosts en producción que aún no pueden reiniciar con un kernel nuevo, las opciones son limitadas porque el vector necesita acceso a un tun/tap. Las dos mitigaciones prácticas:

  1. Bloquear la creación de interfaces tun/tap a usuarios no privilegiados. Carga el módulo tun solo bajo demanda restringida, o aplica la regla de udev que limite los permisos del dispositivo:
    bash
    cat > /etc/udev/rules.d/99-disable-tun.rules <<'EOF'
    KERNEL=="tun", SUBSYSTEM=="net", GROUP="netdev", MODE="0660"
    EOF
    sudo udevadm control --reload

    Asegúrate de que los usuarios legítimos que necesitan tun (VPN personal, WireGuard) estén en el grupo netdev.

  2. Desactivar el reensamblado en netfilter donde no sea estrictamente necesario. El bug solo es exploitable si hay un punto de defragmentación antes de un punto de GSO; eliminar uno de los dos rompe la cadena:
    bash
    sudo iptables -t raw -I PREROUTING -j NOTRACK

    NOTRACK evita que nf_conntrack defragmente. Tiene impacto en el stateful firewall, así que evalúa antes de aplicar en producción.

Estas mitigaciones no sustituyen al parche: solo reducen las superficies de ataque más comunes.

Pasos de actualización

En Ubuntu/Debian con unattended-upgrades correctamente configurado, el kernel nuevo entra en la siguiente ventana de seguridad. Para forzar la actualización ahora:

sudo apt update
sudo apt list --upgradable | grep linux-image
sudo apt install --only-upgrade linux-image-generic linux-headers-generic
sudo reboot

En RHEL y derivados:

sudo dnf update kernel
sudo reboot

En Fedora:

sudo dnf upgrade kernel
sudo reboot

Tras el reinicio, vuelve a ejecutar uname -r y confirma que la versión está en la lista de fijados.

Qué vigilar en logs post-actualización

Si sospechas que alguien intentó explotar la vulnerabilidad antes del parche, busca las firmas en dmesg o en /var/log/kern.log:

sudo dmesg | grep -E "skb_segment|net/core/skbuff.c|inet_frag|GSO_DODGY"
sudo journalctl -k --since "30 days ago" | grep -i "kernel BUG"

El patrón de la vulnerabilidad es muy específico (net/core/skbuff.c:4899 y call trace con tun_chr_write_iter o tun_get_user cerca del final). Cualquier reproducción aparecerá con esa huella.

Resumen

CVE-2026-80590 es un kernel panic local de gravedad alta, fácil de provocar para cualquier usuario con acceso a un tun/tap, y con dos rutas adicionales desde VMs y namespaces con netfilter. El parche ya está en las ocho ramas stable; lo que toca ahora es desplegarlo. Si gestionas hosts multi-tenant o VMs que exponen virtio hacia el host, prioriza esa actualización antes que el resto del lote de paquetes de septiembre.

Preguntas frecuentes

¿Por qué CVE-2026-80590: kernel panic en reensamblado de fragmentos IPv4/IPv6 con estado GSO es relevante para sysadmins Linux?

Forma parte del flujo diario de administración. Los conceptos explicados se aplican directamente a servidores en producción y resuelven problemas reales que enfrentan sysadmins hispanohablantes.

¿Qué necesito para empezar con CVE-2026-80590: kernel panic en reensamblado?

Distribución Linux actualizada (Debian, Ubuntu, RHEL, Fedora o Arch), acceso root, y conexión a internet. Para producción: entorno de staging separado antes de aplicar cambios.

¿Cuáles son los errores más comunes con CVE-2026-80590: kernel panic en reensamblado?

Los tres más frecuentes: (1) saltar la lectura de logs, (2) aplicar cambios directos en producción sin probar, (3) olvidar permisos y ownership. La documentación y un plan de rollback siempre.

¿Cuándo usar CVE-2026-80590: kernel panic en reensamblado y cuándo una alternativa?

Esta solución es ideal para el caso descrito. Alternativas como Docker, Ansible o configuración manual pueden ser mejores según contexto: portabilidad, escala y reproducibilidad son los factores clave.

¿Cómo migro desde una configuración previa a CVE-2026-80590: kernel panic en reensamblado?

Documentar el estado actual, probar la nueva configuración en staging, validar funcionalmente, y aplicar en producción con rollback plan listo. Los posts de SoyLinux incluyen troubleshooting para los problemas más comunes.

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]

2 thoughts on “CVE-2026-80590: kernel panic en reensamblado de fragmentos IPv4/IPv6 con estado GSO”

Deja una respuesta

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