Ranljivost PHP-fpm, ki omogoča oddaljeno izvajanje kode na strežniku

Na voljo popravne izdaje PHP 7.3.11, 7.1.33 in 7.2.24, v katerih odpraviti критичная ranljivost (CVE-2019-11043) v razširitvi PHP-FPM (FastCGI Process Manager), ki vam omogoča oddaljeno izvajanje kode v sistemu. Za napad na strežnike, ki uporabljajo PHP-FPM v povezavi z Nginxom za izvajanje skriptov PHP, je že javno dostopen delavec izkoriščanje.

Napad je možen v konfiguracijah nginx, v katerih se posredovanje v PHP-FPM izvaja z ločevanjem delov URL-ja z uporabo “fastcgi_split_path_info” in definiranjem spremenljivke okolja PATH_INFO, vendar brez predhodnega preverjanja obstoja datoteke z uporabo “try_files $fastcgi_script_name” ali »if (!-f $) document_root$fastcgi_script_name)«. Problem je tudi se kaže v ponujenih nastavitvah za platformo NextCloud. Na primer konfiguracije s strukturami, kot so:

lokacija ~ [^/]\.php(/|$) {
fastcgi_split_path_info ^ (. +? \. php) (/.*) $;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_pass php:9000;
}

Rešitev težave lahko spremljate v distribucijskih kompletih na teh straneh: Debian, RHEL, Ubuntu, SUSE/openSUSE, FreeBSD, Arch, Fedora. Kot rešitev lahko za vrstico »fastcgi_split_path_info« dodate preverjanje obstoja zahtevane datoteke PHP:

try_files $fastcgi_script_name =404;

Težavo povzroča napaka pri ravnanju s kazalci v datoteki sapi/fpm/fpm/fpm_main.c. Pri dodeljevanju kazalca se predpostavlja, da mora vrednost spremenljivke okolja PATH_INFO vsebovati predpono, ki se ujema s potjo do skripta PHP.
Če direktiva fastcgi_split_path_info določa razdelitev poti skripta z uporabo regularnega izraza, občutljivega na novo vrstico (na primer, veliko primerov predlaga uporabo "^(.+?\.php)(/.*)$"), lahko napadalec zagotovi, da prazna vrednost se zapiše v spremenljivko okolja PATH_INFO. V tem primeru naprej po izvedbi izvede pisanje path_info[0] na nič in klic FCGI_PUTENV.

Z zahtevo po URL-ju, oblikovanem na določen način, lahko napadalec doseže premik kazalca path_info na prvi bajt strukture »_fcgi_data_seg«, pisanje ničle v ta bajt pa bo vodilo do premika »char* pos« kazalec na predhodno locirano pomnilniško območje. Naslednji imenovani FCGI_PUTENV bo prepisal podatke v tem pomnilniku z vrednostjo, ki jo napadalec lahko nadzira. Navedeni pomnilnik shranjuje tudi vrednosti drugih spremenljivk FastCGI in z zapisom njihovih podatkov lahko napadalec ustvari fiktivno spremenljivko PHP_VALUE in doseže izvedbo svoje kode.

Vir: opennet.ru

Dodaj komentar