Copy Fail – CVE-2026-31431
(copy.fail)- Une vulnérabilité d’élévation de privilèges avec échappement de conteneur permettant d’obtenir les privilèges root sur toutes les distributions Linux depuis 2017
- Elle exploite un simple défaut logique présent dans le module cryptographique du noyau Linux (
authencesn) et peut être exécutée avec un unique script Python de 732 octets, sans synchronisation complexe (race condition) ni ajustement selon la version du noyau - Le principe central consiste à altérer le cache mémoire interne (page cache) auquel Linux se réfère lors de l’exécution d’un fichier, en reliant
AF_ALG(socket cryptographique du noyau) etsplice()(appel système de copie de données) pour écraser 4 octets dans la copie en cache d’un binaire setuid- Le fichier réel sur disque n’est pas modifié, ce qui en fait une attaque furtive qui ne laisse pas de trace dans une image disque forensique
- Après redémarrage ou libération de la mémoire, le cache revient à l’original, rendant la détection a posteriori difficile avec les contrôles traditionnels d’intégrité des fichiers
- Comme le page cache est partagé à l’échelle de tout l’hôte, dans un environnement Kubernetes, un seul pod exploitant cette faille peut prendre le contrôle du nœud hôte et s’échapper du conteneur jusqu’à compromettre ceux d’autres tenants
- La faille a été vérifiée directement sur Ubuntu 24.04, Amazon Linux 2023, RHEL 10.1 et SUSE 16, et fonctionne immédiatement avec un simple compte local non privilégié, sans accès réseau ni fonctions de débogage du noyau
- Alors que les vulnérabilités Linux d’élévation de privilèges (LPE) existantes n’affichent souvent qu’un taux de réussite de 30 à 80 % par tentative et ne fonctionnent que sur certaines plages de noyaux, Copy Fail vise toutes les distributions pendant 9 ans (2017~2026) avec 100 % de réussite en une seule tentative
- Contrairement à Dirty Pipe (abus des flags de buffer de pipe) et Dirty Cow (nécessite une course temporelle), qui relèvent de la même famille d’altération du page cache, l’absence de race condition, d’offsets spécifiques aux distributions et de recompilation rend l’attaque bien plus simple et puissante
- Cibles les plus urgentes : hôtes Linux multitenants, clusters Kubernetes/conteneurs, runners CI (GitHub Actions auto-hébergé, GitLab Runner, etc.), SaaS cloud exécutant du code utilisateur — en bref, tout environnement où du code non fiable s’exécute sur un noyau partagé
- Mesure prioritaire absolue : appliquer le patch noyau (commit mainline
a664bf3d603d) — il annule l’optimisation in-place introduite en 2017 dans le module cryptographique afin que les pages du page cache ne puissent plus être ciblées en écriture par les opérations cryptographiques - En mesure temporaire avant correctif, il est possible de désactiver le module
algif_aead, sans impact sur les fonctions de chiffrement courantes comme dm-crypt/LUKS, kTLS, IPsec ou SSH - Dans les environnements à workloads non fiables comme les conteneurs, sandboxes ou runners CI, il est recommandé, patch ou non, de bloquer la création de sockets
AF_ALGvia seccomp - Cas de détection de vulnérabilité assistée par IA : Taeyang Lee de Xint a eu l’intuition initiale que « la structure par laquelle
splice()transmet des pages du page cache au sous-système de chiffrement constitue une classe de bugs encore inexplorée », puis Xint Code a automatiquement scanné le sous-systèmecrypto/du noyau et découvert la faille en environ une heure
5 commentaires
Il semble que Rocky Linux n’ait pas encore de correctif.
RHEL
AlmaLinux
Rocky Linux
copy fail,cve-2026-31431, etc. sur https://errata.rockylinux.org/J’utilise Rocky Linux, et si vous ne pouvez pas redémarrer, le blocage via
bpftoolde https://github.com/wgnet/wg.copyfail.patch est efficace.https://kb.ciq.com/article/rocky-linux/rl-cve-2026-31431-mitigation
Il existe bien un correctif, mais il n’est fourni que via le dépôt du service par abonnement. La version CE n’est pas corrigée. (9.7, 10.1 vérifiés)
Le correctif est sorti le 2026-05-05.
Une nouvelle option de sécurité est disponible depuis le 2026-05-10.
https://forums.rockylinux.org/t/…
sudo dnf --enablerepo=security update
En ajoutant le dépôt de sécurité, il semble possible d’appliquer des mesures de sécurité indépendamment de l’intégration des sources RHEL.
Pour les utilisateurs d’Ubuntu, un guide expliquant la marche à suivre a été publié, cela devrait donc vous être utile.
https://discourse.ubuntu.com/t/…
Commentaires Hacker News
Du point de vue de quelqu’un qui travaille sur le code crypto du noyau Linux, les exploits AF_ALG qui reviennent régulièrement sont vraiment exaspérants
AF_ALG est entré dans le noyau il y a longtemps sans revue suffisante, sa structure est bien trop complexe, et il ouvre une énorme surface d’attaque à des programmes userspace non privilégiés
En plus, c’est presque inutile. Le userspace a déjà son propre code de chiffrement, et le code crypto du noyau était à l’origine destiné à des usages internes au noyau comme dm-crypt
Même authencesn dans cet exploit n’est en pratique qu’un détail d’implémentation interne d’IPsec, et l’exposer comme API générique de chiffrement/déchiffrement pour le userspace me paraît avoir été une erreur dès le départ
Si vous gérez la configuration du noyau Linux, je recommande fortement de désactiver toutes les options CONFIG_CRYPTO_USER_API_*
Rien que cela aurait rendu inexploitables non seulement ce bug, mais aussi une bonne partie des bugs AF_ALG passés et futurs
Si un programme userspace casse, mieux vaut l’aider à migrer vers du code crypto userspace, et dans les faits certains l’ont déjà fait
Au fond, AF_ALG n’a jamais eu beaucoup d’utilité en dehors des exploits
On tolérait peut-être encore ce genre d’API userspace autrefois, mais avec syzbot et la détection de bugs assistée par LLM aujourd’hui, ça devient difficilement tenable
Il est avancé que cela permet d’utiliser depuis le userspace des accélérateurs matériels normalement accessibles uniquement en mode noyau, de transmettre les clés au noyau sans les laisser longtemps dans la mémoire de l’application, et de réduire l’empreinte mémoire par rapport à une bibliothèque crypto userspace dans des environnements contraints comme l’embarqué
Je ne sais pas si cela constitue une justification suffisante, mais il y a au moins une raison d’être
Linus est réputé assez exigeant sur ce qui entre dans le noyau, donc l’histoire derrière l’arrivée d’une API comme celle-ci serait intéressante
Elle permet de manipuler le hachage et le chiffrement au moyen d’appels
read(2)/write(2)ordinairesIl semble y avoir eu une certaine confusion dans le processus de divulgation
Les éditeurs ne semblent pas traiter cette vulnérabilité comme particulièrement grave, et plusieurs distributions restent donc sans correctif pour l’instant
https://access.redhat.com/security/cve/cve-2026-31431 l’indiquait comme "Moderate severity" et "Fix deferred", et les pages de suivi de Debian, Ubuntu et SUSE semblaient similaires
Mais l’upstream n’a pas communiqué clairement dessus comme sur une vulnérabilité, et Linus comme Greg n’accordent généralement pas une grande importance conceptuelle à ce type de classification dans le noyau
Cela dit, comme cela permet tout de même une élévation locale de privilèges vers root, cela semble en général mériter une priorité élevée
https://ubuntu.com/security/cves/about#priority
C’est dommage que l’article n’indique pas directement quelles versions du noyau sont vulnérables et à partir de quelles versions c’est corrigé
D’autant plus que c’est un module builtin qu’on ne peut pas simplement retirer avec
rmmodEn cherchant à vérifier si le kernel 6.19.14 de Fedora 44 était vulnérable, je suis tombé sur ce message de la liste linux-cve-announce : https://lore.kernel.org/linux-cve-announce/2026042214-CVE-2026-31431-3d65@gregkh/T/#u
Il y est indiqué que cela a été corrigé dans 6.18.22, 6.19.12 et 7.0 via les commits correspondants, ce qui est utile
Si vous voulez vérifier si le module
algif_aeada bien été bloqué via la configuration modprobe comme le recommande la mesure d’atténuation, pas besoin d’exécuter tout un morceau de shell obfusquéQuelques lignes de Python suffisent pour vérifier lisiblement si le module se charge réellement :
python3 -c 'import socket; s = socket.socket(socket.AF_ALG, socket.SOCK_SEQPACKET, 0); s.bind(("aead","authencesn(hmac(sha256),cbc(aes))")); print("algif_aead probably successfully loaded, mitigation not effective; remove again with: rmmod algif_aead")'Si l’atténuation est correctement appliquée,
modprobe algif_aeaddevrait aussi échouer avec une erreurJ’imagine que personne n’exécute d’agents IA totalement autonomes avec des privilèges utilisateur ordinaires sur des systèmes affectés
Combiné à une injection de prompt zero-day, ça pourrait être assez catastrophique
curl | shun standard de fait dans l’industrieLPE signifie local privilege escalation
Il y a vraiment trop d’acronymes en sécurité, et même si on peut le déduire du contexte, j’aurais préféré que ce soit explicité au moins la première fois
Cela dit, pour un texte destiné à un public plus large, je suis d’accord qu’il vaudrait mieux le définir explicitement
D’ailleurs, tout cet article donne aussi l’impression d’avoir été généré par IA
C’est assez drôle
La page dit que ça fonctionne sur RHEL 14.3, mais cette version n’existe pas
RHEL en est actuellement à la 10.x, donc j’ai eu l’impression d’être monté dans le TARDIS
On peut voir des chaînes du type
gcc (GCC) 14.3.1 20250617 (Red Hat 14.3.1-2), et on retrouve des traces similaires dans les exemples ci-dessoushttps://github.com/anthropics/claude-code/issues/40741
https://docs.oracle.com/en/database/oracle/tuxedo/22/otxig/software-requirements-red-hat-enterprise-linux-10-64-bit.html
6.12.0-124.45.1.el10_1, qui est manifestement un noyau RHEL 10Ce genre de faute de frappe est au contraire très humain
Les longues suites de chiffres copiées-collées sont exactes, mais les chiffres simples saisis à la main sont ceux qu’on rate
Il a fallu rassembler les informations rapidement pour expliquer le problème, et oui, il y avait aussi un aspect marketing
Donc quelques petites erreurs se sont glissées dedans, merci de les avoir signalées
https://access.redhat.com/articles/red-hat-enterprise-linux-release-dates
Et une fois arrivé au « Talk to our security experts » en bas de page, je me suis même demandé si ce fameux expert sécurité ne s’appelait pas Claude
Sur RHEL 9/10, algif_aead n’était pas un module mais un builtin, donc impossible à décharger
J’ai donc cherché une solution de repli pour bloquer AF_ALG via systemd, avec un drop-in nécessaire pour chaque service exposé
Il y a aussi un playbook Ansible qui couvre en général les cas importants comme
sshdetuser@https://gist.github.com/m3nu/c19269ef4fd6fa53b03eb388f77464da
initcall_blacklist=algif_aead_initaux options de démarrage du noyau puis de redémarrerAprès cela, l’exploit ne fonctionnait plus
Je m’inquiète des autres chemins d’exécution comme
cronjobouslurmjob, et j’aimerais qu’il existe un moyen de faire hériter ça globalement à tous les processus au niveau systemd, au lieu de devoir le définir service par serviceCet exploit semble fonctionner en remplaçant un binaire SUID pour le faire s’exécuter avec le PID 0
Pourtant, le site affirme qu’il permet aussi de s’échapper de clusters Kubernetes / de conteneurs et de CI runners & build farms, mais je ne vois aucune explication concrète à l’appui pour l’évasion de conteneur, ni surtout de user namespace
Je l’ai essayé dans Podman rootless et, comme prévu, il n’a pas permis de sortir du conteneur
Le site affirme aussi « rendre root toutes les distributions Linux sorties depuis 2017 », mais les tests réels n’en couvrent que quatre, et cela n’a pas fonctionné sur Alpine
L’annonce dit :
"Next: "From Pod to Host," how Copy Fail escapes every major cloud Kubernetes platform."https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=72548b093ee3
Cela dit, l’exploitabilité réelle dépendra du fait qu’il s’agisse d’une version majeure récente ou d’un noyau de maintenance sur une branche plus ancienne
Cela dit, j’ai exécuté le PoC moi-même sur une instance 24.04 et la vulnérabilité semble bien réelle, avec un impact qui paraît important
Mais le nombre de distributions touchées semble bien plus faible que ce qui est affirmé, et assez éloigné de la formule toutes les distributions depuis 2017
Par exemple, si je comprends bien, Ubuntu 16.04 en fin de vie est légèrement touché, et le gros de l’impact semble plutôt concerner des noyaux vendor récemment déployés comme
linux-gcpetlinux-oracle-6.7, donc la famille 6.17Mais cela demande des étapes supplémentaires, et Alpine peut lui aussi être vulnérable au fond, avec simplement un script à ajuster
En fin de compte, ce n’est pas un exploit universel prêt à l’emploi, mais un PoC
La page elle-même a un côté un peu vibecoded et publicitaire, mais la vulnérabilité est réelle et sa gravité semble élevée
Cela explique pourquoi une grosse mise à jour de sécurité est tombée aujourd’hui, donc je vais remonter sa priorité
Ils trouvent de vrais bugs, les font corriger, apportent ainsi une contribution significative à l’écosystème OSS, et en profitent pour vendre leur outil de sécurité
Mais en même temps, qui code encore ses pages web entièrement à la main aujourd’hui, surtout parmi des développeurs kernel ?