← Zpět na seznam

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

itadol5j

Nginx CVE-2026-42945

🚨 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

  1. Direktiva rewriteobsahuje nepojmenovaný záchyt $1/$2
  2. Náhradní řetězecobsahuje ?, čímž nastaví is_args = 1
  3. Fáze výpočtu délky: použije se nově inicializovaný podřízený engine, is_args = 0
  4. vrácena původní délka: na haldě se alokuje příliš malý buffer
  5. Fáze kopírování dat: použije se hlavní engine, is_args = 1
  6. volání ngx_escape_uri: bajty se rozšíří a buffer přeteče
  7. Ú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