BLOG | NGINX

Beheben der PHP-FPM-Sicherheitslücke (CVE-2019-11043) mit NGINX

NGINX-Teil-von-F5-horiz-schwarz-Typ-RGB
Owen Garrett Miniaturbild
Owen Garrett
Veröffentlicht am 29. Oktober 2019

Eine kürzlich gemeldete Sicherheitslücke mit der Bezeichnung CVE-2019-11043 kann Websites betreffen, die PHP-FPM zur Ausführung von PHP-Seiten verwenden. Die Verwendung von PHP‑FPM kommt besonders häufig auf Websites mit NGINX vor, da NGINX über keine In‑Process‑PHP‑Laufzeitumgebung verfügt. Stattdessen fungiert NGINX als Reverse-Proxy für Anwendungsserver und Prozessmanager wie PHP-FPM.

Die Schwachstelle liegt in PHP‑FPM selbst und nicht in NGINX. Die einzige garantierte Lösung ist daher ein Upgrade auf die gepatchte Version (oder höher) Ihrer PHP-Version: PHP 7.1.33 , PHP 7.2.24 oder PHP 7.3.11 .

Was ist die Natur dieser Sicherheitsanfälligkeit?

NGINX kommuniziert mit PHP‑FPM über das FastCGI-Protokoll. Jede FastCGI-Nachricht enthält eine Reihe von Umgebungsvariablen. Einer davon, PATH_INFO , wird aus anderen Anforderungsparametern abgeleitet. Wenn der Wert unerwartet leer ist, kann dies letztendlich zu Speicherbeschädigungen in der PHP-FPM-Binärdatei führen. Es ist möglich, diese Situation auszunutzen und die PHP-FPM-Binärdatei dazu zu bringen, beliebige Befehle auf dem lokalen Server auszuführen.

Diese Sicherheitslücke kann durch eine gängige NGINX-Konfiguration ausgelöst werden, wobei NGINX einen regulären Ausdruck in der Direktive fastcgi_split_path_info verwendet, um die Anforderungs-URI in zwei Teile aufzuteilen. Eine Möglichkeit zum Auslösen der Sicherheitslücke besteht darin, in die Anforderungs-URI einen Zeilenumbruch ( %0a ) oder ein Wagenrücklaufzeichen ( %0d ) einzubetten, das dann vom regulären Ausdruck nicht korrekt verarbeitet wird.

Milderung der Sicherheitslücke

Wie oben erwähnt, besteht die einzige sichere Möglichkeit, diese Sicherheitslücke zu beheben, darin, auf die gepatchte Version (oder höher) Ihrer PHP-Version zu aktualisieren: PHP 7.1.33 , PHP 7.2.24 oder PHP 7.3.11 .

Wenn Sie Ihre PHP-Binärdatei nicht sofort aktualisieren können, können Sie verschiedene Teilmaßnahmen ergreifen:

  1. Verschiedene Quellen haben vorgeschlagen, der NGINX-Konfiguration eine try_files- Direktive hinzuzufügen, um zu überprüfen, ob die Variable $uri in eine Datei (das PHP-Skript) aufgelöst wird, und die Anforderung mit Code abzulehnen 404(Nicht gefunden) wenn nicht:

    Standort ~ [^/]\.php(/|$) { fastcgi_split_path_info ^(.+?\.php)(/.*)$;
    fastcgi_param PATH_INFO $fastcgi_path_info;
    try_files $uri =404;
    #...
    }

    Beachten Sie, dass diese Abhilfe nur funktioniert, wenn NGINX und PHP‑FPM dasselbe Docroot auf demselben Host gemeinsam nutzen.

    PHP-Konfigurationen variieren je nach den Anforderungen der Upstream-Anwendung. Bitte testen Sie derartige Änderungen, um sicherzustellen, dass sie keine Auswirkungen auf Ihre Anwendung haben.

  2. Verwenden Sie F5 BIG-IP ASM (Application Security Manager), um die Anwendung zu schützen . Die vorhandenen Signatursätze „Command Execution“ und „Server Side Code Injection“ enthalten Angriffssignaturen, die die meisten Versuche blockieren, diese PHP-FPM-Schwachstelle zu entdecken und auszunutzen.

    Herausgeber – Seit der Veröffentlichung dieses Blogs hat das F5-Sicherheitsteam eine zusätzliche Signatur veröffentlicht, die speziell auf diese Sicherheitslücke zugeschnitten ist. Weitere Einzelheiten finden Sie unter F5 DevCentral .

  3. Fügen Sie eine ModSecurity-Regel hinzu, um Anfragen zu blockieren, die das verdächtige Zeichen %0a oder %0d enthalten:

    SecRule REQUEST_URI "@rx %0(a|A|d|D)" "id:1,phase:1,t:kleingeschrieben,verweigern"

    Diese Lösung wird im Originalbericht von Wallarm zur Sicherheitslücke beschrieben. Sie kann zu Fehlalarmen führen und ein Angreifer könnte dennoch andere Wege finden, die Sicherheitslücke auszunutzen.

Verwenden eines anderen PHP-Prozessmanagers

Anstatt sich auf PHP-FPM zu verlassen, können Sie NGINX Unit zum Ausführen Ihrer PHP-Anwendungen verwenden. NGINX Unit ist ein leistungsstarker Open-Source-Anwendungsserver und Prozessmanager, der neben PHP zahlreiche Sprachen und Frameworks unterstützt . Es kann PHP-Anwendungen automatisch entsprechend der Last skalieren und Anwendungen gleichzeitig ausführen, die unterschiedliche PHP-Laufzeiten verwenden. Wir stellen Binärdateien, Quellcode und Docker-Images kostenlos zur Verfügung.

Anweisungen zum Konfigurieren und Bedienen der NGINX Unit für WordPress, einer beliebten, stark frequentierten PHP-basierten Anwendung, finden Sie in der NGINX Unit-Dokumentation . Die Bereitstellung nutzt die Unterstützung für die Bereitstellung statischer Dateien in NGINX Unit 1.11.0 und höher.


„Dieser Blogbeitrag kann auf Produkte verweisen, die nicht mehr verfügbar und/oder nicht mehr unterstützt werden. Die aktuellsten Informationen zu verfügbaren F5 NGINX-Produkten und -Lösungen finden Sie in unserer NGINX-Produktfamilie . NGINX ist jetzt Teil von F5. Alle vorherigen NGINX.com-Links werden auf ähnliche NGINX-Inhalte auf F5.com umgeleitet."