TL;DR: Když se v roce 2026 objevilo třetí zjištěné přetečení paměti (a podle F5, RCE bez ASLR) při práci s regulárními výrazy a proměnnými, vývojář freenginxu Maxim Dunin usoudil, že je na čase to ukončit, a přidal do svého produktu kontrolu velikosti proměnné před tím, než do ní zapíše data. Odtud toto novum převzali k sobě i nginx, což dává naději na ukončení nových CVE na toto téma.
Teď podrobnosti.
Dne 19. června byla provedena commit úprava ve freenginxu, která přidává do popisovače proměnné pole end, určující konec bufferu. Dříve tam byl pouze ukazatel na jeho začátek (pos), potřebná délka byla vypočítávána (a stále se vypočítává) předem, a v okamžiku zkopírování do proměnné se předpokládalo, že správně dříve vypočítaná délka zaručuje, že data se vejdou do bufferu. Bohužel již dvakrát v květnu 2026 kvůli různým přehlédnutím to tak nebylo (1 (linux.org.ru), 2 (linux.org.ru)), což vedlo k přetečení bufferu a špatným následkům. Tak tedy, nyní při vytváření bufferu proměnné se vyplňuje i ukazatel na její konec, a před zápisem do proměnné dat, pokud se do ní data nevejdou, zpracování požadavku bude kontrolovaně ukončeno s chybou. To znamená, že chyby ve výpočtu délky mohou i nadále existovat, ale nyní nebudou narušovat paměť, ale pouze selžou konkrétní http-požadavek. Následujícími commity (2 (freenginx.org), 3 (freenginx.org)) byla přidána podobná ochrana na jiná místa v kódu, včetně kódu pro vedení access-logu. Dne 7. července byla zveřejněna verze freenginx 1.31.3, která obsahuje tuto opravu.
Dne 15. července byly tyto commity převzaty nginxem (1 (github.com), 2 (github.com), 3 (github.com), ovšem z nějakého důvodu byla prohozená druhá a třetí v řetězci), problému byl přidělen CVE-2026-42533, a F5 vydalo oficiální SA (f5.com).
Pokud jde o konkrétní zranitelnost tentokrát: ta se projevuje při použití direktivy map s regulárními výrazy se zvýrazněnými parametry. Ohledně ostatních podmínek potřebných k jejímu vyvolání se text v popisu commitu a text v SA mírně liší: v SA je uvedeno, že by mělo dojít k výpočtu nějakého řetězce, který využívá zvýrazněný parametr z map, dříve než výsledek tohoto map. V popisu commitu je v příkladu mezi těmito kroky také zahrnuto nulování proměnné, která obsahuje zvýrazněný parametr. Tak či onak, většina běžících nginxů s tímto pravděpodobně nebude mít zkušenosti, a zranitelnost tak zasáhla jen málo lidí. Také stojí za zmínku, že opravy výpočtu délky v tomto konkrétním případě ve commitovaných změnách zdá se nejsou (nebo jsem špatně hledal?), existuje pouze ochrana, která problém превращает на контролируемý фейл http-запроса. Nicméně 19. července byly do freenginx přidány nějaké opravy (5bfb, 7622, b906) výpočtu délky pro podobnou situaci, ale přesně to z fleku nepochopím, jestli to je ono nebo ne.
Zranitelnost se objevila ve verzi nginx 0.9.6, opravy se dostaly do verzí freenginx 1.31.3, nginx 1.30.4, nginx 1.31.3.
V SA nginx jsou uvedeny poděkování několika jedincům za nezávislé zprávy o zranitelnosti a dodržování „standardů koordinovaného zveřejnění informací“:
F5 uznává Minga Xuana, DKD (@pidifn), Ji’ana Zhoua a Zhen Yana z AntAISecurityLab, Rafaela Gacka, Sergii Negodiuka z EVO.company, Lama Jun Ronga z Calif.io, Mufeeda VH z Winfunc Research (winfunc.com), Vexera AI (https://vexera.ai), Tu Trana Dinha (@1w4y), Stana Shawa (cyberstan), qianshuidewajueji, zennetha (randomguy6407), Zhenpenga (Leo) Lina z depthfirst, Lukase Johannese Moellera, Melih Tolga Sahina z Vodafone Türkiye, Ayouba Nabila Boubagrata (GitHub: @ayoubnabil) a Milana Jovice (Kljunowsky) za to, že nás na tento problém nezávisle upozornili a dodržovali nejvyšší standardy koordinovaného zveřejnění.
Ve freenginx je doprovodné informace o opravě v podstatě omezena na zprávu při commitu. V changelog-u není tato oprava ani označena podpisem „bezpečnost“ (security), ani „oprava“ (bugfix), pouze „přidání“ (feature). Pravděpodobně autor nepovažoval tento problém za kritický. Jak se zprávy o problému od zmíněných osob v F5 vztahují k převzatému commitu z freenginx, zda je informovali (nebo někdo jiný) autora freenginx o problému, se zjistit nepodařilo.
Zdroj: linux.org.ru
