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
Tools/GitHubGitHub/baba01hacker666/cve-2026-23111
Privilege EscalationSpeicherforensikSchwachstellenanalyseExploitationReverse EngineeringPapers & ForschungLernen & BildungBinary-Exploitation
GitHubbaba01hacker666/cve-2026-23111

CVE-2026-23111

Linux-Kernel nf_tables Use-After-Free (CVE-2026-23111) — LPE-PoC

Repository anzeigen
728vor 2 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-2026-23111 PoC

Linux Kernel nf_tables Use-After-Free (Lokale Privilegienerweiterung) poc von baba01hacker

Zusammenfassung der Schwachstelle

  • CVE: CVE-2026-23111
  • Typ: Use-After-Free (CWE-416)
  • CVSS: 7.8 (HOCH)
  • Komponente: net/netfilter/nf_tables_api.c — nft_map_catchall_activate()
  • Ursache: Umgekehrte Genmask-Prüfung führt zu einem Verlust des Chain-Referenzzählers während des Transaktionsabbruchs

Betroffene Kernel-Versionen

VersionsbereichBehoben in
6.19-rc1 bis 6.19-rc86.19-rc9+
6.13 bis 6.18.96.18.10
6.7 bis 6.12.696.12.70
6.4.1 bis 6.5.xEOL (kein stabiler Fix)
6.3.10 bis 6.3.xEOL
6.0.x, 6.2.xEOL
6.1.36 bis 6.1.1626.1.163
5.15.121 bis 5.15.1995.15.200
5.10.188+, 5.4.262+, 4.19.316+Verschiedene LTS

Details zur Schwachstelle

CVE-2026-23111 ist ein nf_tables Use-After-Free, verursacht durch eine umgekehrte Generation-Mask-Prüfung in nft_map_catchall_activate(). Während des Rollbacks einer fehlgeschlagenen Transaktion müssen Catchall-Verdict-Map-Elemente, die durch NFT_MSG_DELSET deaktiviert wurden, reaktiviert werden, sodass Referenzen wie NFT_GOTO-Chain-Referenzen wiederhergestellt werden. Der Catchall-Aktivierungspfad übersprang stattdessen inaktive Elemente und verarbeitete aktive, sodass deaktivierte Catchall-Elemente nicht wiederhergestellt wurden.

Die korrekte Nicht-Catchall-Aktivierungslogik ist:

if (nft_set_elem_active(ext, iter->genmask))
    return 0; /* skip active, process inactive */

Der anfällige Catchall-Pfad verwendete die entgegengesetzte Bedingung:

if (!nft_set_elem_active(ext, genmask))
    continue; /* skip inactive, process active */

Wenn eine gelöschte Pipapo-Verdict-Map zurückgesetzt wird, verhindert dies, dass nft_setelem_data_activate() für das inaktive Catchall-Element ausgeführt wird. Für NFT_JUMP/NFT_GOTO-Verdict-Daten wird die von nft_data_hold() übernommene Chain-Referenz daher nicht wiederhergestellt. Wiederholen der Abbruch-/Umschalt-/Lösch-Sequenz kann chain->use auf Null bringen, während eine andere Regel noch eine gültige Verdict-Referenz auf die Chain enthält. Ein späteres DELCHAIN kann dann die Chain freigeben, während sie noch erreichbar ist, was zu einer UAF führt.

Auslöse-Ablauf

Create table, base chain, victim chain, and pipapo verdict map with catchall NFT_GOTO -> victim
        |
Batch 1: delete the pipapo set, then force a transaction error
        |
Abort path calls nft_map_catchall_activate(), but the inverted check skips the inactive catchall
        |
The catchall remains inactive and the victim chain reference count is not restored
        |
Batch 2: commit a benign transaction to toggle the generation cursor
        |
Batch 3: delete the pipapo set successfully, decrementing the victim chain reference again
        |
Batch 4: delete the victim chain while the base-chain verdict still references it
        |
Use-after-free when packet evaluation or rule dumping follows the dangling verdict reference

Der Upstream-Fix besteht darin, die Negierung zu entfernen, sodass nft_map_catchall_activate() zu nft_mapelem_activate() passt: Aktive Elemente werden übersprungen, inaktive werden reaktiviert, und Verdict-/Objekt-Referenzen werden während der Abbruchbehandlung wiederhergestellt.

Test Only

python3 CVE-2026-23111-checker.py --detailed
python3 CVE-2026-23111-checker.py --json

Run PoC One-Liner

wget https://raw.githubusercontent.com/Baba01hacker666/CVE-2026-23111/refs/heads/master/exploit_full.c && gcc -Wall -O2 -o exploit_full exploit_full.c -lnftnl -lmnl && ./exploit_full -d

v2 Fallback One-Liner

Use this if the full/v1 PoC fails on the target kernel.

wget https://raw.githubusercontent.com/Baba01hacker666/CVE-2026-23111/refs/heads/master/exploit_v2.c && gcc -Wall -O2 -o exploit_v2 exploit_v2.c -lnftnl -lmnl && ./exploit_v2 -d

Local Build

Installieren Sie zuerst die Build-Abhängigkeiten, wenn der Compiler die Header libmnl/libmnl.h oder libnftnl nicht findet:

scripts/install-build-deps.sh
# or
make deps
make          # Build exploit (PoC only)
make v2       # Build v2 exploit (FuzzingLabs approach — try when v1 fails)
make full     # Build full LPE exploit
make v3       # Build v3 calibrated eval-path variant
make run-d    # Run PoC with debug output
make run-v2-d # Run v2 with debug output
make run-v3   # Show v3 usage/help
make run-full # Run full LPE

Exploit-Stufen

Phase 1: UAF-Trigger ✅ FUNKTIONIERT

Erstellt ein Pipapo-Map-Set mit einem Catchall-Element (goto Victim-Chain) und nutzt dann den umgekehrten Genmask-Fehler während eines DELSET-Abbruchs, um chain->use zu korrumpieren. Nach dem Erhöhen des Generierungszählers gelingt DELCHAIN trotz hängender Referenzen und gibt die Chain frei.

Phase 2: KASLR-Leak ✅ FUNKTIONIERT

Nach der UAF wird der Speicher von chain->name freigegeben. Wir sprayen seq_operations-Strukturen (32 Bytes), indem wir /proc/self/stat öffnen, um den freigegebenen Slab-Cache-Slot zurückzuerobern. Das Zurücklesen der unmittelbaren Verdict-Regel der Basis-Chain über NFT_MSG_GETRULE gibt den zurückgewonnenen Chain-Namen aus und leakt Kernel-Funktionszeiger. Die Zeiger-Validierung stellt sicher, dass nur kanonische Kernel-Textadressen akzeptiert werden.

Phase 3: Heap-Adress-Leak ✅ FUNKTIONIERT

Löst die UAF erneut mit einem längeren Chain-Namen aus (140 Bytes → kmalloc-cg-192), sprayt dann nft_rule-Objekte, um den Speicher zurückzuerobern. Die geleakten list_head-Zeiger geben Heap-Adressen im Direct-Map-Bereich preis.

Phase 4: Kontrollfluss-Hijack & ROP 🔧 Framework vollständig

  • Zwei 192-Byte-Regeln mit kontrollierten Daten werden für gefälschte nft_expr_ops und nft_rule_blob gesprayt
  • Heap-Adressen aus Phase 3 werden verwendet, um gefälschte Blob → gefälschte expr_ops-Zeiger zu verketten
  • 128-Byte-Table-Userdata-Spray, um das freigegebene blob_gen_0 der Chain zu überschreiben
  • ROP-Kette: commit_creds(&init_cred) → switch_task_namespaces → swapgs; iretq
  • ROP-Gadgets werden automatisch aus /proc/kcore gescannt
  • Ein Paket wird durch die Basis-Chain gesendet, um expr->ops->eval zu übernehmen

v2 Exploit (FuzzingLabs-Ansatz)

Der v2-Exploit (exploit_v2.c) verwendet die im FuzzingLabs-Writeup beschriebenen Techniken und kann verwendet werden, wenn der v1-PoC fehlschlägt. Wichtige Unterschiede:

Komponentev1 (exploit.c)v2 (exploit_v2.c)
UAF-TriggerEin Set + sofortige goto-RegelZwei Sets (FuzzingLabs-Stil) + Lookup-Regel
KASLR-RücklesenNFT_MSG_GETRULE (Regel-Dump)NFT_MSG_GETELEM (Element-Dump) + GETRULE-Fallback
Heap-Leaknft_rule-Spray + list_head-Leakinit_ipc_ns-beliebiges-Lesen-Kette
ROP-Hostnft_regeln + Table-Userdatamsg_msg-2k (2048-Byte-Nachricht)
Hijack-TriggerPaket-Evaluierung auf sofortiger gotoPaket-Evaluierung auf überlebendem Set-Catchall
Privilegienerweiterungcommit_creds + switch_task_namespacesmodprobe_path-Überschreiben + SELinux deaktivieren
Rückgabepfadswapgs; iretqmsleep() (bleibt im Kernel)

v2 Leak-Kette (init_ipc_ns beliebiges Lesen)

init_ipc_ns + 0x118  →  msg_ids.xa_head  →  msg_queue (tagged pointer)
msg_queue + 0xc0     →  q_messages.next  →  msg_msg heap address

Jeder Schritt verwendet die freigegebene Chain-Struktur als beliebiges-Lesen-Primitiv: Table-Userdata (128 Bytes) erobert die freigegebene nft_chain in kmalloc-cg-128 zurück, und eine Kernel-Adresse, die bei Offset 0x40 (wo chain->name lebt) platziert wird, wird vom Kernel während der SET_B-Element-Dumps dereferenziert.

v3 Heap-Kalibrierung und ROP-Kette (modprobe_path)

Tool herunterladen