TL; DRNakon što je naišao na treće prelijevanje bafera otkriveno 2026. godine (i, prema F5, RCE ako nema ASLR-a) tokom rada s regexp-ovima i varijablama, programer Freenginxa Maxim Dunin odlučio je da je vrijeme da to zaustavi i dodao je provjeru veličine varijable svom proizvodu prije pisanja podataka u nju. Nginx je od tada kopirao ovu funkciju, dajući nadu da će se novi CVE-ovi povezani s ovim problemom eliminirati.
A sada detalji.
19. juna je napravljeno počiniti u Freenginxu, koji dodaje završno polje deskriptoru varijable, koje označava kraj bafera. Ranije je postojao samo pokazivač na njegov početak (poz), potrebna dužina se (i još uvijek se) izračunavala unaprijed, a do trenutka kada su se podaci kopirali u varijablu, pretpostavljalo se da će ispravno izračunata dužina garantovati da će se podaci uklopiti u bafer. Nažalost, ovo se već dva puta pokazalo netačnim u maju 2026. godine zbog raznih propusta.1 (linux.org.ru), 2 (linux.org.ru)), što je dovelo do prepunjenja bafera i teških posljedica. Sada, kada se kreira bafer varijable, popunjava se i pokazivač na njegov kraj, a prije upisivanja podataka u varijablu, ako podaci ne odgovaraju, obrada zahtjeva će se kontrolirano završiti s greškom. To znači da greške u izračunavanju dužine mogu i dalje postojati, ali neće trošiti memoriju; samo će neuspjeh u obradi određenog HTTP zahtjeva. Sljedeće izmjene (2 (freenginx.org), 3 (freenginx.org)) slična zaštita je dodana i drugim dijelovima koda, uključujući kod za evidentiranje pristupa. Verzija je objavljena 7. jula Freenginx 1.31.3, što uključuje ovu ispravku.
15. jula, nginx je preuzeo ove commitove (1 (github.com), 2 (github.com), 3 (github.com), iz nekog razloga zamjenjujući drugi i treći u lancu), problem je bio dodijeljen CVE-2026-42533, a F5 je objavio službenu SA (f5.com).
Što se tiče specifične ranjivosti ovog puta: ona se manifestuje korištenjem map direktive sa regexp-ovima sa ekstrahovanim parametrima. Što se tiče ostalih uslova potrebnih za njeno aktiviranje, tekst u opisu commita i tekst u SA se neznatno razlikuju: SA navodi da se sljedeći mora izračunati određeni string, koji koristi ekstrahovani parametar koji je ostao od mape, prije rezultata te iste mape. U opisu commita u primjeru, između ovih koraka, varijabla koja sadrži ekstrahovani parametar se također poništava. Međutim, malo je vjerovatno da će se ovo dogoditi u većini pokrenutih nginx-ova, te je stoga ranjivost pogodila malo ljudi. Također vrijedi napomenuti da se ispravka za izračunavanje dužine posebno za ovaj slučaj ne nalazi u commit-ovanim izmjenama (ili sam loše tražio?), postoji samo zaštita koja problem pretvara u kontrolisani neuspjeh HTTP zahtjeva. Iako su neke ispravke dodane u freenginx 19. jula (5bfb, 7622, b906) izračunavanje dužine za sličnu situaciju, ali nije odmah jasno da li je to slučaj ili ne.
Ranjivost se pojavila u verziji nginx 0.9.6, a ispravke su uključene u verzije freenginx 1.31.3, nginx 1.30.4, nginx 1.31.3.
Nginx SA zahvaljuje brojnim pojedincima na nezavisnom prijavljivanju ranjivosti i pridržavanju "koordiniranih standarda otkrivanja":
F5 zahvaljuje Ming Xuanu, DKD (@pidifn), Ji'an Zhouu i Zhen Yanu iz AntAISecurityLaba, Rafaelu Gaceku, Sergiiju Negodiuku iz EVO.company, Lam Jun Rongu iz Calif.io, Mufeedu VH-u iz Winfunc Researcha (winfunc.com), Vexeri AI (https://vexera.ai), Tu Tran Dinh (@1w4y), Stan Shaw (cyberstan), qianshuidewajueji, zenneth (randomguy6407), Zhenpeng (Leo) Lin iz depthfirst-a, Lukas Johannes Moeller, Melih Tolga Sahin iz Vodafone Türkiye, Ayoub Nabil Boubagrat (GitHub: @ayoubnabil) i Milan Jović (Kljunowsky) za nezavisno skretanje pažnje na ovo pitanje i poštivanje najviših standarda koordiniranog otkrivanja informacija.
U freenginxu, prateće informacije o ispravci su zapravo ograničene na poruku o potvrđivanju (commit). ChangelogOva ispravka nije čak ni označena kao "sigurnosna" ili "ispravka greške", već samo kao "funkcija". Izgleda da autor nije smatrao ovaj problem kritičnim. Nemoguće je utvrditi vezu između prijavljenih problema od strane gore navedenih osoba u F5 i commita kopiranog sa freenginx-a, ili da li su oni (ili bilo ko drugi) prijavili problem autoru freenginx-a.
izvor: linux.org.ru
