CVE-2026-42945: la vulnerabilità nascosta per 18 anni in Nginx — funzionamento, PoC e rimedi

🚨 CVE-2026-42945: la vulnerabilità critica nascosta per 18 anni in Nginx — funzionamento, PoC e rimedi
Il 13 maggio 2026, l'azienda di ricerca sulla sicurezza depthfirst ha divulgato insieme a F5 la vulnerabilità più grave nella storia di NGINX — CVE-2026-42945:
- Punteggio CVSS v4.0: 9.2: rientra tra le vulnerabilità ad alta gravità
- Buffer overflow nell'heap: può portare all'esecuzione remota di codice (RCE)
- Nascosta per 18 anni: presente nel codebase dal 2008
- Colpisce 9,75 milioni di siti nel mondo: oltre 2,54 milioni di siti web interessati in Cina
- PoC reso pubblico: Qianxin lo ha già replicato con successo
Si tratta di una vulnerabilità storica del modulo centrale di NGINX: basta una singola richiesta HTTP appositamente costruita perché un attaccante prenda il controllo remoto del server.
🔍 Panoramica della vulnerabilità
Informazioni di base
| Proprietà della vulnerabilità | Dettagli |
|---|---|
| ID vulnerabilità | CVE-2026-42945 |
| Punteggio CVSS | v4.0: 9.2 | v3.1: 8.1 |
| Tipo di vulnerabilità | Buffer overflow basato su heap (Heap-based Buffer Overflow) |
| Tipo di minaccia | Esecuzione remota di codice (RCE), denial of service (DoS) |
| Condizioni di sfruttamento | Nessuna autenticazione richiesta: basta costruire una richiesta HTTP |
| Componente interessato | ngx_http_rewrite_module (modulo integrato di NGINX) |
| Scoperta da | depthfirst (individuata dal sistema automatico in 6 ore) |
Ambito di diffusione
- 9,75 milioni di siti nel mondointeressati
- 2,54 milioni di siti web in Cinainteressati
- NGINX ospita circa 1/3 dei siti web mondiali, la superficie d'impatto è enorme
- Il codice risale al 2008, per una latenza di 18 anni
⚠️ Condizioni di innesco
Le tre condizioni devono verificarsi contemporaneamente
L'innesco della vulnerabilità richiede una configurazione che soddisfi una precisa combinazione di condizioni:
| Condizione | Descrizione | Esempio |
|---|---|---|
| 1. Catture PCRE senza nome | la direttiva rewrite usa gruppi di cattura senza nome | $1, $2, $3… |
| 2. Stringa di sostituzione con punto interrogativo | la stringa di sostituzione contiene il carattere ? | /profile.php?id=$1&tab=$2 |
| 3. Seguita da rewrite/if/set | alla direttiva rewrite seguono subito altre direttive | rewrite … last; if (…) { … } |
Esempio di configurazione vulnerabile
# 易受攻击配置
rewrite ^/users/([0-9]+)/profile/(.*)$ /profile.php?id=$1&tab=$2 last;
# 后跟其他指令
if ($arg_debug) {
set $debug_flag 1;
}
Questa configurazione soddisfa contemporaneamente le tre condizioni:catture senza nome $1/$2, stringa di sostituzione con ?, seguita dalla direttiva if.
🔬 Come funziona la vulnerabilità
Incoerenza di stato nell'elaborazione in due fasi
Il motore di scripting di NGINXutilizza un'elaborazione in due fasi:
- Prima fase: calcolo della dimensione del buffer necessaria
- Seconda fase: copia dei dati nel buffer
Il cuore della vulnerabilità è un errore nella gestione del flag is_args:
| Fase | Stato di is_args | Logica di elaborazione | Risultato |
|---|---|---|---|
| Fase di calcolo della lunghezza | is_args = 0 | restituisce la lunghezza originale della cattura | sottovalutazione della dimensione del buffer |
| Fase di copia dei dati | is_args = 1 | viene chiamata ngx_escape_uri: ogni byte si espande fino a 3 byte | buffer overflow nell'heap |
Flusso dettagliato
- La direttiva rewritecontiene catture senza nome $1/$2
- la stringa di sostituzionecontiene ? e attiva is_args = 1
- Fase di calcolo della lunghezza: viene usato un sotto-motore appena inizializzato, is_args = 0
- restituisce la lunghezza originale: viene allocato un buffer heap troppo piccolo
- Fase di copia dei dati: viene usato il motore principale, is_args = 1
- viene chiamata ngx_escape_uri: i byte si espandono e il buffer va in overflow
- I dati URI controllati dall'attaccantevengono scritti nella zona di overflow
Tecnica di sfruttamento
Heap Feng Shui su più richieste:
- Corpo delle richieste POSTper lo spray della memoria heap (l'URI non può contenere byte nulli)
- I dati in overflowcorrompono i puntatori cleanup dell'ngx_pool_t adiacente
- Viene falsificato ngx_pool_cleanup_s, che punta a system()
- Alla distruzione del poolviene innescata la chiamata a system()
- realizzando la RCE
Impatto di ASLR
- Con ASLR attivo: si ottiene solo il crash del processo worker (DoS)
- Con ASLR disattivo: è possibile ottenere l'esecuzione remota di codice (RCE)
📊 Versioni interessate
NGINX Open Source
| Intervallo di versioni | Versioni corrette |
|---|---|
| 0.6.27 – 1.30.0 | 1.31.0, 1.30.1 |
NGINX Plus
| Intervallo di versioni | Versioni corrette |
|---|---|
| R32 – R36 | R36 P4, R35 P2, R32 P6 |
Altri componenti interessati
- NGINX Instance Manager: 2.16.0 – 2.21.1
- NGINX App Protect WAF: 4.9.0 – 5.8.0
- NGINX Ingress Controller: 3.5.0 – 5.4.1
- NGINX Gateway Fabric: 1.3.0 – 2.5.1
- F5 DoS for NGINX: 4.8.0
🔥 Stato del PoC
PoC reso pubblico
- Repository GitHub:https://github.com/DepthFirstDisclosures/Nginx-Rift
- Qianxin lo ha replicato: i ricercatori del centro di threat intelligence lo hanno replicato con successo
- Dettagli tecnici resi pubblici: depthfirst ha pubblicato l'analisi tecnica
- Sfruttamento in the wild: non ancora rilevato
Modalità d'uso del PoC
# 构建容器 ./setup.sh # 启动易受攻击的 NGINX 服务器 docker compose -f env/docker-compose.yml up # 执行 PoC 获取 Shell python3 poc.py --shell
✅ Rimedi
Metodo 1: aggiornare la versione
# 升级到修复版本 NGINX Open Source >= 1.31.0 NGINX Open Source >= 1.30.1 NGINX Plus >= R32 P6 NGINX Plus >= R36 P4 # 升级后重启 NGINX nginx -s reload
Metodo 2: modificare la configurazione (mitigazione)
Sostituire le catture senza nome con le catture con nome:
# 易受攻击配置(未命名捕获) rewrite ^/users/([0-9]+)/profile/(.*)$ /profile.php?id=$1&tab=$2 last; # 修复后配置(命名捕获) rewrite ^/users/(?[0-9]+)/profile/(?.*)$ /profile.php?id=$user_id&tab=$section last;
Le catture con nome non innescano la vulnerabilità.
Metodo 3: verificare la configurazione
Controllare la presenza di configurazioni vulnerabili:
# 搜索易受攻击的 rewrite 指令 grep -E "rewrite.*\$[0-9]+.*\?.*(rewrite|if|set)" /etc/nginx/nginx.conf grep -rE "rewrite.*\$[0-9]+.*\?.*(rewrite|if|set)" /etc/nginx/conf.d/
🔍 Come è stata scoperta
Scoperta automatizzata
depthfirst: il sistema di analisi della sicurezza
- in 6 oreha individuato 5 problemi
- 4 confermati da NGINX
- CVE-2026-42945è la vulnerabilità più grave
- riconducibile al 2008, presente in quasi tutte le build standard
Altre vulnerabilità correlate
- CVE-2026-42946: problema di corruzione della memoria
- CVE-2026-40701: problema di corruzione della memoria
- CVE-2026-42934: problema di corruzione della memoria
📝 Conclusioni
CVE-2026-42945è una delle vulnerabilità più gravi nella storia di NGINX:
- 18 anni di latenza: il codice risale al 2008
- CVSS 9.2: buffer overflow nell'heap, con possibile RCE
- Condizioni di innesco: direttiva rewrite con catture senza nome + stringa di sostituzione con ? + altre direttive a seguire
- Diffusione: 9,75 milioni di siti nel mondo, 2,54 milioni in Cina
- PoC pubblico: repository GitHub + replica riuscita di Qianxin
- Rimedi: aggiornare la versione o usare catture con nome
Una vulnerabilità latente da 18 anni è ormai emersa: si consiglia di aggiornare o modificare la configurazione al più presto.
Comunicato ufficiale:https://my.f5.com/manage/s/article/K000161019
Repository del PoC:https://github.com/DepthFirstDisclosures/Nginx-Rift
Analisi tecnica:https://depthfirst.com/research/nginx-rift