
Guide de recherche et de détection pour CVE-2026-31431, un contournement basé sur io_uring de la surveillance des appels système. Fournit des règles de détection pour Tetragon, Falco et Wazuh, ainsi que des stratégies de durcissement.
Pour CVE-2026-31431 (« Copy Fail »), nous avons démontré des faiblesses systématiques dans les produits de sécurité grand public en combinant trois stratégies de contournement : le chemin d'E/S asynchrone io_uring, la division de processus (fork + SCM_RIGHTS) et la réutilisation de socket. Grâce à des tests empiriques, nous avons prouvé que ces techniques peuvent échapper à pratiquement tous les outils de détection basés sur les appels système.
io_uring soumet des requêtes via des anneaux tampons en mémoire partagée, contournant les points d'entrée traditionnels des appels système. Cela signifie que :
iou-wrk-XXXXX) exécutent des opérations dans le noyau sans déclencher audit_syscall_entry()socket(AF_ALG) peuvent être contournées via IORING_OP_SOCKET — seccomp ne vérifie qu'à l'entrée des appels système, et les opérations io_uring ne passent pas par cette entréeEn utilisant fork + SCM_RIGHTS (passage de descripteurs de fichier via socket de domaine Unix), la création de socket et les opérations splice peuvent être placées dans des processus différents :
same_field(audit.pid) de Wazuh est brisée — PID du socket ≠ PID du splice, la règle CRITIQUE ne se déclenche pasLe PoC original crée un nouveau socket à chaque itération (produisant 40+ appels socket(AF_ALG)). La réutilisation de socket ne crée qu'un seul socket d'écoute ; la boucle appelle accept() qui ne produit pas de nouveaux événements de socket. Les règles basées sur count >= N sont complètement neutralisées.
chemin io_uring + splice + /etc/passwd + algorithme authenc + division SCM_RIGHTS + réutilisation de socket
Avec cette combinaison : les outils basés sur les appels système sont totalement aveugles, la corrélation au niveau du processus est brisée, les seuils de comptage échouent. Seule la détection par point de convergence kprobe peut attraper cette combinaison.
__sock_create(family=38) est un point de convergence incontournable pour tous les chemins (appel système et io_uring) — AF_ALG est la seule API crypto en espace utilisateur du noyau Linux. Quelle que soit la façon dont les attaquants varient leur approche, ils doivent créer un socket AF_ALG. La surveillance de cette fonction au niveau LSM offre un rappel de 100 % et n'est affectée par aucune variante.
| Produit | Couche de détection | Appel système traditionnel | Chemin io_uring | Division multi-processus | Réutilisation de socket | Évaluation |
|---|---|---|---|---|---|---|
| Tetragon (kprobe) | Fonction noyau | ✅ | ✅ | ✅ | ✅ | Seule couverture complète de la chaîne |
| Falco + plugin krsi | fexit/fentry | ✅ | ✅ | ✅ | ✅ | Nécessite krsi pour io_uring ; entrée uniquement |
| Falco (modern_ebpf) | tracepoint d'appel système | ✅ | ❌ | ✅ | ✅ | io_uring complètement invisible |
| auditd / Wazuh | audit d'appel système | ✅ | ❌ | ❌ PID brisé | ⚠️ | io_uring aveugle + corrélation PID brisée |
| Elastic Security Agent | appel système | ✅ | ❌ | ⚠️ | ⚠️ | Identique à Wazuh ; dépendant des appels système = aveugle |
Le pilote modern_ebpf natif de Falco ne capture que le chemin des appels système. Le plugin krsi est requis — il utilise le traçage fexit sur les sorties des fonctions noyau io_socket() et __sys_socket() pour couvrir le chemin io_uring pour la création de socket AF_ALG. Règle de repli recommandée :
- rule: AF_ALG Socket Created
condition: >
(evt.type = socket and evt.args contains AF_ALG) or
(evt.type = krsi_socket and krsi.domain = 38)
output: >
AF_ALG socket created (source=%evt.type domain=%evt.arg.domain
krsi_domain=%krsi.domain proc=%proc.name pid=%proc.pid)
priority: WARNING
tags: [cve-2026-31431, crypto, container_escape]
L'approche de détection de la règle recommandée : couvre simultanément les événements socket (chemin d'appel système, en utilisant la correspondance de chaîne evt.args contains AF_ALG pour contourner la limitation de type ENUMFLAGS32) et les événements krsi_socket (chemin io_uring, en utilisant la comparaison d'entiers krsi.domain = 38). Pas de seuils de comptage (neutralisés par la réutilisation de socket), pas de dépendance à la corrélation PID (neutralisée par la division multi-processus).
Remarque : Les trois couches de défense de la règle communautaire ThreatBear sont toutes contournables — incompatibilité de type ENUMFLAGS32 (evt.arg[0]=38 toujours faux), la réutilisation de socket neutralise le seuil de comptage (count=1 < 40), la division multi-processus brise la corrélation PID. Voir Analyse du contournement de règle.
Wazuh repose entièrement sur les événements d'audit des appels système d'auditd. Les opérations io_uring ne passent pas par l'entrée des appels système, donc auditd produit zéro événement et les 7 règles Wazuh échouent. Il en va de même pour Elastic Security Agent — les produits dépendants de l'entrée des appels système sont structurellement aveugles au chemin io_uring. Voir Analyse des limitations de Wazuh.
Le répertoire bypass_demo/ contient des descriptions conceptuelles des approches de contournement de détection. Le code PoC réel est réservé à un usage interne et n'est pas distribué publiquement.
| Document | Contenu |
|---|---|
| VULNERABILITY.md | Cause racine — superposition de trois modifications du noyau, chaîne d'attaque en 9 étapes, caractéristiques d'écriture du cache de pages |
| EXPLOIT_VARIANTS.md | 6 dimensions de variantes d'exploitation — chemin d'E/S × soumission de données × fichier cible × algorithme AEAD × division de processus × réutilisation de socket |
| DETECTION_THEORY.md | Théorie de détection — points de convergence vs. divergence, architecture de détection en 4 couches, corrélation temporelle multi-signaux |
| Document | Contenu |
|---|---|
| detection/tetragon.md | Recommandé — Tetragon kprobe, 5 sondes couvrant traditionnel + io_uring, seule détection complète de la chaîne |
| detection/falco.md | Guide de configuration Falco 0.40.0 + krsi 0.1.0, internes de krsi, dépannage |
| detection/wazuh.md | Wazuh + auditd trois limitations majeures : cécité io_uring, rupture de corrélation PID, invisibilité du cache de pages |
| detection/rule_bypass.md | Principes de contournement de la règle ThreatBear, vérification empirique anti-contournement de la règle recommandée |
| Document | Contenu |
|---|---|
| defense/HARDENING.md | Modèle de défense en 3 couches : configuration noyau → seccomp → espaces de noms utilisateur ; analyse de sécurité Docker 29.4.2 |