CopyFail, Dirty Frag y Fragnesia: El Kernel Page Cache LPE Trilogy
Desglose técnico de CopyFail, Dirty Frag y Fragnesia: cómo tres fallas de memoria de página-cache permitieron la escalada local de raíz no privatizada en el núcleo Linux.
En el lapso de dos semanas, tres vulnerabilidades locales de escalada de privilegios del kernel de Linux cayeron en una sucesión rápida — cada uno de los edificios en el último, cada uno trivialmente explotable de una cuenta de usuario no privatizada, y cada uno afecta esencialmente a cada distribución principal de Linux ejecutando un núcleo desde 2017 en adelante. CopyFail, Dirty Frag y Fragnesia explotan la misma superficie de ataque subyacente: el caché de página del núcleo. Si ejecuta hosts, contenedores compartidos de Linux, corredores de CI, o nodos de Kubernetes y no han parcheado, dejen de leer y vayan a hacerlo primero.
The Common Thread: Page Cache Corruption
El caché de página es la tienda de contenido de archivos del kernel. Cuando un programa lee un archivo, el núcleo lo carga en el caché de la página y hace referencias a esa copia caché. Cuando un binario setuid como /usr/bin/su ejecuta, el kernel mapea esas páginas en caché y las ejecuta con privilegios elevados. El modelo de seguridad depende de una suposición crítica: el caché de página refleja con precisión el contenido del archivo en el disco.
Si un usuario no privilegiado puede corromper las entradas de caché de página para un archivo que normalmente no pueden escribir a — un binario raíz setuid— pueden hacer que el núcleo ejecute código controlado por el atacante cuando ese binario corre, con los privilegios elevados de ese binario. Esta es la misma clase de ataque que Dirty Pipe (CVE-2022-0847) de 2022. El vector de ataque en los tres casos es siscalls de copia cero: splice(), sendfile(), vmsplice() — interfaces que mueven datos entre descriptores de archivos y tuberías sin copiar a través del espacio de usuario. Los errores son todos los fallos de validación de la propiedad en diferentes subsistemas del núcleo, permitiendo escrituras controladas en páginas que el atacante no debe poseer.
CopyFail — CVE-2026-31431
Sinopsis
Descanso: 29 de abril de 2026. Descubridor: Código X. CVSS: 7.8 HIGH. Vulnerable since: Linux 4.14 (2017). Módulo afectado: algif aead (AF ALG kernel Crypto API, aceleración de hardware AEAD).
El Bug
CopyFail abusa de la interfaz de toma AF ALG — la familia de socket Crypto API del kernel para operaciones criptográficas aceleradas por hardware. Cuando un usuario envía datos a una toma AF ALG AEAD a través de empalme(), el kernel adjunta páginas de la tubería del usuario a la lista interna de recolección de dispersión de la toma. El kernel llama a get page() a tomar una referencia a estas páginas pero no verifica que las páginas que se adjuntan sean realmente propiedad del callador.
Esto significa que un usuario puede empalmar páginas desde una entrada de caché de página de sólo lectura en el respaldo /usr/bin/su en el socket AF ALG. El oleoducto de procesamiento AEAD luego escribe la salida de la operación de nuevo en esas mismas páginas, corrompiéndolas. El resultado es un control de 4 bytes escribe primitivo en entradas de caché de página arbitrarias. Con escritos repetidos, un atacante sobrescribe el punto de entrada de un binario setuid en memoria sin tocar el archivo en disco. Las herramientas de monitoreo de integridad no ven nada porque el sistema de archivos no está modificado.
$ ./copyfail
[*] CVE-2026-31431 PoC (Copy Fail)
[*] /usr/bin/su entry @ file offset 0x78
[*] Patching page cache (40 bytes, 10 writes) ..........
[+] Executing /usr/bin/su
# id
uid=0(root) gid=1000(user) groups=1000(user)El PoC público es de 732 bytes de C. Corre en segundos en cada distribución principal. Ubuntu 22.04, 24.04, Debian 12, RHEL 8/9, Fedora, Arch, Alpine — todos vulnerables.
Mitigation
# Unload the vulnerable module immediately
sudo modprobe -r algif_aead
# Blacklist to prevent auto-loading across reboots
echo 'blacklist algif_aead' | sudo tee /etc/modprobe.d/copyfail.conf
sudo update-initramfs -u # Debian/Ubuntu
# sudo dracut --force # RHEL/Fedora
# If compromise is possible, drop page cache first
sudo sh -c 'sync && echo 3 > /proc/sys/vm/drop_caches'Frag sucia — CVE-2026-43284 y CVE-2026-43500
Sinopsis
Disclosed: 8 de mayo de 2026. Discoverer: Hyunwoo Kim (@v4bel). También conocido como CopyFail2 — inverso-ingeniered en parte del commit CopyFail fix. CVEs: CVE-2026-43284 (xfrm-ESP / IPsec) y CVE-2026-43500 (RxRPC). Módulos afectados: esp4, esp6, rxrpc.
Dos errores, dos caminos
Dirty Frag es una cadena de vulnerabilidad que combina dos páginas independientes escribe primitivos en diferentes subsistemas de redes.
CVE-2026-43284 vive en el subsistema xfrm-ESP — la implementación IPsec ESP del núcleo. Cuando la capa ESP procesa paquetes outbound, utiliza skb page frag refill() para asignar fragmentos de página para la carga útil. En condiciones específicas, el núcleo adjunta estos fragmentos a páginas que no posee exclusivamente. El cifrado subsecuente en el lugar escribe en esas páginas prestadas, que pueden ser entradas de página-caché que respaldan un archivo de destino.
CVE-2026-43500 vive en RxRPC — la implementación del protocolo RxRPC del sistema de archivos del kernel. La ruta de recepción tiene un defecto análogo donde los datos recibidos del paquete se escriben en fragmentos de página que pueden ser respaldados por página. La diferencia crítica: la ruta RxRPC no requiere un espacio de nombres de usuario no privilegiado, superando las restricciones de AppArmor no privilegiados userns presentes en Ubuntu 24.04. En los núcleos donde la trayectoria ESP está bloqueada por la política AppArmor, un atacante puede girar hacia RxRPC.
Que camino en qué canal
Ubuntu 22.04 (kernel 5.15): Camino ESP explotable. Carril RxRPC no aplicable (introducido en el núcleo 6.4). Ubuntu 24.04 (kernel 6.8): Ruta ESP bloqueada por AppArmor apparmor restrict unprivileged userns=1. El camino RxRPC pasa por esto y es explotable. Otras distribuciones: depende de la política AppArmor/SELinux y la versión del kernel.
# Check which path applies to your system
uname -r
sysctl kernel.apparmor_restrict_unprivileged_userns 2>/dev/null
lsmod | grep -E 'esp4|esp6|rxrpc'
# Mitigation: blacklist all three modules
cat << 'EOF' | sudo tee /etc/modprobe.d/dirtyfrag.conf
blacklist esp4
blacklist esp6
blacklist rxrpc
EOF
# Unload if not in active use
sudo modprobe -r rxrpc 2>/dev/null
# Note: do not unload esp4/esp6 if IPsec VPN is active
sudo update-initramfs -u && sudo rebootContainer and Kubernetes Impact
El caché de página se comparte a través del host y todos los contenedores. Un pod funcionando como UID 1000 puede escalar a raíz en el nodo Kubernetes. Las políticas de AppArmor que restringen los espacios de nombres de usuario a nivel de pod no impiden la explotación a través de la ruta RxRPC. Cada nodo necesita la lista negra aplicada a nivel de host, no dentro de contenedores.
Fragnesia — CVE-2026-46300
Sinopsis
Descubierto: 13 de mayo de 2026. Descubridor: William Bowling (Zellic.io / V12 Security), utilizando la auditoría de códigos con ayuda de AI. Módulo afectado: xfrm-ESP (igual que CVE-2026-43284). No hay parche de kernel en el momento de la divulgación — el embargo roto antes de la fijación estaba listo.
El parche que creó una nueva vulnerabilidad
La Fragnesia es la entrada más incómoda de esta familia. La fijación Dirty Frag para CVE-2026-43284 cambió cómo el subsistema ESP maneja el fragmento de página coalescing — específicamente, cómo skb try coalesce() combina fragmentos de página dispersos en un buffer de socket en memoria contigua. El cambio que fijó CVE-2026-43284 alteró la lógica del apego fragmentario de una manera que creó una nueva ventana donde fragmentos de página de un sk buff se adjuntan a otra sin la validación adecuada de la propiedad de página.
El resultado: otra página-cache escribe primitiva a través de la misma ruta de código xfrm-ESP, a través de un flujo de código diferente la solución original no se dirijó. Hyunwoo Kim, que descubrió Dirty Frag, confirmó que Fragnesia fue activada accidentalmente por el parche CVE-2026-43284. Bowling lo encontró analizando el compromiso de fijación con la herramienta de auditoría AI de Zellic — el modelo reconoció que el parche cambió la semántica de la propiedad de página de una manera que introdujo un nuevo primitivo.
El PoC publica sobreescritura /usr/bin/su a través de la caché de página y produce una cáscara de raíz. Debido a que Fragnesia vive en el mismo subsistema ESP/XFRM, la misma lista negra que mitiga el Fragmento Sucio también mitiga la Fragnesia — la lista negra esp4 y el esp6 detiene ambos.
La carrera del parche
Fragnesia fue revelada simultáneamente en GitHub y X en el momento en que la solución apareció en la lista de correo netdev — ningún embargo. Un exploit público de trabajo existía sin parche de kernel de corriente avanzada disponible. Las distribuciones tenían que enviar sus propios parches mientras la solución funcionaba a través de revisión. Esta es la nueva norma: los defensores y explotadores están operando en la misma línea de tiempo.
El problema estructural: Complejidad Cero-Copia
Las tres vulnerabilidades comparten una causa raíz estructural. El I/O de copia cero fue diseñado para el rendimiento: mover datos sin copiar a través del espacio de usuario es importante para el volumen de trabajo de alto rendimiento. Pero la copia cero significa que el núcleo permite referencias externas a sus estructuras internas de gestión de memoria, específicamente el caché de página. Cada lugar donde las interfaces de copia cero tocan la red o la pila de cripto es un sitio potencial para la confusión entre páginas de propiedad exclusiva y páginas con respaldo de página que los tres exploits confían en.
CopyFail encontró uno de estos sitios en AF ALG. Frag sucia encontró dos más en ESP y RxRPC. Fragnesia encontró que la solución para uno de ellos introdujo un tercio. El patrón es lo suficientemente consistente que las herramientas de auditoría asistidas por AI ahora pueden reconocerlo en código sin fixed, lo que significa que tanto los defensores como los atacantes pueden encontrar la siguiente instancia más rápido que antes.
Guía completa de rehabilitación
1. Patch First
# Debian/Ubuntu
sudo apt update && sudo apt upgrade linux-image-generic && sudo reboot
# RHEL / AlmaLinux / Rocky
sudo dnf update kernel && sudo reboot
# Arch Linux
sudo pacman -Syu linux && sudo reboot2. Módulo de lista negra (si el parche todavía no es posible)
# Block all vulnerable modules across all three CVEs
cat << 'EOF' | sudo tee /etc/modprobe.d/page-cache-lpe.conf
blacklist algif_aead
blacklist esp4
blacklist esp6
blacklist rxrpc
EOF
# Unload where possible
sudo modprobe -r algif_aead rxrpc 2>/dev/null
# Only unload esp4/esp6 if IPsec is not in active use
# Rebuild initramfs
sudo update-initramfs -u # Debian/Ubuntu
sudo dracut --force # RHEL/Fedora
sudo reboot3. Suelta el mapa de la página en Sistemas Potentially Compromised
# Force reload of all file data from disk
sudo sh -c 'sync && echo 3 > /proc/sys/vm/drop_caches'
# Verify critical binaries against package manager
# Debian/Ubuntu:
dpkg --verify
# RHEL/AlmaLinux:
rpm -Va4. Detector
# Monitor for AF_ALG socket creation (CopyFail indicator)
sudo auditctl -a always,exit -F arch=b64 -S socket -F a0=38 -k af_alg
# Monitor for splice() on suspicious fds
sudo auditctl -a always,exit -F arch=b64 -S splice -k splice_watch
# Check logs
sudo ausearch -k af_alg -ts today
sudo ausearch -k splice_watch -ts today5. Kubernetes and Container Clusters
Aplicar la lista negra de módulos y parches de kernel a nivel de nodo en cada nodo en cada grupo. El caché de página es anfitriona: las atenuaciones a nivel de contenedores no protegen el host u otros contenedores. Los servicios administrados (AKS, EKS, GKE) han mitigado estos CVEs a nivel de nodos, pero verifican sus versiones de imagen de nodo.
Risk Assessment by Environment
Riesgo más bajo: estaciones de trabajo de un solo usuario y servidores de un solo contenedor donde sólo el propietario tiene acceso a la concha. Estos requieren la ejecución de código local para explotar. Mayor riesgo: Linux compartido hosts con múltiples usuarios no confiados, clusters de contenedores y nodos Kubernetes, corredores de CI/CD y granjas de construcción donde se ejecuta código no confiable (esto incluye a los corredores auto hospedados GitHub Actions), infraestructura de SaaS en la nube en hosts multi-tenant compartidos, y cualquier host donde un atacante ya ha establecido acceso de baja privilegio a través de otro vector, cadena de suministro web, compromiso.
El paisaje de ataque de cadena de suministro que hemos estado cubriendo — TeamPCP, TanStack, el compromiso de Bitwarden CLI— representa exactamente este modelo de amenaza. Un atacante que gana una posición como un proceso no privilegiado en un oleoducto o contenedor CI ahora tiene un camino trivialmente fiable para arraigar en cualquier nodo sin parche. Estas tres vulnerabilidades no son riesgos teóricos para esos entornos. Tratarlos como corresponda.
Referencias
CopyFail: copy.fail TEN CVE-2026-31431 NVD TEN Ubuntu advisory TEN Microsoft MSRC. Dirty Frag: Wiz Análisis de la investigación ← Microsoft Security blog v4bel GitHub PoC ← Azure AKS issue #5753. Fragnesia: Análisis de TuxCare ← Ayuda Seguridad Net ← Zellic disclosure tención Wiz follow-up. Para los operadores de Kubernetes: el hilo de emisión de Azure AKS tiene el desglose de la versión por canal más detallado de los cuales se aplica el camino de explotación a qué distribución.