В PHP исправили критическую уязвимость

Вышли релизы PHP 7.3.11, 7.1.33 и 7.2.24, где исправили уязвимость CVE-2019-11043 в расширении PHP-FPM. Она давала выполнить свой код в системе. Публично доступен эксплойт для атаки на сервер с PHP-FPM в связке с nginx

В чём проблема?

Проблема вызвана ошибкой при манипуляции с указателями в файле 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 и добиться выполнения своего кода.

 location ~ [^/]\.php(/|$) {

      fastcgi_split_path_info ^(.+?\.php)(/.*)$;

      fastcgi_param PATH_INFO       $fastcgi_path_info;

      fastcgi_pass   php:9000;

}

Как это работает?

Уязвимость работает в конфигурациях nginx, где проброс в PHP-FPM происходит c разделением частей URL при помощи “fastcgi_split_path_info” и определением переменной окружения PATH_INFO, но без предварительной проверки существования файла директивой “try_files $fastcgi_script_name” или конструкцией “if (!-f $document_root$fastcgi_script_name)”. Ещё проблема проявляется в предлагаемых настройках для платформы NextCloud. Например, уязвимы конфигурации с конструкциями вида:

Как исправить уязвимость?

В этих дистрибутивах проблему уже решают: Debian, RHEL, Ubuntu, SUSE/openSUSE, FreeBSD, Arch, Fedora. Для защиты можно после строки “fastcgi_split_path_info” добавить проверку существования запрошенного PHP-файла:

   try_files $fastcgi_script_name =404;

Залишити відповідь

Дякуємо, що поділились