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 .
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.
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:
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.
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 .
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.
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."