Уязвимост в php-fpm, позволяваща отдалечено изпълнение на код на сървъра

Достъпни коригиращи издания на 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;
}

Проследяване на решаването на проблема в дистрибутивите може да се направи на тези страници: Debian, RHEL, Ubuntu, SUSE/openSUSE, FreeBSD, Arch, Fedora. Като обходен метод за защита, след реда „fastcgi_split_path_info“ може да се добави проверка за съществуването на запитания PHP файл:

try_files $fastcgi_script_name =404;

Проблемът е причинен от грешка при манипулиране на указатели във файла sapi/fpm/fpm/fpm_main.c. При присвояване на указател се предполага, че стойността на променливата за околна среда 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

Купете надежден хостинг за сайтове с защита от DDoS, VPS VDS сървъри 🔥 Купете надежден хостинг за сайтове с защита от DDoS, VPS VDS сървъри | ProHoster