Серверде қашықтан кодты орындауға мүмкіндік беретін PHP-fpm осалдығы

Қолайлы PHP 7.3.11, 7.1.33 және 7.2.24 түзету шығарылымдары, онда жойылды сыни осалдық (CVE-2019-11043) жүйеде кодты қашықтан орындауға мүмкіндік беретін PHP-FPM (FastCGI Process Manager) кеңейтімінде. PHP сценарийлерін іске қосу үшін Nginx-пен бірге PHP-FPM қолданатын серверлерге шабуыл жасау үшін ол жалпыға қолжетімді. жұмыс пайдалану.

Шабуыл PHP-FPM-ге бағыттау URL бөліктерін “fastcgi_split_path_info” арқылы бөлу және PATH_INFO ортасының айнымалы мәнін анықтау арқылы жүзеге асырылатын nginx конфигурацияларында мүмкін, бірақ алдымен “try_files $fastcgi_script_name” көмегімен файлдың бар-жоғын тексерусіз. директивасы немесе “if (!-f $) 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

пікір қалдыру