13. května byla opravena zranitelnost v populárním webovém serveru nginx určeném pro zatížené systémy: CVE-2026-42945, která mohla potenciálně vést k RCE. Zranitelnost se objevila před 18 lety (v roce 2008) ve verzi 0.6.27.
Pro její zneužití musí být v konfiguraci serveru určité kombinace direktiv, které nemusí být všude přítomné, ale někde mohou, například takovéto:
rewrite ^(.*) /new?c=1;
set $myvar $1;
return 200 $myvar;
Podstatné detaily:
- nejprve je zde direktiva rewrite, kde (první argument) regulární výraz s vybraným parametrem (něco v kulatých závorkách) je nahrazeno (druhým argumentem) cestou, která obsahuje otazník;
- direktiva set (místo ní může také fungovat druhý rewrite nebo if), která používá vybraný parametr z přepsané cesty (v tomto případě $1).
Zranitelnost funguje takto:
- první direktiva rewrite, která narazí na otazník, nastaví vnitřní příznak is_args, který znamená "nyní shromažďujeme GET parametry pro nahrazenou URL, vše je třeba escapovat", a (v tom je podstata chyby) zapomene resetovat tento příznak na konci své práce;
- následující direktiva set, při vytváření hodnoty pro $myvar, chybně aplikuje dříve nastavený is_args a zapíše do my_var escapovanou hodnotu vybraného parametru $1; problém je v tom, že vyrovnávací paměť pro $myvar je alokována dříve, ještě před provedením substitucí, a její délka je počítána bez is_args=0, to znamená, že escapovaná hodnota se ukáže být delší než vymezený vyrovnávací prostor, což způsobí, že zápis probíhá mimo vymezený vyrovnávací prostor do jiných datových struktur serveru. K tomu, aby se to stalo, stačí poslat požadavek se znaky, které podléhají escapování, například znaky "plus", v místě vymezení parametru regulárního výrazu.
Pokud na hostiteli není ALSR, může být tato zranitelnost zneužita pro vzdálené provádění kódu s právy pracovníka nginx, je zde PoC (není to čistý exploit, je to demonstrace v sandboxu).
Zranitelnost byla opravena ve stabilní větvi nginx 1.30.1 a v nové vývojové verzi 1.31.0. odkaz na commit.
Je zajímavé, že před 14 lety (v roce 2012) byla podobná chyba již opravena na jiném místě poblíž.
——-
Na stránkách F5 je doporučení pro dočasnou neutralizaci zranitelnosti v případě, že není možné rychle aktualizovat verzi nginx — je třeba nahradit nepojmenované parametry pojmenovanými, a v tom případě, podle jejich slov, se zranitelnost neprojeví. Příklad odtud:
bylo: rewrite ^/users/([0-9]+)/profile/(.*)$ /profile.php?id=$1&tab=$2 last;
stalo: rewrite ^/users/(?<user_id>[0-9]+)/profile/(?<section>.*)$ /profile.php?id=$user_id&tab=$section last;
Informace o zranitelnosti byla poskytnuta Zhenpeng (Leo) Lin z DepthFirst. Dále on také informoval o následujících problémech, které byly také opraveny:
- CVE-2026-40701 (commit) use-after-free při použití ssl_verify_client+ssl_ocsp (zdá se bez RCE)
- CVE-2026-42934 (commit) čtení za hranicemi bufferu v utf-8 parseru za specifických okolností, může vést k malé úniku dat nebo zhroucení pracovního procesu
- CVE-2026-42946 (commit) nadměrné přidělení paměti a čtení za hranicemi bufferu při použití modulů scgi/uwsgi, problém se projevuje při přítomnosti zlomyslného backendu (upstream) prostřednictvím uvedených protokolů, nebo při MITM útoku na kanál komunikace s backendem, může vést ke čtení paměti nginx nebo zhroucení pracovního procesu
Zdroj: linux.org.ru
