Уразлівасць 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"! 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, арка, Мяккая фетравы капялюш. У якасці абыходнага метаду абароны пасля радка "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

Дадаць каментар