На 13 май беше коригирана уязвимост в популярния уеб сървър nginx, предназначен за натоварени системи: CVE-2026-42945, която потенциално може да доведе до RCE. Уязвимостта се появи преди 18 години (2008 година) в версия 0.6.27.
За да се експлоатира, в конфигурацията на сървъра трябва да присъства определена комбинация от директиви, която не е задължителна за всички, но е променлива, например:
rewrite ^(.*) /new?c=1;
set $myvar $1;
return 200 $myvar;
Съществени детайли:
- първо е директивата rewrite, където (първият аргумент) регулярното изражение с извлечен параметър (нещо в кръгли скоби) се замества с (втория аргумент) път, съдържащ знак за въпрос;
- директивата set (вместо нея, също така може да се използва втори rewrite или if), която използва извлечения параметър от първоначалния пренаписан път (в случая това е $1).
Уязвимостта работи така:
- първата директива rewrite, натъквайки се на знак за въпрос, установява вътрешен флаг is_args, означаващ „в момента събиране на GET параметри за заменения URL, трябва всичко да се ескейпва“, и (в това е същността на бъга) забравя да нулира този флаг в края на работата си;
- последващата директива set, при формализиране на стойността за $myvar, погрешно прилага преди зададения is_args, и записва в my_var ескейпната стойност на извлечения параметър $1; проблемът е, че буферът за $myvar се заделя преди, още преди да се извършат замените, и дължината му се изчислява с is_args=0, тоест ескейпната стойност оказва, че е по-дълга от заделения буфер, поради което записването се извършва извън определения буфер в други структури за данни на сървъра. За да се случи това, е достатъчно да се изпрати заявка със символи, подлежащи на ескейпиране, например знаците „плюс“, в мястото на извличането на параметъра от регулярното изражение.
Ако на хоста няма ASLR, тази уязвимост може да бъде експлоатирана за отдалечено изпълнение на код с правата на работния процес на nginx, има PoC (тук няма чист експлойт, демонстрация в пясъчника).
Уязвимостта е коригирана в стабилната версия на nginx 1.30.1 и в новата разработваща версия 1.31.0. линк към комита.
Забележително е, че преди 14 години (2012 година) подобна грешка вече беше коригирана на друго място в близост.
——-
На сайта на F5 има предложение за временно неутрализиране на уязвимостта в случай, че не е възможно бързо да се обнови версията на nginx – необходимо е да се заменят неназованите параметри със назовани, в този случай, според тях, уязвимостта няма да се прояви. Пример оттам:
беше: rewrite ^/users/([0-9]+)/profile/(.*)$ /profile.php?id=$1&tab=$2 last;
стана: rewrite ^/users/(?<user_id>[0-9]+)/profile/(?<section>.*)$ /profile.php?id=$user_id&tab=$section last;
Информацията за уязвимостта беше предоставена от Zhenpeng (Leo) Lin от DepthFirst. Освен това, той също съобщи за следните проблеми, които също са коригирани:
- CVE-2026-40701 (комит) use-after-free при използване на ssl_verify_client+ssl_ocsp (по всяка вероятност без RCE)
- CVE-2026-42934 (комит) четене извън границите на буфера в utf-8 парсера при специфични обстоятелства, което може да доведе до малко изтичане на данни или срив на работния процес
- CVE-2026-42946 (комит) прекомерно запазване на памет и четене извън границите на буфера при използване на модулите scgi/uwsgi, проблемът се проявява при наличие на злонамерен бекенд (upstream) през указаните протоколи или при mitm на канала на комуникация с бекенда, може да доведе до четене на паметта на nginx или срив на работния процес
Източник: linux.org.ru
