Zranitelnost Nginx CVE-2026-42945 skrytá 18 let: princip, PoC a kompletní analýza opravy

🚨 Kritická zranitelnost Nginx CVE-2026-42945, která v kódu čekala 18 let: princip, PoC a způsob opravy
13. května 2026 bezpečnostní výzkumná organizacedepthfirstspolečně se společností F5 odhalila nejzávažnější zranitelnost v historii NGINX –CVE-2026-42945:
- Skóre CVSS v4.0 je 9,2: jde o kritickou zranitelnost
- Přetečení bufferu na haldě: může vést ke vzdálenému spuštění kódu (RCE)
- 18 let skrytá v kódu: zranitelný kód je v repozitáři od roku 2008
- Celosvětově je zasaženo 9,75 milionu webů: jen v Číně je dotčeno více než 2,54 milionu webů
- PoC je veřejně dostupný: společnosti QiAnXin se podařilo zranitelnost reprodukovat
Jde ohistorickou zranitelnost v jádru NGINX – útočníkovi stačí odeslat jediný upravený požadavek HTTP, aby server vzdáleně převzal.
🔍 Přehled zranitelnosti
Základní údaje
| Atribut zranitelnosti | Hodnota |
|---|---|
| Identifikátor | CVE-2026-42945 |
| Skóre CVSS | v4.0: 9.2 | v3.1: 8.1 |
| Typ zranitelnosti | Přetečení bufferu na haldě (Heap-based Buffer Overflow) |
| Typ hrozby | Vzdálené spuštění kódu (RCE), odmítnutí služby (DoS) |
| Podmínky zneužití | bez autentizace, stačí sestavit požadavek HTTP |
| Zasažená komponenta | ngx_http_rewrite_module(vestavěný modul jádra NGINX) |
| Objevitel | depthfirst (automatizovaný systém ji našel do 6 hodin) |
Rozsah dopadu
- Celosvětově 9,75 milionu webůje zasaženo
- V Číně 2,54 milionu webůje zasaženo
- NGINX obsluhuje zhruba třetinu všech webů světa, takže dopad je mimořádně široký
- Zranitelný kód vznikl vroce 2008 a na objevení čekal18 let
⚠️ Podmínky spuštění
Tři podmínky musí být splněny zároveň
Ke spuštění zranitelnosti musí konfiguracesplňovat danou kombinaci podmínek:
| Podmínka | Popis | Příklad |
|---|---|---|
| 1. Nepojmenovaný záchyt PCRE | direktiva rewrite používá nepojmenovanou zachycující skupinu | $1, $2, $3… |
| 2. Náhradní řetězec obsahuje otazník | řetězec nahrazení obsahuje znak ? | /profile.php?id=$1&tab=$2 |
| 3. Následuje rewrite/if/set | za direktivou rewrite bezprostředně následuje další direktiva | rewrite … last; if (…) { … } |
Ukázka zranitelné konfigurace
# 易受攻击配置
rewrite ^/users/([0-9]+)/profile/(.*)$ /profile.php?id=$1&tab=$2 last;
# 后跟其他指令
if ($arg_debug) {
set $debug_flag 1;
}
tato konfigurace splňuje všechny tři podmínky:nepojmenovaný záchyt $1/$2,otazník v náhradním řetězci,následující direktiva if.
🔬 Princip zranitelnosti
Nekonzistentní stav mezi dvěma fázemi zpracování
Skriptovací engine NGINXzpracovává věci ve dvou fázích:
- První fáze: výpočet potřebné velikosti bufferu
- Druhá fáze: kopírování dat do bufferu
Jádro problému spočívá v chybném řízení příznakuis_args:
| Fáze | Stav is_args | Logika zpracování | Výsledek |
|---|---|---|---|
| Výpočet délky | is_args = 0 | vrací původní délku záchytu | podhodnocená velikost bufferu |
| Kopírování dat | is_args = 1 | volá se ngx_escape_uri, každý bajt se rozšíří na tři | přetečení bufferu na haldě |
Podrobný průběh
- Direktiva rewriteobsahuje nepojmenovaný záchyt $1/$2
- Náhradní řetězecobsahuje ?, čímž nastaví is_args = 1
- Fáze výpočtu délky: použije se nově inicializovaný podřízený engine, is_args = 0
- vrácena původní délka: na haldě se alokuje příliš malý buffer
- Fáze kopírování dat: použije se hlavní engine, is_args = 1
- volání ngx_escape_uri: bajty se rozšíří a buffer přeteče
- Útočníkem řízená data z URIse zapíší za hranici vyhrazené paměti
Způsob zneužití
Heap feng shui napříč požadavky:
- Tělo požadavku POSTvyplní paměť haldy (URI totiž nemůže obsahovat null bajty)
- Data, která přetečoupoškodí ukazatel cleanup sousední struktury ngx_pool_t
- Podvržená struktura ngx_pool_cleanup_sukazuje na system()
- Při zrušení pooluse spustí volání system()
- a dochází k RCE
Dopad ASLR
- ASLR zapnuto: dochází jen k pádu procesu worker (DoS)
- ASLR vypnuto: lze dosáhnout vzdáleného spuštění kódu (RCE)
📊 Zasažené verze
NGINX Open Source
| Rozsah verzí | Opravená verze |
|---|---|
| 0.6.27 – 1.30.0 | 1.31.0, 1.30.1 |
NGINX Plus
| Rozsah verzí | Opravená verze |
|---|---|
| R32 – R36 | R36 P4, R35 P2, R32 P6 |
Další zasažené komponenty
- 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
🔥 Stav PoC
PoC je veřejně dostupný
- Repozitář na GitHubu:https://github.com/DepthFirstDisclosures/Nginx-Rift
- QiAnXin zranitelnost reprodukovala: podařilo se ji ověřit bezpečnostním výzkumníkům centra pro zpravodajství o hrozbách
- Technické detaily jsou zveřejněné: depthfirst publikovala technickou analýzu
- Zneužití v praxi: zatím nebylo zaznamenáno
Jak PoC použít
# 构建容器 ./setup.sh # 启动易受攻击的 NGINX 服务器 docker compose -f env/docker-compose.yml up # 执行 PoC 获取 Shell python3 poc.py --shell
✅ Možnosti opravy
Metoda 1: Aktualizace verze
# 升级到修复版本 NGINX Open Source >= 1.31.0 NGINX Open Source >= 1.30.1 NGINX Plus >= R32 P6 NGINX Plus >= R36 P4 # 升级后重启 NGINX nginx -s reload
Metoda 2: Úprava konfigurace (zmírnění dopadu)
Nahraďtenepojmenované zachycující skupinyskupinamipojmenovanými:
# 易受攻击配置(未命名捕获) 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;
Pojmenovaná zachycující skupinazranitelnost nevyvolá.
Metoda 3: Kontrola konfigurace
Zkontrolujte, zda nepoužíváte zranitelnou konfiguraci:
# 搜索易受攻击的 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/
🔍 Jak byla zranitelnost nalezena
Objev automatizovaným systémem
depthfirstnasadilo svůj bezpečnostní analytický systém:
- Do 6 hodinnašlo 5 problémů
- 4 z nich potvrdil NGINX
- CVE-2026-42945je nejzávažnější z nich
- Sahá až do roku 2008 a vyskytuje se prakticky ve všech standardních sestaveních
Další související zranitelnosti
- CVE-2026-42946: problém s poškozením paměti
- CVE-2026-40701: problém s poškozením paměti
- CVE-2026-42934: problém s poškozením paměti
📝 Shrnutí
CVE-2026-42945je nejzávažnější zranitelností v historii NGINX:
- 18 let skrytá: zranitelný kód je v repozitáři od roku 2008
- CVSS 9,2: přetečení bufferu na haldě umožňuje RCE
- Podmínky spuštění: direktiva rewrite s nepojmenovaným záchytem + otazník v náhradním řetězci + další direktiva za ní
- Rozsah dopadu: celosvětově 9,75 milionu webů, v Číně 2,54 milionu
- Veřejný PoC: repozitář na GitHubu, QiAnXin ji reprodukovala
- Oprava: nová verze nebo použití pojmenovaných zachycujících skupin
Letitá zranitelnost vyplavala na povrch – doporučujeme co nejdříve aktualizovat verzi nebo upravit konfiguraci.
Oficiální oznámení:https://my.f5.com/manage/s/article/K000161019
Repozitář PoC:https://github.com/DepthFirstDisclosures/Nginx-Rift
Technická analýza:https://depthfirst.com/research/nginx-rift