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

Налични коригиращи версии PHP 7.3.11, 7.1.33 и 7.2.24, в които е отстранена критична уязвимост (CVE-2019-11043) в разширението PHP-FPM (мениджър на процеси FastCGI), което позволява на отдалечен достъп до изпълнение на код в системата. За атака върху сървъри, използващи PHP-FPM в комбинация с 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