Уязвимость PHP-FPM - CVE-2019-11043

Уязвимость PHP-FPM - CVE-2019-11043

Критическая уязвимость, позволяющая удалённо выполнить код на сервере, как защититься от CVE-2019-11043?

Доступны корректирующие релизы PHP 7.3.11, 7.2.24 и 7.1.33, в которых устранена критическая уязвимость (CVE-2019-11043) в расширении PHP-FPM

Для исправления уязвимости CVE-2019-11043 в расширении PHP-FPM выпущены корректирующие релизы PHP 7.3.11, 7.2.24 и  7.1.33,  как было сказано уязвимость позволяет пользователю, выполнить свой код извне.

Для атаки на серверы, использующие для запуска PHP-скриптов PHP-FPM в связке с Nginx, уже публично доступен рабочий эксплоит

Строка 1140 в файле sapi /fpm/fpm/fpm_main.c (https://github.com/php/php-src/blob/master/sapi/fpm/fpm/fpm_main.c#L1140) содержит манипуляции с указателями, которые предполагают что env_path_info имеет префикс, равный пути к php скрипту. Тем не менее, код не проверяет выполняется ли это предположение. Отсутствие проверки может привести к неверному указателю в переменной «path_info».

Если веб-сервер запускает Nginx + PHP-FPM, а Nginx имеет такую ​​конфигурацию, как


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;

Технические детали уязвимости 

Запросив определённым образом оформленный URL атакующий может добиться смещения указателя path_info на первый байт структуры "_fcgi_data_seg", а запись нуля в этот байт приведёт к перемещению указателя "char* pos" на ранее идущую область памяти. Вызываемый следом FCGI_PUTENV перезапишет данные в этой памяти значением, которое может контролировать атакующий. В указанной памяти в том числе хранятся значения других переменных FastCGI и записав свои данные атакующий может создать фиктивную переменную PHP_VALUE и добиться выполнения своего кода.

Разве это не было ранее известно?

Давным-давно php-fpm не ограничивал расширения скриптов, а это означало, что что-то подобное /avatar.png/some-fake-shit.php может выполнить avatar.png как скрипт PHP. Эта проблема была исправлена ​​в 2010 году. Текущая версия не требует загрузки файла, работает в самых последних версиях (пока не появилось исправление), и, что наиболее важно, в этот раз эксплоит намного круче.

Так что, из-за наличия готового PoC-эксплоита и простоты использования уязвимости владельцам сайтов рекомендуется проверить настройки серверов и не откладывать обновление PHP.


Сергей Мухин

Веб-разработчик со стажем программирования более 6 лет, постоянно учусь, люблю делать новые проекты.

Есть вопросы?

Я почти всегда в режиме онлайн

Связаться со мной