Атака возможна в конфигурациях nginx, в которых проброс в PHP-FPM осуществляется c разделением частей URL при помощи «fastcgi_split_path_info» и определением переменной окружения PATH_INFO, но без предварительной проверки существования файла директивой «try_files $fastcgi_script_name» или конструкцией «if (!-f $document_root$fastcgi_script_name)». Проблема в том числе
location ~ [^/]\.php(/|$) {
fastcgi_split_path_info ^(.+?\.php)(/.*)$;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_pass php:9000;
}
Проследить за устранением проблемы в дистрибутивах можно на данных страницах:
try_files $fastcgi_script_name =404;
Проблема вызвана ошибкой при манипуляции с указателями в файле
Если в директиве fastcgi_split_path_info указано разделение пути к скрипту с использованием регулярного выражения, чувствительного к передаче символа перевода строки (например, во многих примерах предлагается использовать «^(.+?\.php)(/.*)$»), то атакующий может добиться записи в переменную окружения PATH_INFO пустого значения. В этом случае далее по ходу выполнения
Запросив определённым образом оформленный URL атакующий может добиться смещения указателя path_info на первый байт структуры «_fcgi_data_seg», а запись нуля в этот байт приведёт к перемещению указателя «char* pos» на ранее идущую область памяти. Вызываемый следом FCGI_PUTENV перезапишет данные в этой памяти значением, которое может контролировать атакующий. В указанной памяти в том числе хранятся значения других переменных FastCGI и записав свои данные атакующий может создать фиктивную переменную PHP_VALUE и добиться выполнения своего кода.
Источник: opennet.ru