
Forschungs- und Erkennungsleitfaden für CVE-2026-31431, eine auf io_uring basierende Umgehung der Syscall-Überwachung. Bietet Erkennungsregeln für Tetragon, Falco und Wazuh sowie Härtungsstrategien.
Für CVE-2026-31431 („Copy Fail") haben wir systematische Schwächen in gängigen Sicherheitsprodukten demonstriert, indem wir drei Umgehungsstrategien kombiniert haben: io_uring asynchroner I/O-Pfad, Prozessaufteilung (fork + SCM_RIGHTS) und Socket-Wiederverwendung. Durch empirische Tests haben wir bewiesen, dass diese Techniken praktisch alle syscall-basierten Erkennungswerkzeuge umgehen können.
io_uring übermittelt Anfragen über gemeinsam genutzte Speicher-Ringpuffer und umgeht damit traditionelle Syscall-Einstiegspunkte. Das bedeutet:
iou-wrk-XXXXX) führen Operationen innerhalb des Kernels aus, ohne audit_syscall_entry() auszulösensocket(AF_ALG) blockieren, können über IORING_OP_SOCKET umgangen werden — Seccomp prüft nur beim Syscall-Eintritt, und io_uring-Operationen durchlaufen diesen Eintritt nichtDurch die Verwendung von fork + SCM_RIGHTS (Unix-Domain-Socket-fd-Übergabe) können Socket-Erstellung und Splice-Operationen in verschiedenen Prozessen platziert werden:
same_field(audit.pid)-Korrelation bricht — Socket-PID ≠ Splice-PID, die CRITICAL-Regel greift nichtDas ursprüngliche PoC erstellt pro Iteration einen neuen Socket (was 40+ socket(AF_ALG)-Aufrufe erzeugt). Socket-Wiederverwendung erstellt nur einen einzigen Listening-Socket; die Schleife ruft accept() auf, was keine neuen Socket-Ereignisse erzeugt. Regeln, die auf count >= N basieren, werden vollständig ausgehebelt.
io_uring-Pfad + splice + /etc/passwd + authenc-Algorithmus + SCM_RIGHTS-Aufteilung + Socket-Wiederverwendung
Unter dieser Kombination: syscall-basierte Werkzeuge sind völlig blind, Prozessebenen-Korrelation ist gebrochen, Zählschwellen versagen. Nur kprobe-Konvergenzpunkt-Erkennung kann diese Kombination abfangen.
__sock_create(family=38) ist ein nicht umgehbarer Konvergenzpunkt für alle Pfade (syscall und io_uring) — AF_ALG ist die einzige Userspace-Krypto-API im Linux-Kernel. Egal wie Angreifer ihre Vorgehensweise variieren, sie müssen einen AF_ALG-Socket erstellen. Die Überwachung dieser Funktion auf LSM-Ebene bietet 100 % Recall und ist von keiner Variante betroffen.
| Produkt | Erkennungsebene | Traditioneller Syscall | io_uring-Pfad | Mehrprozess-Aufteilung | Socket-Wiederverwendung | Bewertung |
|---|---|---|---|---|---|---|
| Tetragon (kprobe) | Kernelfunktion | ✅ | ✅ | ✅ | ✅ | Einzige Abdeckung der gesamten Kette |
| Falco + krsi-Plugin | fexit/fentry | ✅ | ✅ | ✅ | ✅ | Benötigt krsi für io_uring; nur Eintritt |
| Falco (modern_ebpf) | Syscall-Tracepoint | ✅ | ❌ | ✅ | ✅ | io_uring völlig unsichtbar |
| auditd / Wazuh | Syscall-Audit | ✅ | ❌ | ❌ PID gebrochen | ⚠️ | io_uring blind + PID-Korrelation gebrochen |
| Elastic Security Agent | Syscall | ✅ | ❌ | ⚠️ | ⚠️ | Wie Wazuh; syscall-abhängig = blind |
Falcos nativer modern_ebpf-Treiber erfasst nur den Syscall-Pfad. Das krsi-Plugin ist erforderlich — es verwendet fexit-Tracing auf io_socket()- und __sys_socket()-Kernelfunktionsausgängen, um den io_uring-Pfad für die AF_ALG-Socket-Erstellung abzudecken. Empfohlene Fallback-Regel:
- 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]
Der Erkennungsansatz der empfohlenen Regel: deckt gleichzeitig socket-Ereignisse ab (Syscall-Pfad, unter Verwendung von evt.args contains AF_ALG-String-Abgleich zur Umgehung der ENUMFLAGS32-Typbeschränkung) und krsi_socket-Ereignisse (io_uring-Pfad, unter Verwendung von krsi.domain = 38-Integer-Vergleich). Keine Zählschwellen (durch Socket-Wiederverwendung ausgehebelt), keine PID-Korrelationsabhängigkeit (durch Mehrprozess-Aufteilung ausgehebelt).
Hinweis: Die drei Verteidigungsebenen der Community-ThreatBear-Regel sind alle umgehbar — ENUMFLAGS32-Typkonflikt (evt.arg[0]=38 immer falsch), Socket-Wiederverwendung schlägt den Zählschwellenwert (count=1 < 40), Mehrprozess-Aufteilung bricht die PID-Korrelation. Siehe Regel-Umgehungsanalyse.
Wazuh verlässt sich vollständig auf auditds Syscall-Audit-Ereignisse. io_uring-Operationen durchlaufen keinen Syscall-Eintritt, daher erzeugt auditd null Ereignisse und alle 7 Wazuh-Regeln schlagen fehl. Gleiches gilt für Elastic Security Agent — Produkte, die vom Syscall-Eintritt abhängen, sind strukturell blind gegenüber dem io_uring-Pfad. Siehe Wazuh-Einschränkungsanalyse.
Das Verzeichnis bypass_demo/ enthält konzeptionelle Beschreibungen von Erkennungsumgehungsansätzen. Der tatsächliche PoC-Code ist nur für den internen Gebrauch bestimmt und wird nicht öffentlich verteilt.
| Dokument | Inhalt |
|---|---|
| VULNERABILITY.md | Grundursache — Überlagerung von drei Kerneländerungen, 9-stufige Angriffskette, Page-Cache-Schreibeigenschaften |
| EXPLOIT_VARIANTS.md | 6 Exploit-Variantendimensionen — I/O-Pfad × Datenübermittlung × Zieldatei × AEAD-Algorithmus × Prozessaufteilung × Socket-Wiederverwendung |
| DETECTION_THEORY.md | Erkennungstheorie — Konvergenz- vs. Divergenzpunkte, 4-Ebenen-Erkennungsarchitektur, zeitliche Korrelation mehrerer Signale |
| Dokument | Inhalt |
|---|---|
| detection/tetragon.md | Empfohlen — Tetragon kprobe, 5 Sonden, die traditionelle + io_uring abdecken, einzige Erkennung der gesamten Kette |
| detection/falco.md | Falco 0.40.0 + krsi 0.1.0 Konfigurationsanleitung, krsi-Interna, Fehlerbehebung |
| detection/wazuh.md | Wazuh + auditd drei Hauptbeschränkungen: io_uring-Blindheit, PID-Korrelationszusammenbruch, Page-Cache-Unsichtbarkeit |
| detection/rule_bypass.md | ThreatBear-Regel-Umgehungsprinzipien, empirische Verifikation der Anti-Umgehung der empfohlenen Regel |