TL;DR: Suočivši se s trećim otkrivenim prelivanjem bafera u 2026. godini (i, prema verziji F5, RCE ako nema ASLR) prilikom rada s regularnim izrazima i varijablama, programer freenginx-a Maksim Dunin odlučio je da je vreme da to prestane i dodao je proveru veličine varijable pre nego što u nju upiše podatke. Ova novina je preuzeta od strane nginx-a, što daje nadu u prestanak novih CVE na ovu temu.
Sada detalji.
19. juna je napravljen commit u freenginx-u, dodajući u opisivač varijable polje end koje pokazuje na kraj bafera. Ranije je tu bio samo pokazivač na početak (pos), potrebna dužina se računala (i sada se računa) unapred, i u trenutku kopiranja podataka u varijablu se smatralo da unapred izračunata dužina garantuje da podaci stanu u bafer. Nažalost, već dva puta u maju 2026. godine zbog različitih previdâ to nije bilo slučaj (1 (linux.org.ru), 2 (linux.org.ru)), što je dovodilo do prelivanja bafera i loših posledica. Tako, sada se prilikom kreiranja bafera varijable popunjava i pokazivač na njen kraj, a pre upisivanja podataka u varijablu, ako podaci ne staju, obrada zahteva će se kontrolisano završiti s greškom. To znači da greške u izračunavanju dužine još uvek mogu postojati, ali sada neće oštetiti memoriju, već samo neuspeh konkretnog http zahteva. Sledećim commit-ima (2 (freenginx.org), 3 (freenginx.org)) dodata je slična zaštita na druge delove koda, uključujući kod vođenja access-loga. 7. jula je objavljena verzija freenginx 1.31.3, koja uključuje ovo ispravku.
15. jula su ti commit-i preuzeti od nginx-a (1 (github.com), 2 (github.com), 3 (github.com), iz nekog razloga prevrćući drugi i treći u lancu), problemu je dodeljen CVE-2026-42533, a F5 je objavio službeni SA (f5.com).
Što se tiče konkretne ranjivosti ovaj put: ona se manifestira pri korištenju direktive map s regularnim izrazima s označenim parametrima. Što se tiče ostalih uvjeta neophodnih za njeno aktiviranje, tekst u opisu commit-a i tekst u SA se malo razlikuju: u SA je navedeno da bi trebalo izračunati neku string koja koristi označeni parametar, pre nego što rezultat ovog istog mapa. U opisu commit-a, u primjeru između ovih koraka, postoji i resetiranje varijable koja sadrži označeni parametar. Kako god, u većini instaliranih nginx-ova ovako nešto verovatno neće biti prisutno, pa je ranjivost na taj način malo koga pogodila. Takođe, treba napomenuti da se ispravka kalkulacije dužine konkretno u ovom slučaju u zakomitaranim promjenama čini da nema (ili sam loše tražio?), postoji samo zaštita koja pretvara problem u kontrolisanu grešku HTTP zahteva. Ipak, 19. jula je u freenginx dodano nekoliko ispravki (5bfb, 7622, b906) za kalkulaciju dužine za sličnu situaciju, ali nije odmah jasno da li jeste ili nije.
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.
U SA nginx su navedene zahvalnice nekoliko osoba za nezavisna obveštenja o ranjivosti i poštovanje "standarda koordiniranog otkrivanja informacija":
F5 zahvaljuje Mingu Xuanu, DKD (@pidifn), Ji’an Zhouu i Zhen Yanu iz AntAISecurityLab, Rafaelu Gaceku, Sergiiju Negodiuku iz EVO.company, Lamu Jun Rongu iz Calif.io, Mufeedu VH iz Winfunc Research (winfunc.com), Vexera AI (https://vexera.ai), Tu Tranu Dinh (@1w4y), Stanu Shawu (cyberstan), qianshuidewajueji, zennethu (randomguy6407), Zhenpeng (Leo) Linu iz depthfirst, Lukasu Johannesu Moelleru, Melihu Tolgi Sahin iz Vodafone Türkiye, Ayoubu Nabilu Boubagrat (GitHub: @ayoubnabil), i Milanu Jovicu (Kljunowsky) za to što su nam nezavisno skrenuli pažnju na ovaj problem i poštovali najviše standarde koordiniranog otkrivanja.
U freenginx, prateće informacije o ispravci zapravo se ograničavaju na obaveštenje prilikom commit-a. U changelog-u, ova ispravka nije ni označena potpisom "bezbednost" (security) ni "ispravka" (bugfix), samo "dodavanje" (feature). Verovatno je autor smatrao da ovaj problem nije kritičan. Kako se poruke o problemu od strane navedenih osoba u F5 odnose na commit preuzet iz freenginx-a, da li su oni (ili neko drugi) obavestili autora freenginx-a o problemu, nije moglo da se utvrdi.
Izvor: linux.org.ru
