Kurz gesagt: php-cgi ist die älteste Art, PHP hinter einem Webserver zu betreiben, und läuft noch auf vielen Servern, oft unbemerkt. Die php-cgi Sicherheitslücke aus PHP2Shell betrifft diese Betriebsart ausdrücklich. Patchen Sie, beenden Sie alle laufenden php-cgi-Prozesse und planen Sie den Umstieg auf PHP-FPM.
Was php-cgi ist und wo es noch läuft
PHP gibt es in mehreren Varianten: als Kommandozeilenprogramm, als Apache-Modul, als PHP-FPM und als php-cgi. php-cgi ist ein Programm, das der Webserver startet und dem er Anfragen über CGI oder FastCGI übergibt. Ohne eigene Prozessverwaltung ist es einfacher als PHP-FPM, aber auch weniger kontrollierbar.
Typische Fundorte sind ältere Hosting-Panels, Apache mit mod_fcgid, eigene Wrapper-Skripte für mehrere PHP-Versionen und PHP unter Windows mit IIS über FastCGI. In Agenturen und Behörden finden sich zudem Server, die vor Jahren eingerichtet und seither nur noch betrieben wurden.
Die php-cgi Sicherheitslücke bei PHP2Shell
PHP2Shell umfasst die Lücken CVE-2026-109618 und CVE-2026-109619 in PHP selbst, jeweils mit CVSS v4.0 9.2. Beide erlauben die Ausführung von Schadcode ohne Anmeldung. Das PHP-Projekt nennt php-cgi ausdrücklich unter den betroffenen Betriebsarten, neben PHP-FPM, mod_php, FrankenPHP und LiteSpeed.
Behoben sind PHP 8.5.12, 8.4.27, 8.3.36 und 8.2.35. Für PHP 8.1 und älter gibt es keine offiziellen Updates mehr, nur minimale Quell-Backports für 7.4, 8.0 und 8.1. Gerade php-cgi-Setups laufen überdurchschnittlich oft auf alten Versionen. php-cgi ist zudem nicht zum ersten Mal betroffen: Bereits 2024 sorgte eine Lücke in php-cgi unter Windows (CVE-2024-4577) für Aufsehen. Altlasten dieser Art verdienen deshalb besondere Aufmerksamkeit.
php-cgi auf dem Server finden
Die folgenden Befehle lesen nur und helfen, php-cgi aufzuspüren. Pfade und Modulnamen sind Beispiele.
# Laufende php-cgi-Prozesse mit Startzeit und Benutzer
ps -eo pid,lstart,user,cmd | grep -E 'php-cgi|php[0-9.]*-cgi' | grep -v grep
# Installierte php-cgi-Programme
ls /usr/bin/php*-cgi /usr/lib/cgi-bin/php* 2>/dev/null
# Apache: Ist mod_fcgid oder mod_cgi geladen?
apache2ctl -M 2>/dev/null | grep -Ei 'fcgid|cgi'
grep -RniE 'FcgidWrapper|AddHandler.*php|Action.*php' /etc/apache2 /etc/httpd 2>/dev/null
Finden Sie FcgidWrapper-Einträge oder Handler, die auf ein php-cgi-Programm zeigen, läuft diese Betriebsart. Prüfen Sie für jedes gefundene Programm die Version mit -v. Bei Distributionspaketen belegt das Änderungsprotokoll mit den CVE-Nummern den Patch, weil Backports die Versionsnummer oft nicht ändern.
Patchen und alle Prozesse beenden
Spielen Sie das Update über die Paketverwaltung oder die Quelle ein, aus der php-cgi stammt. Danach müssen alle laufenden php-cgi-Prozesse verschwinden. Bei mod_fcgid hält Apache Prozesse eine Weile vor; ein vollständiger Neustart von Apache beendet sie.
# Apache vollständig neu starten (Debian/Ubuntu bzw. RHEL-Familie)
systemctl restart apache2 # oder: systemctl restart httpd
# Kontrolle: Gibt es noch php-cgi-Prozesse älter als das Update?
ps -eo pid,lstart,cmd | grep -E 'php-cgi' | grep -v grep
Läuft php-cgi über einen eigenen Prozessmanager oder einen Panel-Dienst, starten Sie diesen neu. Unter Windows mit IIS recyceln Sie die Anwendungspools, siehe PHP unter Windows und IIS.
Läuft php-cgi mit PHP 8.1 oder älter auf einem öffentlich erreichbaren Server, fehlt ein offizieller Patch. Setzen Sie sofort die Übergangsmaßnahmen und erwägen Sie nach BSI-Empfehlung, den Server vorübergehend vom Netz zu nehmen.
Übergangsmaßnahmen bei php-cgi
php.net empfiehlt Übergangsmaßnahmen, die keinen vollständigen Schutz bieten. Bei php-cgi gehören die Werte in die php.ini, die das jeweilige Programm lädt, oder in die Serverkonfiguration. .user.ini-Dateien und ini_set() reichen für session.upload_progress.enabled laut php.net nicht.
; php.ini der php-cgi-Installation
session.upload_progress.enabled = 0
post_max_size = 8M
upload_max_filesize = 6M
Mit Upload-Funktion nennt php.net post_max_size = 32M. Auf PHP 8.5 kommt fatal_error_backtraces=0 hinzu. Speichergrenzen setzen Sie über cgroups für den Webserver-Dienst, nicht über RLIMIT_AS oder RLIMIT_DATA. Danach alle Prozesse neu starten.
Der Weg zu PHP-FPM
Auf Dauer ist php-cgi keine gute Wahl. PHP-FPM bietet Pools je Website, eigene Benutzer, Grenzen pro Pool, Statusseiten und kontrollierte Neustarts. Der Umstieg ist meist gut planbar: PHP-FPM installieren, Pools anlegen, Webserver auf FastCGI an PHP-FPM umstellen, Wrapper-Skripte entfernen. Wie ein sauberer Aufbau aussieht, zeigt Nginx mit PHP-FPM absichern. Läuft zusätzlich eine alte PHP-Version, verbinden Sie den Wechsel mit dem Upgrade.
Bis der Umstieg erfolgt ist, sollten Sie die bestehende Konfiguration kritisch prüfen. Der Webserver sollte nur Dateien mit der Endung .php an php-cgi übergeben und keine Pfade, die auf nicht existierende Dateien zeigen. In Upload-Verzeichnissen darf keine PHP-Ausführung möglich sein. Wrapper-Skripte, die je Website eine eigene php.ini laden, prüfen Sie darauf, ob diese Dateien die Übergangswerte wieder aufheben. Liegt ein php-cgi-Programm direkt in einem öffentlich erreichbaren Verzeichnis wie cgi-bin, gehört es dort entfernt. Solche Altlasten stammen oft aus Installationsanleitungen vergangener Jahre und werden bei späteren Umbauten schlicht vergessen. Dokumentieren Sie jeden Fund mit Pfad und Zweck, damit der spätere Umbau nichts übersieht.
Wichtig bleibt: Ein Patch entfernt keine Schadsoftware, die vorher eingeschleust wurde. Bewahren Sie die Logs ab dem 20.10.2026 auf.
Wie hilft PHP SOS konkret?
- Wir spüren php-cgi-Installationen, Wrapper und Handler auf und ordnen sie den Websites zu.
- Wir patchen, beenden alle alten Prozesse und dokumentieren den Stand.
- Für PHP 8.1 und älter planen wir mit Ihnen die Migration auf eine unterstützte PHP-Version.
- Im Rahmen der Server-Härtung ersetzen wir php-cgi durch PHP-FPM mit getrennten Pools.
Häufige Fragen
Nutze ich php-cgi, ohne es zu wissen?
Das ist häufiger, als man denkt. Ältere Panels, FastCGI-Setups mit mod_fcgid und PHP unter Windows mit IIS starten PHP oft als php-cgi. Eine Prozessliste oder die Server API in phpinfo zeigt es zuverlässig.
Ist FastCGI dasselbe wie php-cgi?
Nicht ganz. FastCGI ist ein Protokoll. PHP-FPM und php-cgi können beide FastCGI sprechen, php-cgi ist aber das ältere, einfachere Programm ohne Pools und Prozessverwaltung. PHP2Shell betrifft php-cgi ausdrücklich.
Was heißt klassisches CGI bei PHP?
Beim klassischen CGI startet der Webserver für jede Anfrage einen neuen PHP-Prozess. Das ist langsam und heute selten. Häufiger ist php-cgi hinter mod_fcgid oder FastCGI, wo Prozesse mehrere Anfragen bearbeiten.
Muss ich nach dem Update etwas neu starten?
Ja. Bei FastCGI-Setups laufen php-cgi-Prozesse eine Zeit lang weiter. Starten Sie den Webserver beziehungsweise den Prozessmanager neu und prüfen Sie, dass kein php-cgi-Prozess älter als das Update ist.