Вразливість 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 здійснюється з поділом частин URL за допомогою "fastcgi_split_path_info" та визначенням змінної оточення PATH_INFO, але без попередньої перевірки існування файлу директивою "try_files $fastcgi_script_name"! 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. Як обхідний метод захисту після рядка «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

Додати коментар або відгук