Dobësi në php-fpm që lejon ekzekutimin e kodit në distancë në server

Në dispozicion lëshimet korrigjuese të PHP 7.3.11, 7.1.33 dhe 7.2.24, në të cilat eliminohet kritike cenueshmëria (CVE-2019-11043) në shtesën PHP-FPM (FastCGI Process Manager), e cila ju lejon të ekzekutoni nga distanca kodin tuaj në sistem. Për të sulmuar serverët që përdorin PHP-FPM në lidhje me Nginx për të ekzekutuar skriptet PHP, ai tashmë është i disponueshëm publikisht punëtori shfrytëzojnë.

Sulmi është i mundur në konfigurimet nginx në të cilat përcjellja në PHP-FPM kryhet duke ndarë pjesë të URL-së duke përdorur "fastcgi_split_path_info" dhe duke përcaktuar variablin e mjedisit PATH_INFO, por pa kontrolluar më parë ekzistencën e skedarit duke përdorur "try_files $fastcgi_script_name" direktiva ose "if (!-f $)" konstrukton document_root$fastcgi_script_name)". Problemi është gjithashtu proявляется në cilësimet e ofruara për platformën NextCloud. Për shembull, konfigurimet me struktura si:

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

Ju mund të gjurmoni zgjidhjen e problemit në kompletet e shpërndarjes në këto faqe: Debian, RHEL, Ubuntu, SUSE/openSUSE, FreeBSD, Hark, Fedora. Si një zgjidhje, mund të shtoni një kontroll për ekzistencën e skedarit PHP të kërkuar pas rreshtit "fastcgi_split_path_info":

try_files $fastcgi_script_name =404;

Problemi shkaktohet nga një gabim gjatë manipulimit të treguesve në një skedar sapi/fpm/fpm/fpm_main.c. Kur caktoni një tregues, supozohet se vlera e ndryshores së mjedisit PATH_INFO duhet të përmbajë një parashtesë që përputhet me shtegun e skriptit PHP.
Nëse direktiva fastcgi_split_path_info specifikon ndarjen e shtegut të skriptit duke përdorur një shprehje të rregullt të ndjeshme ndaj linjës së re (për shembull, shumë shembuj sugjerojnë përdorimin e "^(.+?\.php)(/.*)$"), atëherë një sulmues mund të sigurojë që një vlera e zbrazët është shkruar në ndryshoren e mjedisit PATH_INFO. Në këtë rast, më tej gjatë ekzekutimit kryhet duke shkruar path_info[0] në zero dhe duke thirrur FCGI_PUTENV.

Duke kërkuar një URL të formatuar në një mënyrë të caktuar, një sulmues mund të arrijë një zhvendosje të treguesit path_info në bajtin e parë të strukturës "_fcgi_data_seg", dhe shkrimi i një zero në këtë bajt do të çojë në lëvizjen e "char* pos". treguesi në një zonë memorie të vendosur më parë. Tjetri i quajtur FCGI_PUTENV do të mbishkruajë të dhënat në këtë memorie me një vlerë që sulmuesi mund të kontrollojë. Memoria e specifikuar ruan gjithashtu vlerat e ndryshoreve të tjera FastCGI, dhe duke shkruar të dhënat e tyre, një sulmues mund të krijojë një ndryshore fiktive PHP_VALUE dhe të arrijë ekzekutimin e kodit të tyre.

Burimi: opennet.ru

Shto një koment