Eine Schwachstelle in php-fpm, die es ermöglicht, Code remote auf dem Server auszuführen

Präsentationen korrektive Releases von PHP 7.3.11, 7.1.33 und 7.2.24, in denen behoben kritische eine Schwachstelle (CVE-2019-11043) im PHP-FPM-Erweiterung (FastCGI-Prozessmanager), die es ermöglicht, eigenen Code im System remote auszuführen. Für Angriffe auf Server, die PHP-Skripte in Verbindung mit Nginx über PHP-FPM ausführen, steht bereits ein funktionierender Exploit.

Angriff ist in nginx-Konfigurationen möglich, in denen der Zugriff auf PHP-FPM durch das Trennen der URL-Teile mit "fastcgi_split_path_info" und die Definition der Umgebungsvariable PATH_INFO erfolgt, jedoch ohne vorherige Überprüfung der Existenz der Datei durch die Direktive "try_files $fastcgi_script_name" oder die Konstruktion "if (!-f $document_root$fastcgi_script_name)". Das Problem betrifft auch zeigt sich die Einstellungen, die für die NextCloud-Plattform empfohlen werden. Beispielsweise sind Konfigurationen mit Konstruktionen wie:

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

Die Beseitigung des Problems in den Distributionen kann auf den folgenden Seiten verfolgt werden: Debian, RHEL, Ubuntu, SUSE\/openSUSE, FreeBSD, Arch, Fedora. Als Umgehungsschutz kann nach der Zeile "fastcgi_split_path_info" eine Überprüfung der Existenz der angeforderten PHP-Datei hinzugefügt werden:

try_files $fastcgi_script_name =404;

Das Problem wird durch einen Fehler bei der Manipulation von Zeigern in der Datei sapi/fpm/fpm/fpm_main.c. Bei der Zuordnung eines Zeigers wird davon ausgegangen, dass der Wert der Umgebungsvariable PATH_INFO unbedingt ein Präfix enthält, das mit dem Pfad zum PHP-Skript übereinstimmt.
Wenn in der Direktive fastcgi_split_path_info die Trennung des Skriptpfades mithilfe eines regulären Ausdrucks angegeben ist, der anfällig für die Übergabe von Zeilenumbrüchen ist (zum Beispiel wird in vielen Beispielen vorgeschlagen, "^(.+?\.php)(\/.*)$" zu verwenden), kann der Angreifer erreichen, dass in die Umgebungsvariable PATH_INFO ein leerer Wert geschrieben wird. In diesem Fall folgt während der Ausführung erfolgt das Schreiben von path_info[0] null und der Aufruf von FCGI_PUTENV.

Indem der Angreifer eine auf bestimmte Weise formatierte URL anfordert, kann er erreichen, dass der Zeiger path_info auf das erste Byte der Struktur "_fcgi_data_seg" verschoben wird, und das Schreiben von null in dieses Byte führt dazu, dass der Zeiger "char* pos" in einen zuvor liegenden Speicherbereich verschoben wird. Der anschließend aufgerufene FCGI_PUTENV überschreibt die Daten in diesem Speicher mit einem Wert, den der Angreifer kontrollieren kann. In diesem Speicher werden auch die Werte anderer FastCGI-Variablen gespeichert, und durch das Schreiben seiner Daten kann der Angreifer eine gefälschte Variable PHP_VALUE erstellen und die Ausführung seines Codes erreichen.

Quelle: opennet.ru

60GB SSD 8Gb DDR4