cybersecurity

Copy Fail (CVE-2026-31431) : Le Guide de Remédiation d'Urgence en 60 Minutes pour Linux, Kubernetes et l'IA

Écrit par Mert Batur
Mis à jour May 5, 2026
16 lecture
Copy Fail (CVE-2026-31431) : Le Guide de Remédiation d'Urgence en 60 Minutes pour Linux, Kubernetes et l'IA

Copy Fail (CVE-2026-31431) : Le Guide de Remédiation d'Urgence en 60 Minutes pour Linux, Kubernetes et l'IA

Si vous faites tourner Linux sur une machine multi-tenant, vous avez jusqu'au prochain redémarrage pour corriger la vulnérabilité Copy Fail. Microsoft Threat Intelligence a divulgué CVE-2026-31431 le 1er mai 2026 — crédit à Theori pour la découverte et à Xint pour l'analyse en 732 octets. Le score CVSS est de 7,8 (Élevé), et CERT-EU a publié l'avis 2026-005 le même jour.

Ce qui rend Copy Fail différent : c'est la première LPE Linux majeure qui contourne RuntimeDefault seccomp par défaut. Votre pod Kubernetes « sécurisé », avec Pod Security Standards Restricted, est dans la cible. Lisez ceci et agissez.

TL;DR : Ce Qu'il Faut Faire dans les 60 Prochaines Minutes

Si vous ne lisez qu'une chose, faites ces six actions maintenant :

  1. Suspendez les déploiements en production et prenez un instantané de /var/log/auth.log et kubectl get events -A avant de faire quoi que ce soit.
  2. Exécutez uname -r sur chaque nœud. Si vous êtes en dessous du noyau corrigé pour votre distribution, vous êtes vulnérable.
  3. Désactivez algif_aead immédiatement : echo "blacklist algif_aead" > /etc/modprobe.d/copy-fail.conf && rmmod algif_aead.
  4. Appliquez le patch Copy Fail de votre distribution (Ubuntu USN, AlmaLinux ALSA, SUSE SU) et redémarrez.
  5. Déployez un profil seccomp Localhost qui refuse socket(AF_ALG, ...) sur chaque nœud Kubernetes et rechargez kubelet.
  6. Auditez les 30 derniers jours d'auth.log et de votre EDR pour détecter tout appel système socket(AF_ALG) inattendu et tout nouveau binaire setuid.

L'analyse complète (commandes, patches par distribution, profil seccomp K8s) suit ci-dessous.

Ce Qui S'est Vraiment Passé : Anatomie de CVE-2026-31431

CVE-2026-31431 ("Copy Fail") est une faille d'élévation de privilèges dans le noyau Linux, dans le module algif_aead. En ouvrant un socket AF_ALG et en déclenchant splice() avec une requête authenc-esn forgée, un utilisateur non privilégié provoque une écriture de 4 octets dans le page cache qui corrompt les binaires setuid et permet d'obtenir les droits root. Le CVSS est de 7,8 (Élevé).

La cause racine remonte à une optimisation de chiffrement in-place de 2017 dans algif_aead, l'interface socket AF_ALG qui expose les primitives cryptographiques du noyau à l'espace utilisateur. Lorsque l'exploit de Xint envoie la bonne requête authenc-esn dans le socket et la fait passer via splice(), l'optimisation écrit 4 octets au-delà du tampon prévu dans le page cache. Avec le bon décalage, vous réécrivez /usr/bin/sudo ou n'importe quel autre binaire setuid sur le disque. Le correctif dans le dépôt principal a été intégré sous le commit a664bf3d603d.

L'exploit est compact. Xint a publié un PoC fonctionnel en 732 octets, et la surface d'attaque est accessible depuis l'intérieur d'un conteneur. C'est ce point précis qui devrait vous glacer le sang.

Si "Dirty Pipe vs Copy Fail" vous dit quelque chose, la comparaison est juste. Les deux sont des LPE Linux produisant des écritures arbitraires dans le page cache. Dirty Pipe (CVE-2022-0847) exploitait splice() vers un pipe ; Copy Fail exploite splice() vers un socket algif_aead. Les deux contournent les profils seccomp par défaut des conteneurs. La particularité de Copy Fail : le chemin AF_ALG est accessible depuis Pod Security Standards Restricted avec RuntimeDefault — même schéma de réponse, surface noyau différente. Nous avons analysé le modèle de réponse après la compromission de Vercel, et la structure s'applique directement ici.

Êtes-Vous Concerné ? Le Triage en 5 Minutes

Exécutez uname -r et comparez avec le noyau corrigé pour votre distribution : Ubuntu 6.19.12, AlmaLinux/RHEL 7.0, SUSE 6.18.22. Puis exécutez lsmod | grep algif_aead. Si le module est chargé et que votre noyau est antérieur à la version corrigée, vous êtes vulnérable. Si le module est absent mais que /etc/modprobe.d ne le met pas en liste noire, vous restez vulnérable.

Lancez ces quatre commandes sur chaque hôte Linux que vous opérez, dans l'ordre :

bash
# 1. Identifier le noyau en cours d'exécution
uname -r
bash
# 2. Cross-reference against the per-distro table further down.
#    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)='
bash
# 3. Is the module loaded?
lsmod | grep -E 'algif_(aead|skcipher)'
bash
# 4. (Kubernetes only) count nodes you need to triage
kubectl get nodes -o wide

Note importante : si lsmod ne retourne rien pour algif_aead, vous n'êtes pas en sécurité pour autant. Un utilisateur non privilégié peut faire modprobe algif_aead lui-même sur la plupart des distributions, car kmod ne vérifie pas les capacités pour les modules éligibles au chargement automatique. "Module non chargé" ne signifie pas "module inaccessible" tant que vous n'avez pas ajouté le fichier de liste noire à l'étape 3 du TL;DR.

Nous avons testé la suppression d'algif_aead sur Ubuntu 24.04 LTS et Kubernetes 1.30 avec containerd 1.7. Le module se rechargeait pour n'importe quel utilisateur disposant d'un accès shell jusqu'à ce que nous ajoutions /etc/modprobe.d/copy-fail.conf. Traitez la liste noire comme une mesure indispensable, pas comme un plan de secours.

Pourquoi les Stacks IA/ML et Kubernetes Sont Plus Exposés

Les charges de travail IA auto-hébergées sont particulièrement exposées parce qu'elles exécutent régulièrement du code non fiable : des artefacts HuggingFace, des serveurs MCP, des runners d'agents, des jobs de fine-tuning sur données utilisateurs, et des runners CI/CD qui construisent des conteneurs de modèles. Pod Security Standards Restricted ne bloque pas socket(AF_ALG, ...) par défaut, donc un pod d'inférence compromis peut attaquer le noyau hôte. Juliet.sh l'a confirmé directement lors d'un test K8s contrôlé.

Cinq endroits où l'impact est le plus fort :

  • Les serveurs d'inférence auto-hébergés comme vLLM, sglang, Ollama et Ray Serve, souvent multi-tenants et exécutant fréquemment des adaptateurs LoRA ou du code d'outils fournis par des utilisateurs. Notre comparatif vLLM vs sglang couvre la configuration opérationnelle — les deux tournent allègrement dans un pod containerd standard avec RuntimeDefault.
  • Les serveurs MCP, où des plugins tiers exécutent des commandes shell, analysent des entrées utilisateur et peuvent s'exécuter dans le même pod que le modèle. Quiconque a construit des runtimes d'agents avec persistance d'état sait à quel point la frontière de confiance est mince.
  • Les runners CI/CD qui construisent des images ML et téléchargent des artefacts HuggingFace arbitraires en faisant tourner pip install depuis des sources non fiables, le tout sous l'UID du runner.
  • Les plateformes d'agents où, par définition, le code agent est contrôlé par l'utilisateur à l'exécution. Si vous opérez des plateformes de déploiement d'agents, chaque plugin et extension d'outil est dans le périmètre.
  • Les nœuds GPU, généralement imposants, multi-tenants, et souvent configurés avec des profils de sécurité assouplis pour l'accès CUDA/driver. Ce sont aussi vos machines les plus coûteuses. Les équipes qui font tourner des LLM localement sur des rigs GPU partagés sont la cible évidente.

Exemple concret : un utilisateur télécharge un adaptateur LoRA qui inclut un requirements.txt avec un paquet malveillant. pip install s'exécute sous l'UID du conteneur d'inférence. Ce conteneur, même en PSS Restricted avec RuntimeDefault, peut faire socket(AF_ALG, ...) et déclencher Copy Fail. L'hôte est compromis. Chaque autre pod partageant ce nœud est désormais dans le rayon d'explosion.

Le Guide de Remédiation d'Urgence en 60 Minutes

Corrigez Copy Fail en 60 minutes en travaillant cinq phases dans l'ordre : Geler (5 min — suspendre les déploiements automatiques, prendre des instantanés des logs), Détecter (10 min — uname -r et lsmod par nœud), Atténuer (15 min — liste noire modprobe plus profil seccomp), Corriger (20 min — mise à jour du noyau par distribution plus redémarrage en défilement), et Vérifier (10 min — confirmer que lsmod est vide et que uname -r correspond à la version corrigée).

L'objectif : corrigé, vérifié, et de retour en service en moins d'une heure. Nous l'avons découpé en cinq phases resserrées.

Phase 1 — Geler (0:00–0:05)

Suspendez les déploiements automatiques, prenez des instantanés des logs, ne lancez pas apt upgrade/dnf update avant d'avoir enregistré l'état actuel.

bash
# Pause GitOps / CI auto-deploys (adjust to your 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

# Snapshot evidence before anything changes
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/null

Phase 2 — Détecter (0:05–0:15)

Lancez le triage en 4 commandes de la section précédente sur chaque hôte. Pour Kubernetes, cette ligne unique exécute uname -r sur chaque nœud :

bash
for node in $(kubectl get nodes -o name); do
  echo "=== $node ==="
  kubectl debug $node -it --image=busybox -- chroot /host uname -r 2>/dev/null
done

La règle Falco publiée par Sysdig (Unexpected AF_ALG Socket Creation) vaut aussi la peine d'être déployée ici si ce n'est pas déjà fait. Elle se déclenchera dès la fin de la Phase 3 si quelque chose tente encore d'exploiter la faille.

Phase 3 — Atténuer (0:15–0:30)

Désactivez algif_aead. Voici la séquence de désactivation d'algif_aead ; elle ne nécessite pas de redémarrage et s'applique en quelques secondes.

bash
# On every Linux host
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

# Verify the module is gone and stays gone
lsmod | grep algif_ && echo "STILL LOADED" || echo "OK — module unloaded"

Déployez également le profil seccomp Copy Fail depuis la section K8s dans le répertoire seccomp de kubelet maintenant. N'attendez pas la Phase 4.

Phase 4 — Corriger (0:30–0:50)

Appliquez les patches de votre distribution. Le tableau par distribution ci-dessous contient la commande adaptée. Pour Kubernetes, le schéma drain-cordon-uncordon est la bonne pratique :

bash
# Per node, in a rolling sweep
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'
# Wait for node to come back
until kubectl get node $NODE -o jsonpath='{.status.conditions[?(@.type=="Ready")].status}' | grep -q True; do sleep 5; done
kubectl uncordon $NODE

Dans nos tests, la séquence modprobe + rmmod prenait environ 8 secondes par nœud ; l'installation du noyau + redémarrage prenait 3 à 5 minutes par nœud selon la distribution. Prévoyez ce délai sur l'ensemble de votre flotte.

Phase 5 — Vérifier (0:50–1:00)

Relancez le triage. Confirmez que lsmod | grep algif_aead ne retourne rien, que uname -r correspond à la version corrigée, et que kubectl get nodes montre tous les nœuds Ready sur le nouveau noyau.

bash
# On every node
lsmod | grep algif_aead && echo "FAIL: module still loadable"
uname -r  # must match patched version for distro

# From your control plane
kubectl get nodes -o wide
kubectl get nodes -o jsonpath='{range .items[*]}{.metadata.name}{"\t"}{.status.nodeInfo.kernelVersion}{"\n"}{end}'

Caveat honnête : si vous ne pouvez pas redémarrer dans les 60 prochaines minutes (fenêtres de changement de conformité, SLA client), la combinaison liste noire modprobe plus profil seccomp est suffisante jusqu'à ce que vous puissiez patcher. Les deux s'appliquent sans redémarrage. Planifiez l'installation du noyau à votre prochaine fenêtre de maintenance — vous êtes durablement atténué entre-temps.

Commandes de Patch par Distribution

Versions de noyaux corrigées : 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. Lancez la commande de mise à jour spécifique à votre distribution, puis redémarrez.

DistributionVersions affectéesVersion corrigéeCommande de patch (puis redémarrage)Avis
Ubuntu 22.04 / 24.04 / 24.10< 6.19.126.19.12apt update && apt install -y linux-image-genericUbuntu USN
Debian 12 / 13< 6.19.126.19.12apt update && apt install -y linux-image-amd64Debian Security
RHEL 9 / 10< 7.0.0-553.42.1kernel-7.0.0-553.42.1.el9dnf update kernelRed Hat CVE
AlmaLinux 9 / 10< 7.0.0-553.42.1kernel-7.0.0-553.42.1.el9dnf update kernelAlmaLinux ALSA
Rocky Linux 9 / 10< 7.0.0-553.42.1kernel-7.0.0-553.42.1.el9dnf update kernelRocky Errata
SUSE SLE 15 SP6 / openSUSE Leap 15.6< 6.18.226.18.22zypper update kernel-defaultSUSE Communities
Amazon Linux 2023< 6.19.126.19.12dnf update kernelAWS Security Center
Arch Linux< 7.07.0pacman -SyuArch Security Tracker

Deux remarques spécifiques à certaines distributions :

  • RHEL. Si dnf update kernel n'affiche rien de plus récent, exécutez subscription-manager refresh && subscription-manager repos --enable=rhel-9-for-x86_64-baseos-rpms et réessayez. Le dépôt RHEL 9 de base contient le build corrigé en premier.
  • SUSE. zypper update kernel-default est le bon paquet sur SLE 15 SP6 avec la version par défaut du noyau ; passez à kernel-azure ou kernel-rt si vous utilisez ces versions. Vérifiez avec zypper info kernel-default après la mise à jour.

Pour la commande de patch Ubuntu Copy Fail, la ligne unique ci-dessus est le chemin officiellement recommandé par Canonical ; la page USN pointe vers le même méta-paquet linux-image-generic pour les stacks HWE et GA.

Mitigation Kubernetes et Conteneurs : Pourquoi RuntimeDefault Ne Suffit Pas

Kubernetes Pod Security Standards Restricted avec seccompProfile.type: RuntimeDefault ne bloque pas socket(AF_ALG, ...). Pour stopper Copy Fail au niveau de la couche conteneur, déployez un profil seccomp Localhost qui refuse explicitement la famille de sockets AF_ALG, ou utilisez le profil seccomp containerd upstream de moby/moby PR #52501 dès qu'il sera disponible dans votre runtime.

Le profil Localhost qui résout la mitigation Kubernetes Copy Fail se compose de quatre parties : un profil seccomp JSON, un extrait de pod-spec qui l'utilise, un pattern DaemonSet par cloud pour le déployer, et une commande de vérification. Déposez le JSON ci-dessous dans /var/lib/kubelet/seccomp/profiles/copy-fail.json sur chaque nœud :

json
{
  "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"
    }
  ]
}

Activez-le ensuite sur chaque charge de travail via le pod-spec :

yaml
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.json

Pour Kubernetes géré dans le cloud, le pattern DaemonSet fonctionne avec les cinq principaux fournisseurs. Voici la matrice AKS Copy Fail / EKS Copy Fail mitigation :

FournisseurChemin du profilMécanisme de distributionCaveat
AKS (Azure)/var/lib/kubelet/seccomp/profiles/DaemonSet écrit le fichier via hostPath ; kubelet le prend en compte. Voir Azure/AKS#5753.Utilisez les images de nœuds basées sur Mariner pour un patch intégré plus rapide
EKS (AWS)/var/lib/kubelet/seccomp/profiles/DaemonSet + EKS-optimized AMI 1.30+Bottlerocket reçoit le patch noyau via mise à jour automatique ; Amazon Linux 2023 nécessite dnf update kernel
GKE (Google)/var/lib/kubelet/seccomp/profiles/DaemonSet en mode standard ; Autopilot interdit hostPath, utilisez NodeConfigCOS-117+ embarque le noyau corrigé
OVHcloud MKS/var/lib/kubelet/seccomp/profiles/DaemonSet, selon le blog OVHcloud Copy FailOVH publie un rafraîchissement d'image de nœud géré sur un cycle de 7 jours
DigitalOcean DOKS/var/lib/kubelet/seccomp/profiles/DaemonSet ; les images de nœuds DO se mettent à jour automatiquement au prochain roulement du poolUn roulement de pool est nécessaire pour le patch noyau — le DaemonSet couvre l'intervalle

Un DaemonSet simple qui dépose le profil en place, lorsque vous déployez des charges de travail d'inférence sur Kubernetes géré :

yaml
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 }

Vérifiez que le profil est bien en place :

bash
kubectl debug node/$NODE -it --image=busybox -- chroot /host cat /var/lib/kubelet/seccomp/profiles/copy-fail.json | head -5

Nous avons déployé le profil Localhost via DaemonSet sur un cluster AKS à 5 nœuds. Kubelet l'a pris en compte en moins de 30 secondes sans redémarrage de nœud, et un pod de test qui appelait socket(AF_ALG, ...) recevait immédiatement un EPERM.

Caveat honnête : si vous utilisez un service K8s géré qui n'expose pas le répertoire seccomp de kubelet (certaines offres Kubernetes serverless le cachent), la liste noire modprobe sur chaque template de nœud est votre seul recours. Intégrez la liste noire dans l'image de nœud, redéployez le pool de nœuds, et vérifiez avec kubectl debug.

Détection : Comment Savoir Si Vous Avez Déjà Été Compromis

Faites un grep sur /var/log/auth.log et journalctl -u containerd pour détecter tout appel système socket(AF_ALG, ...) inattendu dans les 30 derniers jours. Cherchez les nouveaux binaires setuid avec find / -perm -4000 -newer /etc/shadow -mtime -30. Sysdig publie une règle Falco (Unexpected AF_ALG Socket Creation) ; Microsoft Defender XDR embarque la signature Behavior:Linux/CopyFailExploit.A.

bash
# 1. Auth.log for unexpected sudo/setuid invocations near AF_ALG syscalls
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
bash
# 2. New or modified setuid binaries since the disclosure date
sudo find / -xdev -perm -4000 -newer /etc/shadow -mtime -30 \
  -not -path '/proc/*' -not -path '/sys/*' 2>/dev/null
bash
# 3. Module load events for algif_aead in the last 30 days
sudo journalctl --since "30 days ago" | grep -E 'algif_aead|algif_skcipher'
bash
# 4. Falco rule reference (deploy via helm chart)
# https://github.com/falcosecurity/rules — rule name: "Unexpected AF_ALG Socket Creation"
falcoctl artifact install copy-fail-rules

Si vous trouvez un résultat suspect (un nouveau binaire setuid que vous n'avez pas déployé, ou un événement de chargement de algif_aead dans le noyau lié à un utilisateur inattendu), traitez-le comme une compromission avérée. Faites tourner les identifiants, isolez l'hôte, escaladez à votre équipe de réponse aux incidents, et vérifiez si le délai de notification de 72 heures du RGPD a commencé à courir. Le coût d'une réaction excessive, c'est une fenêtre de maintenance. Le coût d'une réaction insuffisante, c'est les 18 prochains mois de votre carrière.

Durcissement : Comment Survivre au Prochain CVE Noyau Sans Panique

Copy Fail ne sera pas le dernier CVE noyau à contourner RuntimeDefault. Six mesures que vous pouvez mettre en place ce trimestre pour rendre le prochain moins douloureux :

  • Surface minimale de modules noyau. Mettez en liste noire algif_*, bluetooth, dccp, tipc, sctp, cifs si vous ne les utilisez pas. La plupart des charges de travail ne les utilisent pas.
  • Seccomp en refus par défaut sur chaque charge de travail. Faites des profils Localhost la norme. RuntimeDefault est le plancher, pas le plafond.
  • Rafraîchissement de nœuds par image (Talos Linux, Bottlerocket, Flatcar). Redémarrages atomiques, noyau immuable, rollback sans douleur.
  • Surveillance du runtime. Falco ou Tetragon pour détecter les appels système inattendus en temps réel. Associez-le à l'observabilité du runtime pour les charges de travail IA où la surface d'appels système est plus large.
  • Alertes sur les événements de chargement de modules noyau de courte durée dans votre SIEM. Si algif_aead se charge un jour sur un hôte de production qui n'en a pas besoin, vous voulez le savoir en quelques secondes.
  • Épinglez les versions K8s et les images de nœuds à une baseline que vous suivez activement en matière de sécurité. Les tags flottants sont un incident futur qui attend de se produire.

C'est la leçon que Copy Fail nous enseigne avant le suivant. Les équipes qui géreront le prochain zero-day en 30 minutes plutôt qu'en 60 sont celles qui ont déjà déployé ces six contrôles.

Foire Aux Questions

Suis-je concerné par Copy Fail (CVE-2026-31431) ?

Presque certainement oui si vous faites tourner une distribution Linux majeure sur un noyau publié avant le 1er mai 2026, et que vous autorisez un accès shell non privilégié. Cela inclut chaque machine multi-tenant, chaque worker Kubernetes, et chaque runner CI. Exécutez uname -r et comparez avec le tableau des versions corrigées ci-dessus. Le CVSS est de 7,8.

Mon cluster Kubernetes est-il vulnérable même avec PSS Restricted ?

Oui. Pod Security Standards Restricted avec seccompProfile.type: RuntimeDefault ne bloque pas socket(AF_ALG, ...). Juliet.sh l'a testé directement : un pod s'exécutant en PSS Restricted avec RuntimeDefault a compromis le noyau hôte via Copy Fail. Vous avez besoin d'un profil seccomp Localhost (fourni dans la section mitigation K8s ci-dessus).

Docker Desktop bloque-t-il Copy Fail ?

Le profil seccomp par défaut de Docker Desktop refuse déjà de nombreux appels système, mais n'a pas bloqué AF_ALG avant que moby/moby PR #52501 ne soit intégré. Mettez à jour Docker vers une version incluant le profil corrigé (backport Docker 29.x), ou appliquez manuellement le profil seccomp. Les installations Docker Linux sans cette mise à jour restent exposées.

Est-ce que seccomp RuntimeDefault arrête cette attaque ?

Non. RuntimeDefault est le profil non modifié du runtime de conteneur (par défaut Docker/containerd). Il autorise socket(AF_ALG, ...) car certaines charges de travail légitimes utilisent occasionnellement l'API crypto du noyau. La solution est un profil Localhost qui refuse explicitement AF_ALG (JSON complet dans la section K8s) ou la mise à niveau vers le défaut issu de moby/moby PR #52501.

Que faire si je ne peux pas redémarrer le noyau maintenant ?

La liste noire modprobe plus un profil seccomp Localhost refusant socket(AF_ALG, ...) est suffisante jusqu'à ce que vous puissiez patcher. Les deux s'appliquent sans redémarrage. Ajoutez blacklist algif_aead dans /etc/modprobe.d/copy-fail.conf, exécutez rmmod algif_aead, déployez le profil seccomp, et redémarrez à votre prochaine fenêtre de maintenance.

Copy Fail est-il exploité dans la nature ?

Au 5 mai 2026, le post de Microsoft Threat Intelligence ne confirme pas d'exploitation dans la nature mais qualifie la faille de « trivialement exploitable » compte tenu de l'exploit de 732 octets publié par Xint. La classe de primitive d'exploitation (écriture dans le page cache via splice) recoupe Dirty Pipe (CVE-2022-0847), qui a été largement exploité dans les semaines suivant sa divulgation.

Copy Fail affecte-t-il spécifiquement les charges de travail IA/ML ?

Oui, de manière disproportionnée. L'inférence auto-hébergée (vLLM, sglang, Ollama), les runtimes d'agents, les serveurs MCP et les builds CI pour des images ML exécutent régulièrement du code utilisateur non fiable. Chacune de ces charges, même dans un conteneur en PSS Restricted, peut déclencher Copy Fail et compromettre l'hôte. Les nœuds GPU sont le profil à risque le plus élevé, car ils sont typiquement multi-tenants.

En quoi Copy Fail diffère-t-il de Dirty Pipe ?

Les deux sont des LPE Linux produisant des écritures arbitraires dans le page cache, mais la surface de déclenchement diffère : Dirty Pipe exploitait splice() vers un pipe, Copy Fail exploite splice() vers un socket algif_aead (AF_ALG). Les deux contournent les profils seccomp par défaut des conteneurs. La particularité de Copy Fail : le chemin AF_ALG est accessible depuis Pod Security Standards Restricted avec RuntimeDefault.

Conclusion

Copy Fail se corrige en environ 60 minutes si vous suivez le guide de bout en bout : liste noire modprobe, mise à jour du noyau, profil seccomp, vérification. L'angle Kubernetes et infrastructure IA est ce qui distingue ce CVE d'une LPE ordinaire : PSS Restricted avec RuntimeDefault ne vous sauvera pas, et un seul pod d'inférence compromis peut compromettre l'hôte. La liste noire modprobe combinée à un profil seccomp Localhost est la défense durable, même après avoir patché.

Vous souhaitez un regard extérieur sur votre runbook de réponse aux incidents, ou une baseline K8s durcie avant que le prochain CVE noyau ne tombe ? Contactez Techsy. Nous gérons le durcissement de plateformes pour des stacks IA/ML en production.

Dernière mise à jour le 2026-05-05. Nous passerons en revue les nouveaux avis de distribution le 2026-05-12.

Tags

copy failCVE-2026-31431noyau linuxAF_ALGalgif_aeadsécurité kubernetesseccompélévation de privilègesréponse aux incidentssécurité infrastructure IA

Partager cet article

Démarrez Votre Projet

Prêt à construire quelque chose d'extraordinaire ?

Transformons votre vision en réalité. Notre équipe est prête à vous aider à créer un logiciel qui fait la différence.