18-godišnji RCE u nginx (CVE-2026-42945)

Dana 13. svibnja ispravljena je ranjivost u popularnom web poslužitelju nginx, koji se koristi za opterećene sustave: CVE-2026-42945, koja je potencijalno mogla dovesti do RCE. Ranjivost datira još od prije 18 godina (2008. godine) u verziji 0.6.27.

Za njezinu eksploataciju u konfiguraciji poslužitelja potrebna je određena kombinacija direktiva, koja nije univerzalna, ali se ponekad koristi, na primjer:
rewrite ^(.*) \/new?c=1;
set $myvar $1;
return 200 $myvar;

Ključni detalji:

  • prva direktiva je rewrite, gdje (prvi argument) regularni izraz s odabranim parameterom (nešto u zagradama) zamjenjuje se (drugim argumentom) putem koji sadrži znak pitanja;
  • direktiva set (umjesto nje može se koristiti i drugi rewrite ili if), koja koristi odabrani parametrizirani put iz prvotnog prepisanog puta (u ovom slučaju to je $1).

Ranjivost funkcionira ovako:

  • prva direktiva rewrite, pri susretu sa znakom pitanja, postavlja unutarnju oznaku is_args, koja označava «sada prikupljamo GET parametre za zamijenjeni URL, sve treba eskapirati», i (tu leži srž greške) zaboravlja resetirati tu oznaku na kraju svog rada;
  • sljedeća direktiva set, pri formiranju vrijednosti za $myvar, pogrešno primjenjuje prethodno postavljenu is_args, i zapisuje u my_var eskapiranu vrijednost odabranog parametra $1; problem je u tome što se memorija za $myvar rezervira unaprijed, još prije izvođenja zamjena, a njezina se duljina računa s is_args=0, što znači da se eskapirana vrijednost pokazuje dužom od rezerviranog prostora, zbog čega se zapisuje izvan rezerviranog prostora u druge strukture podataka poslužitelja. Da bi se to dogodilo, dovoljno je poslati zahtjev s simbolima koji treba eskapirati, na primjer s plus znakovima, u mjestu gdje je odabran parametar regularnog izraza.

Ako na hostu nema ASLR, tada se ova ranjivost može iskoristiti za daljinsko izvođenje koda s privilegijama procesa nginx, postoji PoC (nije to klasični exploit, demonstracija u sandboxu).

Ranjivost je ispravljena u stabilnoj verziji nginx 1.30.1, i u novoj razvojnoj verziji 1.31.0. link na commit.

Zanimljivo je da je prije 14 godina (2012. godine) slična greška već ispravljena na drugom mjestu u blizini.

——-

Na stranici F5 postoji preporuka za privremeno neutraliziranje ranjivosti u slučaju da brzo ažuriranje verzije nginx-a nije moguće — potrebno je zamijeniti neimenovane parametre s imenovanim, i u tom slučaju, prema njihovim riječima, ranjivost se neće manifestirati. Primjer odatle:
bilo je: rewrite ^/users/([0-9]+)/profile/(.*)$ /profile.php?id=$1&tab=$2 last;
postalo je: rewrite ^/users/(?[0-9]+)/profile/(?

.*)$ /profile.php?id=$user_id&tab=$section last;

Informacije o ranjivosti pružio je Zhenpeng (Leo) Lin iz DepthFirst. Osim toga, on je također izvijestio o sljedećim problemima, koji su također ispravljeni:

  • CVE-2026-40701 (commit) use-after-free prilikom korištenja ssl_verify_client+ssl_ocsp (čini se bez RCE)
  • CVE-2026-42934 (commit) čitanje izvan granica bafera u utf-8 parseru pod specifičnim okolnostima, može dovesti do malog curenja podataka ili rušenja radnog procesa
  • CVE-2026-42946 (commit) prekomjerno izdvajanje memorije i čitanje izvan granica bafera prilikom korištenja scgi/uwsgi modula, problem se manifestira u prisustvu zlonamjernog beckenda (upstream) preko navedenih protokola, ili pri mitm kanalu komunikacije s beckendom, može dovesti do čitanja memorije nginx-a ili rušenja radnog procesa

Izvor: linux.org.ru

Kupite pouzdan hosting za web stranice s DDoS zaštitom, VPS VDS servere 🔥 Kupite pouzdan hosting za web stranice s DDoS zaštitom, VPS VDS servere | ProHoster