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

Наличен коригиращи версии на PHP 7.3.11, 7.1.33 и 7.2.24, в които елиминиран критична уязвимост (CVE-2019-11043) в разширението PHP-FPM (FastCGI Process Manager), което ви позволява дистанционно да изпълнявате своя код в системата. За да атакувате сървъри, които използват PHP-FPM във връзка с Nginx за изпълнение на PHP скриптове, той вече е публично достъпен работа експлоатация.

Атаката е възможна в конфигурации на nginx, в които пренасочването към PHP-FPM се извършва чрез разделяне на части от URL с помощта на „fastcgi_split_path_info“ и дефиниране на променливата на средата PATH_INFO, но без първо да се провери съществуването на файла с помощта на „try_files $fastcgi_script_name“ директива или „if (!-f $) document_root$fastcgi_script_name)“. Проблемът също е проявява в настройките, предлагани за платформата NextCloud. Например конфигурации със структури като:

местоположение ~ [^/]\.php(/|$) {
fastcgi_split_path_info ^ (. +? \. php) (/.*) $;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_pass php:9000;
}

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

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

Добавяне на нов коментар