- PHP2Shell sind zwei Schwachstellen im PHP-Interpreter (CVE-2026-109618, CVE-2026-109619), die das BSI mit CVSS 9.2 bewertet: Codeausführung auf dem Webserver, ohne Anmeldung und ohne Zutun eines Nutzers.
- Die Fix-Versionen sind PHP 8.5.12, 8.4.27, 8.3.36 und 8.2.35; für PHP 8.1 und älter gibt es vom PHP-Projekt nur Quellcode-Backports, keine Releases.
- Distributionspakete tragen den Fix oft unter der alten Versionsnummer — ob er drin ist, zeigt der Paket-Changelog mit den CVE-Nummern, nicht
php -v. - Die php.ini-Übergangslösungen verkleinern die Angriffsfläche, machen eine Installation laut PHP-Projekt aber nicht sicher; sie überbrücken höchstens Stunden bis zum Patch.
- PHP 8.2 verliert am 31.12.2026 den Security-Support — wer jetzt ohnehin anfasst, plant das Upgrade gleich mit.
/01Was bekannt ist
Beide Fehler sitzen im Interpreter selbst, nicht in einem Framework oder Plugin. WordPress, Drupal, Magento, Laravel und Eigenentwicklungen sind deshalb gleichermaßen betroffen, sobald PHP Anfragen aus dem Internet verarbeitet. Das PHP-Projekt beschreibt die Lücken in zwei Sicherheitshinweisen:
- CVE-2026-109618 („RCE via OOM corruption“): Läuft PHP beim Einlesen einer Anfrage in einen Speichermangel, während die Anfragedaten erst halb aufgebaut sind, verarbeitet das Aufräumen am Ende ungültige Daten. Hauptweg ist das Zerlegen von Multipart-Formularen.
- CVE-2026-109619 („RCE via stale global state“): Nach einem fatalen Fehler kann globaler Zustand eines Worker-Prozesses auf bereits freigegebenen Speicher zeigen (Use-after-free). Eine spätere Anfrage an denselben Worker liest ihn — unter anderem über den Session-Upload-Fortschritt, der standardmäßig eingeschaltet ist.
Betroffen sind alle Versionen unterhalb der Fix-Stände. Am höchsten schätzt das PHP-Projekt das Risiko bei mod_php ein, also PHP als Apache-Modul: Dort ist ein Exploit vorgeführt worden, der greift, bevor überhaupt Anwendungscode läuft. PHP-FPM ist laut den Hinweisen für die zweite Lücke bestätigt anfällig, für die erste nach Code-Analyse. Kommandozeile, Cronjobs und Queue-Worker ohne HTTP-Eingang sind über die beschriebenen Wege nicht erreichbar.
Wird die Lücke schon ausgenutzt?
Die Angaben gehen auseinander. Das BSI meldet in seiner Warnung keine bestätigten Angriffe, aber unbestätigte Berichte über Exploits. Aikido schreibt, es werde Ausnutzung „in freier Wildbahn“ berichtet; Patchstack meldet laut hol.org aktive Angriffe bei mehreren Hosting-Partnern. JFrog und Huntress sahen bis zum Nachmittag dagegen keine breite Ausnutzung. Für die Entscheidung spielt das keine Rolle: Bei einer CVE dieser Schwere ohne Anmeldung wartet man nicht auf die Bestätigung.
/02Sofortmaßnahme: patchen
Das BSI empfiehlt, die Updates unverzüglich einzuspielen, und nennt keinen Workaround. Die Fix-Versionen je Zweig:
| Zweig | Fix-Version | Hinweis |
|---|---|---|
| PHP 8.5 | 8.5.12 | aktiver Support |
| PHP 8.4 | 8.4.27 | aktiver Support |
| PHP 8.3 | 8.3.36 | nur noch Sicherheitsupdates |
| PHP 8.2 | 8.2.35 | Security-Support endet am 31.12.2026 |
| PHP 8.1, 8.0, 7.4 | kein Release | nur Quellcode-Backports des PHP-Security-Teams; Upgrade einplanen |
Wer PHP aus den Paketquellen der Distribution bezieht, sieht diese Nummern oft nicht. Debian, Ubuntu und Red Hat übernehmen Sicherheitskorrekturen in ihre eigene Paketversion, ohne die PHP-Versionsnummer zu ändern. Ubuntu etwa liefert den Fix für 24.04 als 8.3.6-0ubuntu0.24.04.13. Maßgeblich ist deshalb der Changelog des Pakets.
Prüfskript: welche Server betroffen sind
Für Linux-Server stellen wir ein freies Prüfskript bereit: php2shell.sh (MIT-Lizenz). Es findet alle PHP-Installationen samt PHP-FPM, mod_php, CGI und den PHP-Versionen gängiger Verwaltungsoberflächen (Plesk, cPanel, DirectAdmin u. a.), prüft den Fix über Versionsnummer und Paket-Changelog, erkennt Dienste, die nach einem Update noch nicht neu gestartet wurden, sieht in Docker- und Podman-Container und sucht nach typischen Spuren einer Kompromittierung. Der Modus check liest nur; die Übergangsmaßnahme setzt es erst nach Rückfrage und mit Sicherung, und sie lässt sich vollständig zurücknehmen.
# herunterladen und Prüfsumme vergleichen
curl -fsSLO https://www.hostspezial.de/downloads/php2shell.sh
sha256sum php2shell.sh
# 9181f974f6997582e534d59e17ce88f8e169890c70cf3df4f5d5fc410d408b78
# nur prüfen (ändert nichts)
sudo bash php2shell.sh check
# Übergangsmaßnahme erst ansehen, dann setzen – bzw. wieder entfernen
sudo bash php2shell.sh mitigate --dry-run
sudo bash php2shell.sh mitigate
sudo bash php2shell.sh rollback
Das Skript schließt die Lücke nicht. Es zeigt, wo sie offen ist, und überbrückt auf Wunsch die Zeit bis zum Update. Mit --json liefert es das Ergebnis maschinenlesbar für das Monitoring. Nutzung auf eigene Verantwortung.
Debian und Ubuntu
# Updates einspielen
apt update
apt list --upgradable 2>/dev/null | grep -i php
apt install --only-upgrade 'php*'
# Ist der Fix im installierten Paket? (Paketname an die eigene Version anpassen)
apt changelog php8.3-fpm 2>/dev/null | grep -E 'CVE-2026-10961[89]'
# Laufende Prozesse neu starten, sonst läuft der alte Code weiter
systemctl restart php8.3-fpm # bei PHP-FPM
systemctl restart apache2 # bei mod_php
RHEL, AlmaLinux, Rocky
Dieselben Befehle gelten für AlmaLinux und Rocky Linux.
# Betrifft das installierte System eine der beiden CVEs?
dnf updateinfo list --cve CVE-2026-109618
dnf updateinfo list --cve CVE-2026-109619
dnf update 'php*'
rpm -q --changelog php-fpm | grep -E 'CVE-2026-10961[89]'
systemctl restart php-fpm
systemctl restart httpd # bei mod_php
Zwei Stolpersteine aus den ersten Stunden: Das Remi-Repository hatte laut Aikido am Veröffentlichungstag noch keine Updates — wer daraus installiert, muss nachprüfen, statt sich auf dnf update zu verlassen. Und Container-Images: Auch dort kann ein korrigiertes Image die alte Versionsnummer im Tag tragen. Nach dem Neubau gehört der Container neu gestartet, nicht nur das Image gezogen.
Merksatz: Ein Paket-Update ohne Neustart von PHP-FPM bzw. Apache schließt nichts. Die Worker-Prozesse laufen mit dem alten Code weiter, bis sie neu starten.
/03Wenn der Patch nicht sofort geht
Für Systeme, die erst nach einem Test oder in einem Wartungsfenster aktualisiert werden können, kursieren Einstellungen, die die bekannten Angriffswege verengen. Das PHP-Projekt nennt sie selbst — mit dem ausdrücklichen Zusatz, dass sie die Angriffsfläche verkleinern, eine Installation aber nicht sicher machen. Sie sind eine Brücke für Stunden, kein Ersatz für den Patch.
; gegen CVE-2026-109619
session.upload_progress.enabled = 0
fatal_error_backtraces = 0 ; nur PHP 8.5
; gegen CVE-2026-109618
post_max_size = 8M ; so niedrig, wie die Anwendung erlaubt
; memory_limit = -1 ; siehe Zielkonflikt unten
Dazu kommen Größenlimits am vorgeschalteten Webserver oder Proxy, etwa client_max_body_size bei nginx. Wer gar keine Datei-Uploads braucht, kann Multipart-Anfragen dort ganz abweisen — und zwar für alle HTTP-Methoden, denn PHP 8.4 liest Multipart-Daten auch außerhalb von POST.
In Community-Anleitungen taucht zusätzlich session.use_strict_mode = 1 auf. Die Einstellung ist ohnehin sinnvoll, steht aber nicht in den Sicherheitshinweisen des PHP-Projekts als Gegenmaßnahme.
Die Grenzen
memory_limit = -1nimmt dem Speichermangel den Auslöser, ist laut PHP-Projekt aber unvollständig, weil ein fehlgeschlagener Speicherabruf beim Betriebssystem denselben Fehlerpfad erreicht. Und es hebt jedes Speicherlimit auf: Eine einzige Anfrage kann dann den Server auslasten. Das tauscht eine Lücke gegen ein Ausfallrisiko.- Umgehungen werden erwartet. JFrog prüfte am Veröffentlichungstag noch, ob die Einstellungen alle Wege abdecken; GMO Flatt hielt sie laut The Hacker News für unvollständig. PHP-Kernentwickler sagen dort ebenso deutlich: Der einzige echte Schutz ist das Update.
- Die Einstellung muss dort gelten, wo der Verkehr ankommt. Sie gehört in die php.ini der laufenden SAPI oder in den FPM-Pool, nicht in
.user.iniund nicht perini_set(). Die CLI-Konfiguration ist eine andere Datei.
# Welche Werte sieht PHP-FPM wirklich? (nicht php -i: das ist die CLI)
php-fpm8.3 -i | grep -E 'upload_progress.enabled|post_max_size|memory_limit'
# Im FPM-Pool erzwingen, z. B. /etc/php/8.3/fpm/pool.d/www.conf
php_admin_flag[session.upload_progress.enabled] = off
systemctl reload php8.3-fpm
Am sichersten prüft man im Web-Kontext selbst: eine phpinfo()-Seite kurz aufrufen und danach sofort wieder löschen.
/04Härtung: Folgeschäden begrenzen
Eine ehrliche Vorbemerkung: Keine der folgenden Maßnahmen verhindert eine Codeausführung, die aus einem Speicherfehler im Interpreter entsteht. Sie bestimmen, wie weit ein Angreifer danach kommt. Genau das entscheidet, ob aus einem Treffer eine verlorene Website oder ein verlorenes Netz wird. Diese Maßnahmen sind auf jedem Linux-Webserver unabhängig von PHP2Shell sinnvoll und gehören in jedes Patch-Management-Konzept.
Pro Website ein eigener Pool, ein eigener Benutzer
Jede Website läuft in einem eigenen FPM-Pool unter einem eigenen Systembenutzer mit minimalen Rechten. Der Code gehört einem anderen Benutzer und ist für den Webprozess nur lesbar; schreiben darf er nur in Upload- und Cache-Verzeichnisse. In Upload-Verzeichnissen wird PHP nicht ausgeführt.
; FPM-Pool je Website
user = kunde1
group = kunde1
php_admin_value[open_basedir] = /var/www/kunde1/:/tmp/
php_admin_value[disable_functions] = exec,shell_exec,system,passthru,popen,proc_open,pcntl_exec
php_admin_flag[allow_url_include] = off
# nginx: keine PHP-Ausführung im Upload-Verzeichnis
location ~* ^/uploads/.*\.php$ { deny all; }
disable_functions bremst einfache Webshells, die Systembefehle absetzen. Wer nativen Code im Prozess ausführt, umgeht die Sperre. Vor dem Setzen prüfen, ob die Anwendung eine der Funktionen braucht — Vorschaubilder über ffmpeg, Bild- oder Backup-Plugins tun das häufig. Die Einstellung greift nur in der php.ini oder per php_admin_value im Pool. In der php.ini außerdem expose_php = Off.
Den Dienst selbst einsperren
systemd kann PHP-FPM ohne Codeänderung einschränken. Die Werte vor dem Ausrollen testen, manche Anwendungen schreiben an unerwartete Orte.
# systemctl edit php8.3-fpm
[Service]
ProtectSystem=full
ProtectHome=true
PrivateTmp=true
NoNewPrivileges=true
Wo verfügbar, ergänzen AppArmor oder SELinux das Profil. Ebenso wirksam ist Egress-Filterung: Ein Webserver braucht selten beliebige ausgehende Verbindungen. Wer nur die nötigen Ziele erlaubt, erschwert Reverse Shells und das Nachladen von Werkzeugen.
WAF und Überwachung
Eine Web Application Firewall oder ein Reverse Proxy mit Regeln gegen die bekannten Muster ist eine zusätzliche Schicht. Cloudflare hat Notfallregeln ausgerollt; der eigene CTO nennt sie eine Überbrückung, keine Lösung. Wichtiger ist, dass ein Treffer auffällt: Kindprozesse wie sh, bash, curl oder wget unter php-fpm oder apache2 sind im Normalbetrieb selten, und neue .php-Dateien im Webverzeichnis ebenso. Beides lässt sich in einem SIEM als Alarm abbilden und von einem SOC rund um die Uhr auswerten; ein EDR-Agent auf dem Server erkennt solche Prozessketten ebenfalls.
/05Kompromittierung prüfen
War ein System vor dem Patch erreichbar, lohnt ein Blick, ob jemand schneller war. Die folgenden Prüfungen sind ein Anfang, kein Nachweis der Sauberkeit.
# Neue oder geänderte PHP-Dateien seit dem 20.10.2026
find /var/www -name '*.php' -newermt '2026-10-20' -ls
# Shells oder Downloader unter dem Webbenutzer
ps -eo pid,ppid,user,etime,cmd --forest | grep -E -B2 'sh -c|bash|curl|wget' | grep -E 'www-data|apache|nginx|php'
# Cronjobs des Webbenutzers
crontab -l -u www-data 2>/dev/null
# Häufungen von Speicherfehlern und 500ern im Log
grep -c 'Allowed memory size' /var/log/php*-fpm.log 2>/dev/null
Aikido nennt weitere Hinweise: auffällige Multipart-Anfragen, kurz darauf Speicherfehler oder Fehler 500, übergroße PHPSESSID-Cookies und Worker-Prozesse, die ohne erkennbaren Grund neu starten. Im CMS gehören neu angelegte Administratorkonten auf die Liste.
Eine Webshell auf einem Webserver ist oft nur der erste Schritt — der Weg ins interne Netz und zu Ransomware ist von dort nicht weit. Bei einem begründeten Verdacht gilt das System als kompromittiert. Es wird isoliert, nicht nur gepatcht. Zugangsdaten, die auf ihm lagen — Datenbank, API-Schlüssel, SMTP, Deploy-Schlüssel — werden gewechselt. Für die ersten Schritte hilft ein vorbereiteter Incident-Response-Ablauf.
Ob ein Webserver unauffällig ist, zeigt erst die laufende Auswertung von Prozessen und Logs. Managed SOC — Alarm, Einordnung und Reaktion, auch nachts.
/06Checkliste zum Abhaken
- Alle Server mit PHP-Webanwendungen erfasst, auch Test- und Altsysteme
- Prüfskript
php2shell.sh checkauf jedem Linux-Server ausgeführt, Gesamturteil notiert - PHP-Version und Paketquelle je Server bekannt (Distribution, Remi, Container, selbst gebaut)
- Update eingespielt; Fix im Paket-Changelog über die CVE-Nummern nachgewiesen
- PHP-FPM bzw. Apache neu gestartet, Container neu ausgerollt
- Wo der Patch warten muss: Übergangseinstellungen in der richtigen SAPI gesetzt und im Web-Kontext geprüft
- Systeme mit PHP 8.1 und älter: Upgrade-Termin festgelegt; PHP 8.2 bis Ende 2026 eingeplant
- Neue PHP-Dateien, Prozesse und Cronjobs des Webbenutzers geprüft
- Bei Verdacht: System isoliert, Zugangsdaten gewechselt
- Härtung (eigene Pools, Upload-Verzeichnisse, Egress, Überwachung) als Aufgabe für die nächsten Wochen eingeplant
Server, auf denen PHP-Anwendungen laufen, betreuen wir mit festem Patch-Prozess und Überwachung. Managed Server — Updates, Neustarts und Nachweis aus einer Hand.
/07Häufige Fragen
/01Bin ich betroffen, wenn ich WordPress mit aktuellen Plugins nutze?+
/02Reicht es, die php.ini-Einstellungen zu setzen?+
/03php -v zeigt eine alte Version. Ist der Server ungepatcht?+
/04Was ist mit PHP 7.4, 8.0 oder 8.1?+
/05Gibt es ein Werkzeug, das meine Server automatisch prüft?+
/06Muss ich nach dem Update neu starten?+
/07Sind Cronjobs und Kommandozeilen-Skripte gefährdet?+
- BSI, Cybersicherheitswarnung 2026-297981-1032 „PHP – Kritische Schwachstellen bedrohen Webanwendungen weltweit“, Version 1.0, bsi.bund.de/SharedDocs/Cybersicherheitswarnungen/DE/2026/2026-297981-1032.html, abgerufen am 21.10.2026.
- PHP-Projekt, Sicherheitshinweis und Release-Meldungen 8.5.12, 8.4.27, 8.3.36, 8.2.35, php.net, abgerufen am 21.10.2026.
- PHP-Projekt, GHSA-w8hw-w9fx-j79w „RCE via OOM corruption“ und GHSA-6wmf-4rv5-p3rp „RCE via stale global state“, github.com/php/php-src/security/advisories, abgerufen am 21.10.2026.
- PHP-Projekt, Supported Versions, php.net/supported-versions.php, abgerufen am 21.10.2026.
- Ubuntu, USN-8948-1: PHP vulnerabilities, ubuntu.com/security/notices/USN-8948-1, abgerufen am 21.10.2026.
- Aikido, „What you need to know about PHP2shell“, aikido.dev/blog/critical-vulnerabilities-in-php-php2shell, abgerufen am 21.10.2026.
- hol.org, „PHP2Shell CVE-2026-109618 and CVE-2026-109619: how to fix the PHP RCE“, hol.org/blog/cve-2026-109618-php2shell-php-rce-emergency-update, abgerufen am 21.10.2026.
- JFrog Security Research, „PHP2Shell: CVE-2026-109618 and CVE-2026-109619“, research.jfrog.com, abgerufen am 21.10.2026.
- The Hacker News, „PHP2Shell: what actually protects you“, thehackernews.com/2026/10/php2shell-what-actually-protects-you.html, abgerufen am 21.10.2026.
