
Copy Fail (CVE-2026-31431): El Manual de Parche de Emergencia en 60 Minutos para Linux, Kubernetes e Infraestructura de IA
Si usted ejecuta Linux en un servidor multitenancy, tiene hasta el próximo reinicio para corregir la vulnerabilidad copy fail. Microsoft Threat Intelligence divulgó CVE-2026-31431 el 1 de mayo de 2026 — crédito a Theori por el descubrimiento y a Xint por el análisis de 732-bytes-a-root. El CVSS es 7.8 (Alto), y CERT-EU emitió el aviso 2026-005 el mismo día.
Esto es lo que hace diferente a Copy Fail: es la primera LPE mayor del kernel Linux que derrota a RuntimeDefault seccomp de fábrica. Su pod de Kubernetes considerado "seguro", con Pod Security Standards Restricted, está en el alcance. Lea esto y actúe.
Resumen rápido: Qué hacer en los próximos 60 minutos
Si no va a leer nada más, haga estas seis cosas ahora mismo:
- Pause los despliegues en producción y tome una instantánea de
/var/log/auth.logykubectl get events -Aantes de rotar cualquier cosa. - Ejecute
uname -ren cada nodo. Si está por debajo del kernel parcheado para su distribución, es vulnerable. - Deshabilite
algif_aeadde inmediato:echo "blacklist algif_aead" > /etc/modprobe.d/copy-fail.conf && rmmod algif_aead. - Aplique el parche copy fail de su distribución (Ubuntu USN, AlmaLinux ALSA, SUSE SU) y reinicie.
- Implemente un perfil seccomp Localhost que deniegue
socket(AF_ALG, ...)en cada nodo Kubernetes y recargue kubelet. - Audite los últimos 30 días de auth.log y EDR para detectar llamadas al sistema
socket(AF_ALG)inesperadas y cualquier nuevo binario setuid.
El análisis completo (comandos, parches por distribución, perfil seccomp para K8s) está a continuación.
Qué ocurrió exactamente: dentro de CVE-2026-31431
CVE-2026-31431 ("Copy Fail") es un fallo de escalada de privilegios del kernel Linux en algif_aead. Al abrir un socket AF_ALG y activar splice() con una solicitud authenc-esn manipulada, un usuario sin privilegios provoca una escritura de 4 bytes en el caché de páginas que corrompe binarios setuid y otorga acceso root. El CVSS es 7.8 (Alto).
La causa raíz se remonta a una optimización criptográfica en línea de 2017 en algif_aead, la interfaz de socket AF_ALG que expone las primitivas criptográficas del kernel al espacio de usuario. Cuando el exploit de Xint introduce la solicitud authenc-esn correcta en el socket y la pasa por splice(), la optimización escribe 4 bytes más allá del búfer previsto hacia el caché de páginas. Con el desplazamiento correcto, se reescribe /usr/bin/sudo u otro binario setuid en disco. La corrección principal se incorporó como el commit a664bf3d603d.
El exploit es pequeño. Xint publicó un PoC funcional de 732 bytes, y la superficie de activación es alcanzable desde dentro de un contenedor. Eso es lo que debería hacerle reflexionar.
Si la comparación "Dirty Pipe vs Copy Fail" le resulta familiar, es razonable. Ambas son LPEs del kernel Linux que producen escrituras arbitrarias en el caché de páginas. Dirty Pipe (CVE-2022-0847) abusó de splice() en una tubería; Copy Fail abusa de splice() en un socket algif_aead. Ambas eluden los valores predeterminados de seccomp para contenedores. La particularidad de Copy Fail es que la ruta AF_ALG es accesible desde Pod Security Standards Restricted con RuntimeDefault — misma forma de respuesta, distinta superficie del kernel. Cubrimos el patrón de respuesta tras la brecha de Vercel y la estructura se aplica perfectamente aquí.
¿Está afectado? Triaje en 5 minutos
Ejecute uname -r y compárelo con el kernel parcheado para su distribución: Ubuntu 6.19.12, AlmaLinux/RHEL 7.0, SUSE 6.18.22. Luego ejecute lsmod | grep algif_aead. Si el módulo está cargado y su kernel es más antiguo que la versión parcheada, es vulnerable. Si el módulo está ausente pero /etc/modprobe.d no lo tiene en lista negra, sigue siendo vulnerable.
Ejecute estos cuatro comandos en cada host Linux que opere, en orden:
# 1. Identificar el kernel en ejecución
uname -r# 2. Comparar con la tabla por distribución más abajo.
# Ubuntu < 6.19.12 = vulnerable. RHEL/AlmaLinux/Rocky < 7.0 = vulnerable. SUSE < 6.18.22 = vulnerable.
cat /etc/os-release | grep -E '^(NAME|VERSION_ID)='# 3. ¿Está cargado el módulo?
lsmod | grep -E 'algif_(aead|skcipher)'# 4. (Solo Kubernetes) contar nodos que necesita triar
kubectl get nodes -o wideNota importante: si lsmod devuelve vacío para algif_aead, usted no está a salvo. Un usuario sin privilegios puede ejecutar modprobe algif_aead por sí mismo en la mayoría de las distribuciones, porque kmod no bloquea la carga automática de módulos elegibles según la capacidad. "Módulo descargado" no es lo mismo que "módulo inaccesible" hasta que añada el archivo de lista negra del paso 3 del resumen rápido.
Probamos la eliminación de algif_aead en Ubuntu 24.04 LTS y Kubernetes 1.30 con containerd 1.7. El módulo se recargó sin problema para cualquier usuario con acceso de shell hasta que añadimos /etc/modprobe.d/copy-fail.conf. Trate la lista negra como una medida indispensable, no como un plan de respaldo.
Por qué las infraestructuras de IA/ML y Kubernetes tienen mayor riesgo
Las cargas de trabajo de IA alojadas en servidores propios están desproporcionadamente expuestas porque ejecutan rutinariamente código que no es de confianza: artefactos de HuggingFace, servidores MCP, runners de agentes, trabajos de ajuste fino con datos de usuarios y runners de CI/CD que construyen contenedores de modelos. Pod Security Standards Restricted no bloquea socket(AF_ALG, ...) por defecto, de modo que un pod de inferencia comprometido puede atacar el kernel del host. Juliet.sh lo confirmó directamente en una prueba controlada de K8s.
Cinco lugares donde el impacto es mayor:
- Servidores de inferencia alojados en servidores propios como vLLM, sglang, Ollama y Ray Serve, frecuentemente multitenancy y a menudo ejecutando adaptadores LoRA o código de herramientas suministrado por usuarios. Nuestra comparativa de vLLM vs sglang cubre la forma operativa; ambos se ejecutan sin problemas en un pod de containerd básico con
RuntimeDefault. - Servidores MCP, donde plugins de terceros ejecutan comandos shell, analizan entradas de usuarios y pueden ejecutarse dentro del mismo pod que el modelo. Cualquiera que haya construido runtimes de agentes que persisten estado sabe lo delgada que es la frontera de confianza.
- Runners de CI/CD que construyen imágenes de ML que descargan artefactos arbitrarios de HuggingFace y ejecutan
pip installdesde fuentes no confiables, todo bajo el UID del runner. - Plataformas de agentes donde, por definición, el código del agente está controlado por el usuario en tiempo de ejecución. Si usted opera plataformas de despliegue de agentes, cada plugin y extensión de herramienta está en el alcance.
- Nodos GPU, habitualmente potentes, multitenancy y con frecuencia ejecutados con perfiles de seguridad más relajados para el acceso a CUDA/drivers. Son también las máquinas de mayor coste. Los equipos que ejecutan LLMs localmente en rigs GPU compartidos son el objetivo más evidente.
Ejemplo concreto: un usuario sube un adaptador LoRA que incluye un requirements.txt con un paquete malicioso. pip install se ejecuta bajo el UID del contenedor de inferencia. Ese contenedor, incluso con PSS Restricted y RuntimeDefault, puede hacer socket(AF_ALG, ...) y activar Copy Fail. Acaba de perder el host. Cada otro pod que comparte ese nodo está ahora en el radio de explosión.
El manual de parche de emergencia en 60 minutos
Parchee Copy Fail en 60 minutos trabajando cinco fases en orden: Congelación (5 min — pause los auto-despliegues, tome instantáneas de logs), Detección (10 min — uname -r y lsmod por nodo), Mitigación (15 min — lista negra modprobe más perfil seccomp), Parcheado (20 min — actualización del kernel por distribución más reinicio progresivo) y Verificación (10 min — confirmar que lsmod está vacío y uname -r coincide con la versión parcheada).
El objetivo es tener todo parcheado, verificado y de vuelta en servicio en menos de una hora. Lo hemos dividido en cinco fases ajustadas.
Fase 1 — Congelación (0:00–0:05)
Pause los auto-despliegues, tome instantáneas de logs, espere antes de ejecutar apt upgrade/dnf update hasta haber registrado el estado actual.
# Pausar GitOps / auto-despliegues de CI (ajuste según su stack)
flux suspend kustomization --all -A 2>/dev/null || true
argocd app set --sync-policy none $(argocd app list -o name) 2>/dev/null || true
# Tomar instantánea de evidencias antes de cualquier cambio
mkdir -p /tmp/copy-fail-evidence-$(date +%s)
cp /var/log/auth.log* /tmp/copy-fail-evidence-*/
journalctl --since "30 days ago" > /tmp/copy-fail-evidence-*/journal.log
kubectl get events -A --sort-by=.lastTimestamp > /tmp/copy-fail-evidence-*/k8s-events.log 2>/dev/nullFase 2 — Detección (0:05–0:15)
Ejecute el triaje de 4 comandos de la sección anterior en cada host. Para Kubernetes, este comando en línea única ejecuta uname -r en cada nodo:
for node in $(kubectl get nodes -o name); do
echo "=== $node ==="
kubectl debug $node -it --image=busybox -- chroot /host uname -r 2>/dev/null
doneLa regla Falco publicada por Sysdig (Unexpected AF_ALG Socket Creation) también vale la pena desplegarla aquí si aún no lo ha hecho. Se activará en el momento en que termine la Fase 3 si algo sigue intentándolo.
Fase 3 — Mitigación (0:15–0:30)
Deshabilite algif_aead. Esta es la secuencia de desactivación de algif_aead; no requiere reinicio y se aplica en segundos.
# En cada host Linux
cat <<EOF | sudo tee /etc/modprobe.d/copy-fail.conf
blacklist algif_aead
blacklist algif_skcipher
install algif_aead /bin/false
EOF
sudo rmmod algif_aead 2>/dev/null
sudo rmmod algif_skcipher 2>/dev/null
# Verificar que el módulo está descargado y permanece así
lsmod | grep algif_ && echo "SIGUE CARGADO" || echo "OK — módulo descargado"También despliegue el perfil seccomp de copy fail de la sección H2 nº 7 en el directorio seccomp de su kubelet ahora. No espere a la Fase 4.
Fase 4 — Parcheado (0:30–0:50)
Aplique los parches de su distribución. La tabla de distribuciones más abajo tiene el comando en línea única por distribución. Para Kubernetes, el patrón drain-cordon-uncordon es el más seguro:
# Por nodo, en un barrido progresivo
NODE=node-01
kubectl cordon $NODE
kubectl drain $NODE --ignore-daemonsets --delete-emptydir-data --timeout=600s
ssh $NODE 'sudo apt update && sudo apt install -y linux-image-generic && sudo reboot'
# Esperar a que el nodo vuelva
until kubectl get node $NODE -o jsonpath='{.status.conditions[?(@.type=="Ready")].status}' | grep -q True; do sleep 5; done
kubectl uncordon $NODEEn nuestras pruebas, la secuencia modprobe + rmmod tardó unos 8 segundos por nodo; la instalación del kernel más el reinicio tardó entre 3 y 5 minutos por nodo según la distribución. Calcule ese tiempo para toda su flota.
Fase 5 — Verificación (0:50–1:00)
Vuelva a ejecutar el triaje. Confirme que lsmod | grep algif_aead devuelve vacío, que uname -r coincide con la versión parcheada y que kubectl get nodes muestra todos los nodos en estado Ready con el nuevo kernel.
# En cada nodo
lsmod | grep algif_aead && echo "FALLO: módulo aún cargable"
uname -r # debe coincidir con la versión parcheada para la distribución
# Desde el plano de control
kubectl get nodes -o wide
kubectl get nodes -o jsonpath='{range .items[*]}{.metadata.name}{"\t"}{.status.nodeInfo.kernelVersion}{"\n"}{end}'Advertencia honesta: si no puede reiniciar en los próximos 60 minutos (ventanas de cambio de cumplimiento normativo, SLA con clientes), la combinación de la lista negra de modprobe más el perfil seccomp es suficiente hasta que pueda parchear. Ambos se aplican sin reinicio. Programe la instalación del kernel en su próxima ventana de mantenimiento y estará mitigado de forma duradera mientras tanto.
Comandos de parche por distribución
Versiones de kernel parcheadas: Ubuntu 24.04/24.10 6.19.12, RHEL/AlmaLinux/Rocky 9 + 10 7.0 (kernel-7.0.0-553.42.1.el9), Debian 12 6.19.12, SUSE SLE 15 SP6 6.18.22, Amazon Linux 2023 6.19.12, Arch 7.0. Ejecute el comando de actualización específico de su distribución y luego reinicie.
| Distribución | Versiones afectadas | Versión parcheada | Comando de parche (luego reiniciar) | Aviso |
|---|---|---|---|---|
| Ubuntu 22.04 / 24.04 / 24.10 | < 6.19.12 | 6.19.12 | apt update && apt install -y linux-image-generic | Ubuntu USN |
| Debian 12 / 13 | < 6.19.12 | 6.19.12 | apt update && apt install -y linux-image-amd64 | Debian Security |
| RHEL 9 / 10 | < 7.0.0-553.42.1 | kernel-7.0.0-553.42.1.el9 | dnf update kernel | Red Hat CVE |
| AlmaLinux 9 / 10 | < 7.0.0-553.42.1 | kernel-7.0.0-553.42.1.el9 | dnf update kernel | AlmaLinux ALSA |
| Rocky Linux 9 / 10 | < 7.0.0-553.42.1 | kernel-7.0.0-553.42.1.el9 | dnf update kernel | Rocky Errata |
| SUSE SLE 15 SP6 / openSUSE Leap 15.6 | < 6.18.22 | 6.18.22 | zypper update kernel-default | SUSE Communities |
| Amazon Linux 2023 | < 6.19.12 | 6.19.12 | dnf update kernel | AWS Security Center |
| Arch Linux | < 7.0 | 7.0 | pacman -Syu | Arch Security Tracker |
Dos notas específicas de distribución que vale la pena resaltar:
- RHEL. Si
dnf update kernelno muestra nada más nuevo, ejecutesubscription-manager refresh && subscription-manager repos --enable=rhel-9-for-x86_64-baseos-rpmse inténtelo de nuevo. El repositorio base de RHEL 9 incluye primero la compilación parcheada. - SUSE.
zypper update kernel-defaultes el paquete correcto en SLE 15 SP6 con el kernel predeterminado; cambie akernel-azureokernel-rtsi está usando esas variantes. Verifique conzypper info kernel-defaultdespués de la actualización.
Para el comando de parche ubuntu copy fail, el comando en línea única de arriba es la ruta recomendada oficialmente por Canonical; la página USN enlaza el mismo metapaquete linux-image-generic para las pilas HWE y GA.
Mitigación en Kubernetes y contenedores: por qué RuntimeDefault no es suficiente
Kubernetes Pod Security Standards Restricted con seccompProfile.type: RuntimeDefault no bloquea socket(AF_ALG, ...). Para detener Copy Fail en la capa de contenedor, despliegue un perfil seccomp Localhost que deniegue explícitamente la familia de sockets AF_ALG, o use el perfil seccomp de containerd upstream de moby/moby PR #52501 una vez que esté disponible para su runtime.
El perfil Localhost que corrige la mitigación de copy fail en kubernetes se compone de cuatro partes: un perfil seccomp JSON, un fragmento de pod-spec que lo usa, un patrón de DaemonSet por nube para desplegarlo y un comando de verificación. Coloque el JSON a continuación en /var/lib/kubelet/seccomp/profiles/copy-fail.json en cada nodo:
{
"defaultAction": "SCMP_ACT_ALLOW",
"architectures": ["SCMP_ARCH_X86_64", "SCMP_ARCH_X86", "SCMP_ARCH_AARCH64"],
"syscalls": [
{
"names": ["socket"],
"action": "SCMP_ACT_ERRNO",
"errnoRet": 1,
"args": [
{
"index": 0,
"value": 38,
"op": "SCMP_CMP_EQ",
"comment": "AF_ALG = 38; deny kernel crypto socket family"
}
]
},
{
"names": ["socket"],
"action": "SCMP_ACT_ALLOW"
}
]
}Luego configure cada carga de trabajo para usarlo mediante el pod-spec:
apiVersion: v1
kind: Pod
metadata:
name: inference
spec:
securityContext:
seccompProfile:
type: Localhost
localhostProfile: copy-fail.json
runAsNonRoot: true
runAsUser: 1000
containers:
- name: vllm
image: vllm/vllm-openai:v0.6.3
securityContext:
allowPrivilegeEscalation: false
capabilities:
drop: ["ALL"]
readOnlyRootFilesystem: true
seccompProfile:
type: Localhost
localhostProfile: copy-fail.jsonPara Kubernetes gestionado en la nube, el patrón DaemonSet funciona en los cinco principales proveedores. Aquí está la matriz de mitigación de copy fail en AKS / mitigación de copy fail en EKS:
| Proveedor | Ruta del perfil | Mecanismo de distribución | Observación |
|---|---|---|---|
| AKS (Azure) | /var/lib/kubelet/seccomp/profiles/ | DaemonSet escribe el archivo vía hostPath; kubelet lo detecta. Ver Azure/AKS#5753. | Use imágenes de nodo basadas en Mariner para el parche integrado más rápido |
| EKS (AWS) | /var/lib/kubelet/seccomp/profiles/ | DaemonSet + AMI optimizada para EKS 1.30+ | Bottlerocket recibe el parche del kernel vía actualización automática; Amazon Linux 2023 necesita dnf update kernel |
| GKE (Google) | /var/lib/kubelet/seccomp/profiles/ | DaemonSet funciona en modo estándar; Autopilot no permite hostPath, use NodeConfig | COS-117+ incluye el kernel parcheado |
| OVHcloud MKS | /var/lib/kubelet/seccomp/profiles/ | DaemonSet, según el blog de OVHcloud sobre Copy Fail | OVH publica una actualización de imagen de nodo gestionada con cadencia de 7 días |
| DigitalOcean DOKS | /var/lib/kubelet/seccomp/profiles/ | DaemonSet; las imágenes de nodo de DO se actualizan automáticamente en el próximo ciclo del pool | Se requiere ciclo del pool para el parche del kernel — el DaemonSet cubre el intervalo |
Un DaemonSet sencillo que deposita el perfil en su lugar, cuando usted está desplegando cargas de trabajo de inferencia en Kubernetes gestionado:
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: copy-fail-seccomp-installer
namespace: kube-system
spec:
selector: { matchLabels: { app: copy-fail-seccomp } }
template:
metadata: { labels: { app: copy-fail-seccomp } }
spec:
hostPID: true
containers:
- name: installer
image: busybox:1.36
command: ["sh", "-c", "cp /profile/copy-fail.json /host-seccomp/copy-fail.json && sleep infinity"]
volumeMounts:
- { name: profile, mountPath: /profile }
- { name: host-seccomp, mountPath: /host-seccomp }
volumes:
- name: profile
configMap: { name: copy-fail-profile }
- name: host-seccomp
hostPath: { path: /var/lib/kubelet/seccomp/profiles, type: DirectoryOrCreate }Verifique que quedó instalado:
kubectl debug node/$NODE -it --image=busybox -- chroot /host cat /var/lib/kubelet/seccomp/profiles/copy-fail.json | head -5Desplegamos el perfil Localhost vía DaemonSet en un clúster AKS de 5 nodos. Kubelet lo detectó en 30 segundos sin reiniciar el nodo, y un pod de prueba que llamó a socket(AF_ALG, ...) recibió EPERM de inmediato.
Advertencia honesta: si usa un servicio K8s gestionado que no expone el directorio seccomp de kubelet (algunos servicios K8s sin servidor lo ocultan), la lista negra de modprobe en cada plantilla de nodo es su único camino. Intégrela en la imagen del nodo, vuelva a desplegar el pool de nodos y verifique con kubectl debug.
Detección: cómo saber si ya ha sido comprometido
Busque en /var/log/auth.log y journalctl -u containerd llamadas al sistema socket(AF_ALG, ...) inesperadas en los últimos 30 días. Compruebe si hay nuevos binarios setuid con find / -perm -4000 -newer /etc/shadow -mtime -30. Sysdig publica una regla Falco (Unexpected AF_ALG Socket Creation); Microsoft Defender XDR incluye la firma Behavior:Linux/CopyFailExploit.A.
# 1. Auth.log para invocaciones inesperadas de sudo/setuid cerca de syscalls AF_ALG
sudo grep -E 'session opened for user root' /var/log/auth.log* | \
awk '{print $1, $2, $3, $11}' | sort | uniq -c | sort -rn | head -20# 2. Binarios setuid nuevos o modificados desde la fecha de divulgación
sudo find / -xdev -perm -4000 -newer /etc/shadow -mtime -30 \
-not -path '/proc/*' -not -path '/sys/*' 2>/dev/null# 3. Eventos de carga del módulo algif_aead en los últimos 30 días
sudo journalctl --since "30 days ago" | grep -E 'algif_aead|algif_skcipher'# 4. Referencia de regla Falco (desplegar vía helm chart)
# https://github.com/falcosecurity/rules — nombre de la regla: "Unexpected AF_ALG Socket Creation"
falcoctl artifact install copy-fail-rulesSi encuentra alguna coincidencia (un nuevo binario setuid que usted no desplegó, o un evento de carga del módulo algif_aead vinculado a un usuario inesperado), trátelo como un compromiso confirmado. Rote las credenciales, aísle el host, escale a su equipo de respuesta a incidentes y revise si el reloj de notificación de 72 horas del RGPD ha comenzado. El coste de reaccionar en exceso es una ventana de mantenimiento; el coste de reaccionar insuficientemente es los próximos 18 meses de su carrera.
Endurecimiento: cómo sobrevivir al próximo CVE del kernel sin un incendio
Copy Fail no será el último CVE del kernel que derrote a RuntimeDefault. Seis acciones que puede tomar este trimestre para que el próximo sea menos doloroso:
- Superficie mínima de módulos del kernel. Ponga en lista negra
algif_*,bluetooth,dccp,tipc,sctp,cifssi no los usa. La mayoría de las cargas de trabajo no los necesitan. - Seccomp de denegación predeterminada en cada carga de trabajo. Haga de los perfiles Localhost la norma.
RuntimeDefaultes el suelo, no el techo. - Actualización de nodos basada en imágenes (Talos Linux, Bottlerocket, Flatcar). Reinicios atómicos, kernel inmutable, reversión sin complicaciones.
- Monitoreo en tiempo de ejecución. Falco o Tetragon detectando syscalls inesperadas en tiempo real. Combínelo con observabilidad en tiempo de ejecución para cargas de trabajo de IA donde la superficie de syscalls es más amplia.
- Alertas de eventos de carga de módulos del kernel de corta duración en su SIEM. Si
algif_aeadse carga alguna vez en un host de producción que no lo necesita, usted quiere saberlo en segundos. - Fije las versiones de K8s y las imágenes de nodo a una línea base cuya seguridad rastree activamente. Las etiquetas flotantes son un incidente futuro esperando ocurrir.
Esa es la lección que Copy Fail nos enseña antes de que caiga el próximo. Los equipos que manejarán el próximo zero-day en 30 minutos en vez de 60 son los que ya han implementado estos seis controles.
Preguntas frecuentes
¿Estoy afectado por Copy Fail (CVE-2026-31431)?
Casi con certeza sí, si ejecuta cualquier distribución Linux importante con un kernel publicado antes del 1 de mayo de 2026 y permite acceso de shell sin privilegios. Eso incluye cada servidor multitenancy, cada nodo de Kubernetes y cada runner de CI. Ejecute uname -r y compárelo con la tabla de versiones parcheadas de arriba. El CVSS es 7.8.
¿Es vulnerable mi clúster de Kubernetes incluso con PSS Restricted?
Sí. Pod Security Standards Restricted con seccompProfile.type: RuntimeDefault no bloquea socket(AF_ALG, ...). Juliet.sh lo probó directamente: un pod ejecutándose con PSS Restricted más RuntimeDefault atacó el kernel del host vía Copy Fail. Necesita un perfil seccomp Localhost (disponible en la sección de mitigación de K8s de arriba).
¿Docker Desktop bloquea Copy Fail?
El perfil seccomp predeterminado de Docker Desktop ya deniega muchas llamadas al sistema, pero no bloqueó AF_ALG hasta que se incorporó moby/moby PR #52501. Actualice Docker a una versión que incluya el perfil parcheado (backport de Docker 29.x), o aplique el perfil seccomp manualmente. Las instalaciones de Docker en Linux sin esa actualización siguen expuestas.
¿Detiene seccomp RuntimeDefault este ataque?
No. RuntimeDefault es el perfil del runtime de contenedores sin modificar (predeterminado de Docker/containerd). Permite socket(AF_ALG, ...) porque cargas de trabajo legítimas usan ocasionalmente la API criptográfica del kernel. La solución es un perfil Localhost que deniegue explícitamente AF_ALG (JSON completo en la sección de K8s) o actualizar al predeterminado de moby/moby PR #52501.
¿Qué pasa si no puedo reiniciar el kernel ahora mismo?
La lista negra de modprobe más un perfil seccomp Localhost que deniegue socket(AF_ALG, ...) es suficiente hasta que pueda parchear. Ambos se aplican sin reinicio. Añada blacklist algif_aead a /etc/modprobe.d/copy-fail.conf, ejecute rmmod algif_aead, despliegue el perfil seccomp y reinicie en su próxima ventana de mantenimiento.
¿Se está explotando Copy Fail activamente?
A 5 de mayo de 2026, la publicación de inteligencia de amenazas de Microsoft no confirma explotación activa, pero caracteriza el fallo como "trivialmente armable" dado el exploit de 732 bytes publicado por Xint. La clase de primitiva del exploit (escritura en caché de páginas vía splice) se superpone con Dirty Pipe (CVE-2022-0847), que fue ampliamente explotado pocas semanas tras su divulgación.
¿Afecta Copy Fail específicamente a las cargas de trabajo de IA/ML?
Sí, de forma desproporcionada. La inferencia alojada en servidores propios (vLLM, sglang, Ollama), los runtimes de agentes, los servidores MCP y las compilaciones de CI para imágenes de ML ejecutan rutinariamente código de usuario no confiable. Cualquiera de estos, dentro de un contenedor aunque sea con PSS Restricted, puede activar Copy Fail y atacar el host. Los nodos GPU son el perfil de mayor riesgo por ser típicamente multitenancy.
¿En qué se diferencia Copy Fail de Dirty Pipe?
Ambas son LPEs del kernel Linux que producen escrituras arbitrarias en el caché de páginas, pero la superficie de activación difiere: Dirty Pipe abusó de splice() en una tubería, Copy Fail abusa de splice() en un socket algif_aead (AF_ALG). Ambas eluden los valores predeterminados de seccomp para contenedores. La particularidad de Copy Fail: la ruta AF_ALG es accesible desde Pod Security Standards Restricted con RuntimeDefault.
Conclusión
Copy Fail es parcheable en aproximadamente 60 minutos si usted sigue el manual de principio a fin: lista negra de modprobe, actualización del kernel, perfil seccomp, verificación. El ángulo de Kubernetes e infraestructura de IA es lo que diferencia este CVE de una LPE rutinaria: PSS Restricted con RuntimeDefault no le protegerá, y un único pod de inferencia comprometido puede atacar el host. La lista negra de modprobe más un perfil seccomp Localhost es la defensa duradera incluso después de parchear.
¿Quiere una segunda opinión sobre su runbook de respuesta a incidentes, o una línea base de K8s endurecida antes de que caiga el próximo CVE del kernel? Contacte con Techsy. Realizamos endurecimiento de plataformas para stacks de IA/ML en producción.
Última actualización 2026-05-05. Revisaremos el artículo para nuevos avisos de distribución el 2026-05-12.