PHP-fpm ievainojamība, kas ļauj attālināti izpildīt kodu serverī

Pieejams PHP 7.3.11, 7.1.33 un 7.2.24 koriģējošie laidieni, kuros likvidēta kritisks ievainojamība (CVE-2019-11043) PHP-FPM (FastCGI Process Manager) paplašinājumā, kas ļauj attālināti izpildīt kodu sistēmā. Lai uzbruktu serveriem, kas PHP skriptu palaišanai izmanto PHP-FPM kopā ar Nginx, tas jau ir publiski pieejams darba izmantot.

Uzbrukums ir iespējams nginx konfigurācijās, kurās pārsūtīšana uz PHP-FPM tiek veikta, atdalot URL daļas, izmantojot “fastcgi_split_path_info” un definējot vides mainīgo PATH_INFO, taču iepriekš nepārbaudot faila esamību, izmantojot “try_files $fastcgi_script_name”. direktīva vai “if (!-f $) document_root$fastcgi_script_name)”. Problēma arī ir parādās platformai NextCloud piedāvātajos iestatījumos. Piemēram, konfigurācijas ar šādām struktūrām:

atrašanās vieta ~ [^/]\.php(/|$) {
fastcgi_split_path_info ^ (. +? \. php) (/.*) $;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_pass php:9000;
}

Problēmas risinājumam varat izsekot izplatīšanas komplektos šajās lapās: Debian, RHEL, Ubuntu, SUSE/openSUSE, FreeBSD, Arka, Fedora. Kā risinājumu varat pievienot pārbaudi, vai pēc rindas “fastcgi_split_path_info” pastāv pieprasītais PHP fails:

try_files $fastcgi_script_name =404;

Problēmu izraisa kļūda, manipulējot ar norādes failā sapi/fpm/fpm/fpm_main.c. Piešķirot rādītāju, tiek pieņemts, ka PATH_INFO vides mainīgā vērtībai ir jābūt prefiksam, kas atbilst PHP skripta ceļam.
Ja direktīvā fastcgi_split_path_info ir norādīts skripta ceļa sadalīšana, izmantojot regulāro izteiksmi, kas ir jutīga pret jaunām rindiņām (piemēram, daudzi piemēri iesaka izmantot "^(.+?\.php)(/.*)$", tad uzbrucējs var nodrošināt, ka tukša vērtība tiek ierakstīta vides mainīgajā PATH_INFO. Šajā gadījumā tālāk izpildes gaitā ir rakstot path_info[0] uz nulli un izsaucot FCGI_PUTENV.

Pieprasot noteiktā veidā formatētu URL, uzbrucējs var panākt path_info rādītāja nobīdi uz pirmo struktūras “_fcgi_data_seg” baitu, un, ierakstot šim baitam nulli, tiks pārvietots “char* pos”. norādiet uz iepriekš atrastu atmiņas apgabalu. Nākamais FCGI_PUTENV pārrakstīs šajā atmiņā esošos datus ar vērtību, ko uzbrucējs var kontrolēt. Norādītajā atmiņā tiek saglabātas arī citu FastCGI mainīgo vērtības, un, ierakstot to datus, uzbrucējs var izveidot fiktīvu PHP_VALUE mainīgo un panākt sava koda izpildi.

Avots: opennet.ru

Pievieno komentāru