
Laboratorio controllato di iniezione di frame HTTP/2 NGINX per la validazione della patch CVE-2026-42926 e la ricerca difensiva.
Un laboratorio di cybersicurezza controllato per validare e confrontare il comportamento relativo a CVE-2026-42926, un problema di HTTP/2 frame injection che interessa versioni specifiche di NGINX quando viene utilizzata una configurazione proxy vulnerabile.
Questo repository è destinato esclusivamente a ricerca difensiva, validazione di patch, audit di configurazione e riproduzione controllata in laboratorio.
Classificazione: HTTP/2 frame injection Versioni interessate: NGINX
1.29.4fino a1.30.0Versioni corrette: NGINX1.30.1+/1.31.0+
Utilizza questo progetto solo in un ambiente di laboratorio isolato di cui sei proprietario o che sei esplicitamente autorizzato a testare.
Non eseguirlo contro sistemi di terze parti, infrastrutture pubbliche, ambienti condivisi o servizi di produzione senza un'autorizzazione scritta.
Isolamento consigliato:
Il laboratorio verifica se un binario NGINX di destinazione e la relativa configurazione soddisfano le condizioni necessarie per riprodurre il problema, invia una richiesta appositamente costruita alla location di test e ispeziona un logger upstream controllato per verificare la presenza di prove che byte simili a frame HTTP/2 iniettati abbiano raggiunto il lato upstream.
Il normale schema di validazione è:
Risultato atteso:
| File | Descrizione |
|---|---|
README.md | Documentazione del progetto. |
LICENSE | Licenza MIT. |
Dockerfile | Crea un'immagine di laboratorio autonoma con NGINX 1.29.4, PHP CLI/cURL, Python e gli script del progetto. |
docker-compose.yml | Avvia il servizio NGINX vulnerabile, il logger di frame upstream e un runner di validazione opzionale. |
cve_2026_42926_lab.php | Script principale di validazione del laboratorio. Verifica le precondizioni di versione/configurazione, invia la richiesta costruita, ispeziona i log upstream e restituisce un verdetto. |
nginx_vulnerable.conf | Configurazione NGINX di esempio che contiene il pattern proxy vulnerabile utilizzato sia per i confronti con build vulnerabile sia con build corretta. |
docker/nginx_vulnerable.docker.conf | Configurazione NGINX specifica per Docker che usa lo stesso pattern vulnerabile e il service discovery di Compose. |
nginx_config_verify.sh | Helper che verifica se una configurazione NGINX di destinazione contiene il pattern proxy vulnerabile richiesto. |
upstream_frame_logger.py | Logger upstream HTTP/2 raw controllato usato per catturare e ispezionare i frame ricevuti da NGINX. |
run_lab_comparison.sh | Orchestra i confronti tra esecuzioni vulnerabile e corretta. |
.dockerignore | Mantiene i log generati e i metadati IDE fuori dal contesto di build Docker. |
bashpython3phpPer il flusso di lavoro containerizzato:
La configurazione di esempio ascolta sulla porta 80, che di solito richiede privilegi di root. Per un laboratorio locale senza privilegi, modifica listen 80; in nginx_vulnerable.conf con una porta alta disponibile come 8080, quindi usa l'URL di destinazione corrispondente nel comando PHP.
Rendi eseguibili gli script shell:
chmod +x nginx_config_verify.sh run_lab_comparison.sh
Verifica che PHP abbia il supporto cURL:
php -m | grep -i curl
Verifica che ogni binario NGINX possa stampare la propria versione:
/path/to/nginx -V
Il file nginx_vulnerable.conf fornito contiene il pattern di test richiesto:
location /exploit {
proxy_pass http://127.0.0.1:8081;
proxy_http_version 2;
proxy_set_body $request_body;
proxy_set_header Host $host;
proxy_set_header Content-Length $content_length;
}
Dettagli importanti:
proxy_http_version 2 abilita il proxy HTTP/2 verso il logger upstream.proxy_set_body $request_body utilizza un corpo della richiesta controllato dal client.client_max_body_size 20m consente il corpo della richiesta di 16 MiB costruito usato dallo script di validazione.127.0.0.1:8081 di default.La configurazione specifica per Docker in docker/nginx_vulnerable.docker.conf mantiene lo stesso pattern proxy vulnerabile ma ascolta sulla porta del container 8080 e fa da proxy verso il nome del servizio Compose upstream:8081.
Il Dockerfile compila NGINX 1.29.4 dal sorgente e installa gli strumenti PHP/Python richiesti dal laboratorio. Compose esegue quindi tre servizi dalla stessa immagine:
upstream: logger raw dei frame HTTP/2nginx: NGINX 1.29.4 vulnerabile che usa docker/nginx_vulnerable.docker.confrunner: comando di validazione PHP una tantumCompila l'immagine del laboratorio:
docker compose build
Avvia il logger upstream e NGINX vulnerabile:
docker compose up -d upstream nginx
Verifica la versione NGINX inclusa:
docker compose exec nginx nginx -V
Esegui lo script di validazione all'interno della rete Compose:
docker compose --profile run run --rm runner
Il runner usa questi argomenti all'interno del container:
php /lab/cve_2026_42926_lab.php \
http://nginx:8080/exploit \
/lab/upstream_logs \
/lab/nginx_config_verify.sh \
/usr/local/nginx/sbin/nginx \
/lab/docker/nginx_vulnerable.docker.conf \
/exploit
I log upstream generati vengono scritti nella directory host:
./upstream_logs/
Il servizio NGINX è inoltre esposto verso l'host all'indirizzo:
http://localhost:8080/version
Ferma e rimuovi i container del laboratorio:
docker compose down
Avvia il logger upstream controllato:
python3 upstream_frame_logger.py 8081 ./upstream_logs
In un altro terminale, avvia NGINX con la configurazione di esempio:
/path/to/nginx -c "$PWD/nginx_vulnerable.conf"
Esegui lo script di validazione:
php cve_2026_42926_lab.php \
http://localhost/exploit \
./upstream_logs \
./nginx_config_verify.sh \
/path/to/nginx \
"$PWD/nginx_vulnerable.conf" \
/exploit
Ferma NGINX dopo l'esecuzione:
/path/to/nginx -s stop
Se hai modificato NGINX per l'ascolto su un'altra porta, aggiorna il primo argomento. Per esempio:
php cve_2026_42926_lab.php http://localhost:8080/exploit ./upstream_logs ./nginx_config_verify.sh /path/to/nginx "$PWD/nginx_vulnerable.conf" /exploit
Imposta i percorsi dei due binari NGINX ed esegui lo strumento di confronto:
VULNERABLE_NGINX=/usr/local/nginx_1.29.4/sbin/nginx \
PATCHED_NGINX=/usr/local/nginx_1.30.1/sbin/nginx \
bash run_lab_comparison.sh
Override opzionali di configurazione:
VULNERABLE_NGINX=/path/to/vulnerable/nginx \
PATCHED_NGINX=/path/to/patched/nginx \
VULNERABLE_CONFIG="$PWD/nginx_vulnerable.conf" \
PATCHED_CONFIG="$PWD/nginx_vulnerable.conf" \
bash run_lab_comparison.sh
Lo script di confronto scrive:
vulnerable_result.txtpatched_result.txtupstream_logs_vulnerable/upstream_logs_patched/Usa nginx_config_verify.sh direttamente quando vuoi solo verificare se una configurazione contiene il pattern vulnerabile:
./nginx_config_verify.sh /path/to/nginx "$PWD/nginx_vulnerable.conf" /exploit
L'helper verifica la presenza di:
proxy_http_version 2proxy_set_body con una variabileclient_max_body_size di almeno 16 MiBcve_2026_42926_lab.php accetta argomenti posizionali:
php cve_2026_42926_lab.php <target_url> <upstream_log_dir> <config_script> <nginx_binary> <nginx_config> <location> [version_url]
Valori predefiniti:
| Argomento | Valore predefinito |
|---|---|
target_url | http://localhost/exploit |
upstream_log_dir | ./upstream_logs |
config_script | ./nginx_config_verify.sh |
nginx_binary | nginx |
nginx_config | /etc/nginx/nginx.conf |
location | /exploit |
version_url | http://localhost/version |
cve_2026_42926_lab.php restituisce uno di tre verdetti:
| Verdetto | Significato | Codice di uscita |
|---|---|---|
positive | Evidenza di iniezione di frame osservata e correlata all'esecuzione. | 0 |
negative | Precondizioni soddisfatte e nessuna evidenza di iniezione osservata. | 1 |
inconclusive | Una o più precondizioni o controlli delle evidenze non sono riusciti. | 2 |
L'evidenza positiva richiede che lo script correli il marcatore dell'esecuzione, l'header del frame upstream osservato, il flag di frame iniettato e la versione NGINX interessata.
Il logger upstream scrive file JSON con nomi del tipo:
frames_<timestamp>.json
Ogni log contiene metadati dei frame HTTP/2 analizzati, estratti del payload, offset di byte, flag di rilevamento dell'iniezione e campi di correlazione con l'esecuzione.
Lo strumento di confronto archivia directory di log separate per le esecuzioni vulnerabile e corretta, così le evidenze delle due esecuzioni non si mescolano.
Se lo script PHP segnala che l'helper di configurazione non è eseguibile, esegui:
chmod +x nginx_config_verify.sh
Se la richiesta restituisce 413 Request Entity Too Large, aumenta client_max_body_size ad almeno 16m; la configurazione di esempio usa 20m.
Se non viene creato alcun log upstream, verifica che:
upstream_frame_logger.py sia in esecuzione.127.0.0.1:8081./exploit.Se NGINX non riesce a bindare la porta 80, eseguilo con i privilegi appropriati in un ambiente di laboratorio oppure modifica la configurazione usando una porta alta come 8080.
Se il risultato del confronto è inconcludente, controlla vulnerable_result.txt, patched_result.txt e le directory dei log upstream corrispondenti per identificare la precondizione non soddisfatta.
Questo progetto è concesso in licenza sotto la MIT License. Vedi LICENSE per i dettagli.