Zraniteľnosť v php-fpm, ktorá umožňuje vzdialené spustenie kódu na serveri

Dostupný opravné vydania PHP 7.3.11, 7.1.33 a 7.2.24, v ktorých eliminovaný kritický zraniteľnosť (CVE-2019-11043) v rozšírení PHP-FPM (FastCGI Process Manager), ktorá vám umožňuje vzdialene spúšťať váš kód v systéme. Na útok na servery, ktoré používajú PHP-FPM v spojení s Nginx na spúšťanie PHP skriptov, je už verejne dostupný pracovné zneužívať.

Útok je možný v konfiguráciách nginx, v ktorých sa preposielanie do PHP-FPM vykonáva oddelením častí URL pomocou „fastcgi_split_path_info“ a definovaním premennej prostredia PATH_INFO, ale bez predchádzajúcej kontroly existencie súboru pomocou „try_files $fastcgi_script_name“ direktíva alebo „if (!-f $) document_root$fastcgi_script_name)“. Problém je tiež sa prejavuje v nastaveniach ponúkaných pre platformu NextCloud. Napríklad konfigurácie so štruktúrami ako:

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

Riešenie problému v distribučných súpravách môžete sledovať na týchto stránkach: debian, RHEL, ubuntu, SUSE/openSUSE, FreeBSD, Oblúk, Fedora. Ako riešenie môžete za riadok „fastcgi_split_path_info“ pridať kontrolu existencie požadovaného súboru PHP:

try_files $fastcgi_script_name =404;

Problém je spôsobený chybou pri manipulácii s ukazovateľmi v súbore sapi/fpm/fpm/fpm_main.c. Pri priraďovaní ukazovateľa sa predpokladá, že hodnota premennej prostredia PATH_INFO musí obsahovať prefix, ktorý sa zhoduje s cestou k PHP skriptu.
Ak direktíva fastcgi_split_path_info špecifikuje rozdelenie cesty skriptu pomocou regulárneho výrazu citlivého na nový riadok (napríklad mnoho príkladov navrhuje použiť "^(.+?\.php)(/.*)$"), útočník by mohol zabezpečiť, prázdna hodnota sa zapíše do premennej prostredia PATH_INFO. V tomto prípade ďalej po vykonaní vykonané zápis path_info[0] na nulu a volanie FCGI_PUTENV.

Požiadaním o adresu URL naformátovanú určitým spôsobom môže útočník dosiahnuť posun ukazovateľa path_info na prvý bajt štruktúry „_fcgi_data_seg“ a zápis nuly do tohto bajtu povedie k presunu pozície „char*“ ukazovateľ na predtým umiestnenú oblasť pamäte. Ďalší s názvom FCGI_PUTENV prepíše údaje v tejto pamäti hodnotou, ktorú môže útočník ovládať. Zadaná pamäť tiež ukladá hodnoty ďalších premenných FastCGI a zapísaním ich údajov môže útočník vytvoriť fiktívnu premennú PHP_VALUE a dosiahnuť vykonanie svojho kódu.

Zdroj: opennet.ru

Pridať komentár