18-letna RCE v nginx (CVE-2026-42945)

13. maja je odpravljena ranljivost v priljubljenem spletnem strežniku nginx za obremenjene sisteme: CVE-2026-42945, ki lahko potencialno privede do RCE. Ranljivost se je pojavila pred 18 leti (leta 2008) v različici 0.6.27.

Za njeno izkoriščanje mora biti v strežnikovi konfiguraciji določen določen nabor direktiv, ki sicer nima splošne prisotnosti, ampak se lahko pojavi, na primer takole:
rewrite ^(.*) /new?c=1;
set $myvar $1;
return 200 $myvar;

Pomembne podrobnosti:

  • najprej je direktiva rewrite, kjer se (prvi argument) regularni izraz z izpostavljenim parametrom (nekaj v okroglih oklepajih) nadomesti z (drugim argumentom) potjo, ki vsebuje vprašaj;
  • direktiva set (namesto nje lahko uporabimo tudi drugi rewrite ali if), ki uporablja izpostavljeni parameter iz prepisane poti (v tem primeru je to $1).

Ranljivost deluje takole:

  • prva direktiva rewrite, ko naleti na vprašaj, nastavi notranji zastavico is_args, kar pomeni 'zdaj zbiramo get-parametre za nadomestni url, vse je treba ustrezno obdelati', in (v tem je bistvo napake) pozabi ponastaviti to zastavico na koncu svojega dela;
  • nato direktiva set, ko oblikuje vrednost za $myvar, napačno uporabi prej nastavljeno is_args in zapiše v my_var obdelano vrednost izpostavljenega parametra $1; težava je, da se pomnilnik za $myvar dodeli prej, še pred izvedbo nadomestitev, in njegova dolžina se šteje z is_args=0, torej je obdelana vrednost daljša od dodeljenega pomnilnika, kar povzroči, da se zapis zgodi izven dodeljenega pomnilnika v druge strukture podatkov strežnika. Da bi se to zgodilo, je dovolj poslati zahtevo s simboli, ki jih je treba obdelati, na primer z znakom 'plus', v mestu izpostavitve parametra regularnega izraza.

Če na strežniku ni ALSR, lahko to ranljivost izkoristimo za oddaljeno izvajanje kode s pravicami delovnega procesa nginx, obstaja PoC (tam ni izkoriščenja v čisti obliki, ampak demonstracija v peskovniku).

Ranljivost je bila odpravljena v stabilni različici nginx 1.30.1 in v novi razvojni različici 1.31.0. povezava do commit-a.

Zanimivo je, da je bila pred 14 leti (leta 2012) podobna napaka že odpravljena na drugem mestu blizu.

——-

Na spletni strani F5 je priporočilo za začasno nevtralizacijo ranljivosti v primeru, da hitra posodobitev verzije nginx ni mogoča — treba je zamenjati neimenovane dodelitve parametrov z imenskimi, in v tem primeru, po njihovih besedah, ranljivost ne bo prišla do izraza. Primer od tam:
bilo: rewrite ^/users/([0-9]+)/profile/(.*)$ /profile.php?id=$1&tab=$2 last;
postalo: rewrite ^/users/(?<user_id>[0-9]+)/profile/(?<section>.*)$ /profile.php?id=$user_id&tab=$section last;

Informacije o ranljivosti je posredoval Zhenpeng (Leo) Lin iz DepthFirst. Poleg tega je poročal tudi o naslednjih težavah, ki so prav tako odpravljene:

  • CVE-2026-40701 (commit) use-after-free pri uporabi ssl_verify_client+ssl_ocsp (verjetno brez RCE)
  • CVE-2026-42934 (commit) branje zunaj meje pomnilnika v utf-8 parserju pri specifičnih okoliščinah, lahko povzroči majhno uhajanje podatkov ali sesutje delovnega procesa
  • CVE-2026-42946 (commit) pretirana dodelitev pomnilnika in branje zunaj meje pomnilnika pri uporabi modulov scgi/uwsgi, težava se pojavi ob prisotnosti zlonamernega backend-a (upstream) preko navedenih protokolov, ali pri mitm kanalu komunikacije z backend-om, lahko povzroči branje pomnilnika nginx ali sesutje delovnega procesa

Izvor: linux.org.ru

Kupite zanesljivo gostovanje za spletne strani z zaščito pred DDoS, VPS VDS strežniki 🔥 Kupite zanesljivo gostovanje za spletne strani z zaščito pred DDoS, VPS VDS strežniki | ProHoster