13. května byla opravena zranitelnost na webovém serveru nginx, oblíbené volbě pro systémy s vysokou zátěží: CVE-2026-42945, což může vést k RCE. Tato zranitelnost se objevila před 18 lety (v roce 2008) ve verzi 0.6.27.
Aby bylo možné jej použít, musí konfigurace serveru obsahovat specifickou kombinaci direktiv, která není přítomna ve všech případech, ale je přítomna na některých místech, například:
přepsat ^(.*) /new?c=1;
nastavit $myvar $1;
vrátit 200 $myvar;
Důležité detaily:
- Nejprve přichází direktiva rewrite, kde (první argument) je regulární výraz s volitelným parametrem (něco v závorkách) nahrazeným (druhým argumentem) cestou obsahující otazník;
- direktiva set (místo ní bude fungovat i druhý přepis nebo if), která použije vybraný parametr z původně přepsané cesty (v tomto případě $1).
Zranitelnost funguje takto:
- první direktiva pro přepisování, když narazí na otazník, nastaví interní příznak is_args, což znamená „nyní shromažďujeme parametry get pro nahrazenou URL adresu, vše je třeba escapovat“, a (to je podstata chyby) zapomene tento příznak na konci své práce resetovat;
- Následná direktiva set při generování hodnoty pro $myvar chybně použije dříve nastavenou hodnotu is_args a zapíše escapovanou hodnotu alokovaného parametru $1 do my_var. Problém je v tom, že vyrovnávací paměť pro $myvar je alokována dříve, před provedením substitucí, a její délka se vypočítává s is_args=0. To znamená, že escapovaná hodnota je delší než alokovaná vyrovnávací paměť, což způsobuje zápis do jiných datových struktur serveru mimo alokovanou vyrovnávací paměť. K dosažení tohoto cíle stačí odeslat požadavek se znaky, které je třeba escapovat, například znaménky plus, v místě parametru regulárního výrazu.
Pokud na hostiteli není ALSR, lze tuto zranitelnost zneužít k vzdálenému spuštění kódu s oprávněními pracovního procesu nginx. PoC (nejedná se o čistý exploit, ale o demonstraci v sandboxu).
Zranitelnost je opravena ve stabilní větvi nginx 1.30.1 a v nové vývojové větvi 1.31.0. potvrzení odkazu.
Je pozoruhodné, že před 14 lety (2012) došlo k podobné chybě již opraveno na jiném místě poblíž.
---
Webové stránky F5 doporučují dočasné zmírnění této zranitelnosti, pokud není možné rychle aktualizovat verzi NGINX. Nahraďte nepojmenované vyhrazené parametry pojmenovanými, což podle nich zabrání projevení zranitelnosti. Příklad odtud:
bylo: přepsat ^/users/([0-9]+)/profile/(.*)$ /profile.php?id=$1&tab=$2 last;
stalo se: přepsat ^/users/(? [0-9]+)/profil/(? .*)$ /profile.php?id=$user_id&tab=$section last;
Zranitelnost nahlásil Zhenpeng (Leo) Lin ze společnosti DepthFirst. Dále nahlásil následující problémy, které byly rovněž opraveny:
- CVE-2026-40701 (spáchat) use-after-free při použití ssl_verify_client+ssl_ocsp (zřejmě bez RCE)
- CVE-2026-42934 (spáchat) čtení za hranice vyrovnávací paměti v analyzátoru UTF-8 může za určitých okolností vést k malému úniku dat nebo k selhání pracovního procesu
- CVE-2026-42946 (spáchat) nadměrná alokace paměti a čtení mimo hranice při použití modulů scgi/uwsgi, problém se projevuje v přítomnosti škodlivého backendu (upstreamu) prostřednictvím zadaných protokolů nebo při překročení kanálu pro komunikaci s backendem, což může vést ke čtení paměti nginx nebo k pádu pracovního procesu.
Zdroj: linux.org.ru
