
PoC: vollständig unprivilegierter Container-Escape zu Codeausführung auf Knotenebene auf Kubernetes via CVE-2026-31431 Page-Cache-Korruption und gemeinsame Image-Layer. Validierte Implementierung auf Alibaba Cloud ACK, Amazon EKS und Google GKE.
Ein Proof-of-Concept, das demonstriert, wie ein vollständig unprivilegierter Container eine Codeausführung auf Knotenebene in Kubernetes erreichen kann, indem es den Linux-Kernel-Page-Cache-Bug CVE-2026-31431 durch gemeinsam genutzte Container-Image-Layer ausnutzt.
Die grundlegende Angriffsprimitive ist: Jedes privilegierte DaemonSet, das Image-Layer mit einem angreiferkontrollierten Container teilt, kann für einen Container-Ausbruch genutzt werden. Dieses PoC verwendet kube-proxy als konkretes Beispiel, aber die Technik verallgemeinert sich auf jede privilegierte Arbeitslast im Cluster.
Validieren auf Alibaba Cloud ACK, Amazon EKS und Google GKE – ein unprivilegierter Pod schreibt [*] success in das Host-Dateisystem über das privilegierte kube-proxy DaemonSet:
| Alibaba Cloud ACK (kernel 6.6.88) | Amazon EKS (kernel 6.12.79) | Google GKE (kernel 6.12.68) |
|---|---|---|
![]() | ![]() | ![]() |
Haftungsausschluss: Dieses Repository wird ausschließlich zu Bildungs- und Verteidigungszwecken veröffentlicht. Verwenden Sie es ausschließlich auf Systemen, die Ihnen gehören oder für die Sie ausdrückliche Berechtigung zum Testen haben.
CVE-2026-31431 ("Copy Fail") ist eine Linux-Kernel-Sicherheitslücke im Page-Cache-Copy-on-Write (CoW)-Pfad. Ein AF_ALG-Splice-Race erlaubt es einem unprivilegierten Prozess, die Page-Cache-Seiten einer schreibgeschützten Datei zu beschädigen. Die Beschädigung bleibt im Kernel-Page-Cache bestehen und ist für jeden Prozess sichtbar, der die Datei anschließend liest oder ausführt – einschließlich Prozessen in anderen Containern oder auf dem Host.
Weitere Einzelheiten zur ursprünglichen Sicherheitslücke finden Sie unter copy.fail.
Der Angriff nutzt drei Eigenschaften aus, die in Kubernetes-Clustern häufig gemeinsam auftreten:
privileged: true, hostNetwork: true, breite Capabilities usw.), die regelmäßig Binärdateien aus ihrem Image ausführen.Wenn diese Bedingungen zusammentreffen, kann ein unprivilegierter Pod eine Binärdatei in einem gemeinsamen Image-Layer beschädigen, und ein privilegiertes DaemonSet auf demselben Knoten wird die beschädigte Binärdatei unwissentlich mit seinen erhöhten Privilegien ausführen – was eine vollständige Codeausführung auf Knotenebene erreicht.
Das Angriffsziel ist NICHT auf kube-proxy beschränkt. Jedes privilegierte DaemonSet (Überwachungsagenten, CNI-Plugins, Log-Sammler, Sicherheitsagenten usw.), dessen Container-Image Layer mit einem angreiferkontrollierten Image teilt, ist ein mögliches Ziel.
Die Angriffskette besteht aus drei Phasen: Page-Cache-Beschädigung, containerübergreifende Verbreitung und privilegierte Ausführung.
Das AF_ALG (Krypto)-Subsystem des Kernels stellt eine socketbasierte Schnittstelle für kryptografische Operationen im userspace bereit. Der Exploit missbraucht eine Race-Condition in der Art und Weise, wie der Kernel splice() von einer Datei in einen AF_ALG-Socket behandelt:
authencesn(hmac(sha256),cbc(aes)) gebunden ist.MSG_MORE, um dem Kernel mitzuteilen, dass weitere Daten erwartet werden.splice() Sie den Inhalt der Zieldatei von einem fd → Pipe → AF_ALG-Socket.Der Exploit wiederholt dies für jedes 4-Byte-Fenster, bis alle zwischengespeicherten Seiten der Zielbinärdatei mit einem benutzerdefinierten Payload überschrieben sind.
Es ist keine Schreibberechtigung für die Datei erforderlich. Die Datei auf der Festplatte bleibt unverändert – nur der im Arbeitsspeicher befindliche Page-Cache wird beschädigt.
Container-Laufzeiten verwenden Overlay-Dateisysteme. Wenn zwei Container denselben Image-Layer teilen, bedient der Kernel ihre Dateilesevorgänge von denselben Page-Cache-Seiten.
Der Angreifer baut sein PoC-Image FROM demselben Basis-Image wie das privilegierte Ziel-DaemonSet. Da beide Container dasselbe Overlay-Lower-Verzeichnis teilen, werden Binärdateien im gemeinsamen Layer auf identische Page-Cache-Seiten abgebildet.
Wenn der unprivilegierte PoC-Container den Page-Cache einer Binärdatei beschädigt, ist die Beschädigung sofort für den privilegierten Container auf demselben Knoten sichtbar – ohne jegliche containerübergreifende Kommunikation.
Wenn das privilegierte DaemonSet als nächstes eine beschädigte Binärdatei ausführt (durch seinen normalen Betriebszyklus), lädt der Kernel die beschädigten Page-Cache-Seiten. Der Payload des Angreifers läuft mit den vollen Privilegien des DaemonSets – möglicherweise einschließlich:
Der Payload in diesem PoC (payload/payload.c) mountet einfach das Host-Root-Dateisystem und schreibt eine Markierungsdatei nach /root/res als Beweis für die Codeausführung auf Knotenebene.
┌──────────────────────────┐ ┌──────────────────────────┐
│ PoC Container │ │ Privileged DaemonSet │
│ (unprivileged) │ │ (e.g. kube-proxy, │
│ │ │ monitoring agent, etc.)│
│ 1. Open target binary │ │ │
│ (read-only) │ │ │
│ │ │ │
│ 2. AF_ALG splice race │ │ │
│ corrupts page cache │ │ │
│ │ │ │ │
└──────────┼───────────────┘ └──────────────────────────┘
│ │
▼ │
┌─────────────────────┐ │
│ Kernel Page Cache │ │
│ │◄────────────────────┘
│ Shared-layer binary │ 3. DaemonSet executes the
│ (CORRUPTED) │ corrupted binary
│ contains attacker's │ → loads corrupted pages
│ payload bytes │ → payload runs with
└─────────────────────┘ DaemonSet's privileges
Das PoC wurde erfolgreich auf den folgenden verwalteten Kubernetes-Plattformen validiert: