коригиращи издания на PHP 7.3.11, 7.1.33 и 7.2.24, в които критична (CVE-2019-11043) в разширението PHP-FPM (мениджър на процеси FastCGI), позволяваща отдалечено изпълнение на собствен код в системата. За атака на сървъри, които използват PHP-FPM за изпълнение на PHP скриптове съвместно с Nginx, вече е публично достъпна .
Атаката е възможна в конфигурации на nginx, в които пренасочването към PHP-FPM се извършва с разделяне на части от URL чрез „fastcgi_split_path_info“ и определяне на променлива за околна среда PATH_INFO, но без предварителна проверка за съществуването на файла с директивата „try_files $fastcgi_script_name“ или конструкцията „if (!-f $document_root$fastcgi_script_name)“. Проблемът включително в настройките, предлагани за платформата NextCloud. Например, уязвими са конфигурации с конструкции от вида:
location ~ [^\/]\.php(\/|$) {
fastcgi_split_path_info ^(.+?\.php)(\/.*)$;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_pass php:9000;
}
Проследяване на решаването на проблема в дистрибутивите може да се направи на тези страници: , , , , , , . Като обходен метод за защита, след реда „fastcgi_split_path_info“ може да се добави проверка за съществуването на запитания PHP файл:
try_files $fastcgi_script_name =404;
Проблемът е причинен от грешка при манипулиране на указатели във файла . При присвояване на указател се предполага, че стойността на променливата за околна среда PATH_INFO задължително съдържа префикс, съвпадащ с пътя към PHP скрипта.
Ако в директивата fastcgi_split_path_info е указано разделяне на пътя към скрипта с израз с регулярни изрази, чувствителен към предаване на символа за нов ред (например, в много примери се предлага използването на „^(.+?\.php)(\/.*)$“), то атакуващият може да постигне запис в променливата за околна среда PATH_INFO с пусто значение. В този случай по-нататък изпълнението като запис в path_info[0] нула и извикване на FCGI_PUTENV.
Чрез специфично форматиран URL атакуващият може да постигне изместване на указателя path_info на първия байт от структурата „_fcgi_data_seg“, а записването на нула в този байт ще доведе до преместване на указателя „char* pos“ на по-рано находяща се област в паметта. Следващото извикване на FCGI_PUTENV ще презапише данните в тази памет със стойност, която атакуващият може да контролира. В указаната памет също така се съхраняват стойностите на други променливи FastCGI и записвайки своите данни, атакуващият може да създаде фалшива променлива PHP_VALUE и да постигне изпълнение на своя код.
Източник: opennet.ru
