Luka w php-fpm umożliwiająca zdalne wykonanie kodu na serwerze

Dostępny wydania korygujące PHP 7.3.11, 7.1.33 i 7.2.24, w których wyłączony krytyczny słaby punkt (CVE-2019-11043) w rozszerzeniu PHP-FPM (FastCGI Process Manager), które umożliwia zdalne wykonanie kodu w systemie. Aby atakować serwery korzystające z PHP-FPM w połączeniu z Nginx do uruchamiania skryptów PHP, jest on już publicznie dostępny praca wykorzystać.

Atak jest możliwy w konfiguracjach nginx, w których przekazywanie do PHP-FPM odbywa się poprzez oddzielenie części adresu URL za pomocą „fastcgi_split_path_info” i zdefiniowanie zmiennej środowiskowej PATH_INFO, ale bez uprzedniego sprawdzenia istnienia pliku za pomocą funkcji „try_files $fastcgi_script_name” dyrektywę lub „if (!-f $) document_root$fastcgi_script_name)”. Problem jest również objawia się w ustawieniach oferowanych dla platformy NextCloud. Na przykład konfiguracje ze strukturami takimi jak:

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

Rozwiązanie problemu można śledzić w zestawach dystrybucyjnych na tych stronach: Debian, RHEL, Ubuntu, SUSE/openSUSE, FreeBSD, łuk, Fedora. W ramach obejścia możesz dodać sprawdzenie istnienia żądanego pliku PHP po wierszu „fastcgi_split_path_info”:

try_files $fastcgi_script_name =404;

Problem jest spowodowany błędem podczas manipulowania wskaźnikami w pliku sapi/fpm/fpm/fpm_main.c. Podczas przypisywania wskaźnika zakłada się, że wartość zmiennej środowiskowej PATH_INFO musi zawierać przedrostek odpowiadający ścieżce do skryptu PHP.
Jeśli dyrektywa fastcgi_split_path_info określa dzielenie ścieżki skryptu przy użyciu wyrażenia regularnego rozróżniającego nową linię (na przykład wiele przykładów sugeruje użycie „^(.+?\.php)(/.*)$”), osoba atakująca może zapewnić, że pusta wartość jest zapisywana w zmiennej środowiskowej PATH_INFO. W tym przypadku dalej w wykonaniu przeprowadzony zapisanie path_info[0] na zero i wywołanie FCGI_PUTENV.

Żądając adresu URL sformatowanego w określony sposób, atakujący może osiągnąć przesunięcie wskaźnika path_info na pierwszy bajt struktury „_fcgi_data_seg”, a wpisanie zera do tego bajtu spowoduje przesunięcie „char* pos” wskaźnik do wcześniej zlokalizowanego obszaru pamięci. Następny o nazwie FCGI_PUTENV nadpisze dane w tej pamięci wartością, którą atakujący może kontrolować. Podana pamięć przechowuje także wartości innych zmiennych FastCGI, a zapisując ich dane, atakujący może utworzyć fikcyjną zmienną PHP_VALUE i osiągnąć wykonanie swojego kodu.

Źródło: opennet.ru

Dodaj komentarz