Уязвимость php-fpm, позволяющая удалённо выполнить код на сервере

Доступны корректирующие релизы PHP 7.3.11, 7.1.33 и 7.2.24, в которых устранена критическая уязвимость (CVE-2019-11043) в расширении PHP-FPM (менеджер процессов FastCGI), позволяющая удалённо выполнить свой код в системе. Для атаки на серверы, использующие для запуска PHP-скриптов PHP-FPM в связке с Nginx, уже публично доступен рабочий эксплоит.

Атака возможна в конфигурациях nginx, в которых проброс в PHP-FPM осуществляется c разделением частей 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