PHP2Shell: Was jetzt zu tun ist.
Zwei kritische Lücken im PHP-Kern, CVE-2026-109618 und CVE-2026-109619, erlauben Angriffe auf Websites ohne Login. Hier steht alles, was bisher bekannt ist: wer betroffen ist, welche Versionen sicher sind, wie du WordPress, deinen Server und Plesk absicherst und woran du einen Angriff erkennst. Erstfassung: 21. Oktober 2026, abends.
BSI-Warnung, ein erster Angriffsversuch schon am 17. Oktober, unabhängige Bestätigung des Exploits und Abschaltungen in Deutschland. Zu den neuen Erkenntnissen →
Neue Erkenntnisse zur Vollständigkeit des Patches, zu öffentlichen Exploits, zur Ausnutzung und zur Erkennung. Zu den neuen Erkenntnissen →
Mit Hilfe von KI erstellt, von mir kontrolliert und bearbeitet.
das wichtigste in kürze
apt update apt upgrade
Quellen: PHP-Advisory, Wiz, Sansec, Cloudflare, The Hacker News, Meow Apps, Amazon, BSI
update: neue erkenntnisse
PHP_SESSION_UPLOAD_PROGRESS zu suchen.
BSI-Warnung: Das BSI warnt mit Kritikalität 3 / Orange (BITS-H 2026-297981-1132, Version 1.1 vom 21. Oktober): „Maßnahmen müssen unverzüglich ergriffen werden.“ Weil kein Workaround vollständig schützt, rät das BSI, einen Webserver bis zum Patch vom Internet zu trennen, wenn du nicht sofort aktualisieren kannst. Zusätzlich empfiehlt es SELinux oder AppArmor. Berichte über Angriffe in sozialen Medien konnte das BSI zu diesem Zeitpunkt nicht verifizieren.
Unabhängig bestätigt: Das RUS-CERT der Universität Stuttgart schreibt: „Wir konnten einen Exploit erfolgreich an einem Testsystem verifizieren.“ Zu den Workarounds: „Die Mitigations reichen nicht aus, um eine öffentlich erreichbare PHP-Anwendung zu betreiben.“
Erfolgreiche Einbrüche sind weiter nicht öffentlich belegt. Die CISA hatte nach eigener Aussage keine Ausnutzung beobachtet (NBC News), im KEV-Katalog fehlen beide CVEs auch am 22. Oktober (Rescana). Die PHP Foundation fand unter den nach dem Leak verbreiteten PoCs zum Zeitpunkt der Veröffentlichung keinen funktionierenden Exploit (Tenable). Inzwischen gibt es aber funktionierende PoCs, siehe unten. Am Update ändert das nichts.
Richtigstellung der Gerüchte: Ein Beitrag auf daubois.dev, nach eigener Aussage aus dem PHP Security Team, ordnet die Meldungen nach dem Leak ein: „the panic was right about how bad this is and wrong about most of the details“. Offiziell gilt CVSS 9.2, nicht 10.0. Der meistgenannte Tipp session.upload_progress.enabled = 0 betrifft nur CVE-2026-109619, und der wichtigste Workaround memory_limit = -1 fehlte in fast allen Berichten.
Abschaltungen in Deutschland: Die Charité nahm ihre Website vorsorglich vom Netz, ausdrücklich ohne Cyberangriff, Online-Termine waren nicht buchbar. Laut dpa folgten unter anderem die Stadt Mainz, die Ruhr-Universität Bochum, die Stadt Dresden und die Landesregierungen von Baden-Württemberg, Bayern, Hessen und Thüringen. heise nennt außerdem Teile von berlin.de, Einschränkungen an der FU Berlin, die Onlinewache der Berliner Polizei und Behörden in Niedersachsen. Erste Seiten in Norddeutschland sind laut heise wieder online.
Weitere Distributionen: Laut heise haben inzwischen auch SUSE und Slackware gepatchte Pakete veröffentlicht.
Ist der Patch vollständig? Datadog Security Labs hält den Fix für den bekannten Exploit für vollständig, das Muster dahinter aber für riskant: Auch in PHP 8.5.12 erhöht das Einfügen in eine Hashtable den Zähler, bevor der Key alloziert ist. Datadog erwartet weitere ähnliche Bugs, besonders in alten Versionen, die nur den Minimal-Patch bekommen haben.
Unbestätigte Behauptungen: Auf X kursiert ein Screenshot, laut dem drei Angriffswege auch auf PHP 8.5.12 noch funktionieren, darunter ein Use-after-free beim Deserialisieren. Der Screenshot bestätigt selbst, dass beide CVEs behoben sind, und einer der Wege braucht zusätzlich eine LFI-Lücke in der Anwendung. Weder das PHP-Team noch ein Hersteller hat das bisher bestätigt. Am Update ändert das nichts: Es bleibt Pflicht.
Öffentliche Proof-of-Concepts: Seit dem Morgen des 21. Oktober liegen öffentliche PoCs auf GitHub, etwa ikow/php2shell-poc mit mehreren Chains und einem Docker-Lab. Einige Chains brauchen zusätzliche Bedingungen wie eine LFI-Lücke oder ein Gadget in der Anwendung (Cybersecurity News). Die Hürde für Angreifer sinkt damit weiter.
Ausnutzung: Datadog berichtet von „multiple reports of active exploitation in the wild“ und von breit angelegten, ungezielten Scans. Huntress hatte zunächst keine Ausnutzung beobachtet (SecurityWeek). Im KEV-Katalog der CISA stehen beide CVEs weiterhin nicht (watchTowr).
Erkennung: Ein erfolgreicher Exploit liefert laut Datadog HTTP 200 und muss den Worker nicht abstürzen lassen. Verdächtig sind übergroße Formularfelder, im Test rund 3,5 MB. Eine WAF übersieht Angriffe, wenn sie große Bodies abschneidet. Der stärkste Hinweis ist ein Shell-Prozess unter dem Webserver-Prozess.
Nebenwirkung des Updates: Überschreitet ein Request das neue Hard Limit, beendet PHP den Worker sofort mit _exit(137) statt sauber aufzuräumen (Datadog).
Quellen: Datadog Security Labs, Cybersecurity News, ikow/php2shell-poc, SecurityWeek, watchTowr-FAQ, X-Post mit dem Screenshot, Amazon Threat Intelligence, BSI, RUS-CERT, daubois.dev, NBC News, Rescana, Tenable, heise, it-daily, Berliner Zeitung, Tagesspiegel (dpa)
was ist php2shell?
PHP ist die Programmiersprache hinter rund 70 Prozent aller Websites, darunter WordPress, WooCommerce, Shopware, Drupal, Joomla, TYPO3 und Nextcloud. „PHP2Shell“ ist der Sammelname für zwei CVE-Nummern, die zusammen vier Memory-Corruption-Bugs im PHP-Core abdecken. Der Name kommt vom Exploit-Skript „php2shell“, mit dem die Forschenden ihre Exploits demonstriert haben.
longjmp mitten in der Initialisierung eines Requests, der Cleanup arbeitet danach mit halb initialisierten Daten.
CVE-2026-109619: Globaler State eines Requests überlebt dessen Ende (Stale Global State). Ein späterer Request im selben Prozess greift auf bereits freigegebenen Speicher zu (Use-after-free).
Der CVSS-Vektor lautet bei beiden AV:N/AC:H/AT:P/PR:N/UI:N/VC:H/VI:H/VA:H. Übersetzt: Attack Vector Network, keine Privileges und keine User Interaction nötig, volle Auswirkung auf Confidentiality, Integrity und Availability. Die „Attack Complexity: High“ heißt nach meiner Lesart, dass ein Angriff auf Build, Speicher und Timing abgestimmt werden muss. Das passt zum PHP-Advisory, laut dem die Zuverlässigkeit von Build, Extensions und Memory-Allocator abhängt. Das bremst Angreifer, schützt aber nicht: Funktionierende Exploits sind demonstriert.
Anfangs kursierte ein CVSS-Score von 10.0, unter anderem von watchTowr. Offiziell vergibt das PHP-Team 9.2. Und nicht verwechseln: „WP2Shell“ ist eine andere Lücke in WordPress selbst, die ein normales WordPress-Update behebt. PHP2Shell kann nur dein Hoster oder Server-Admin beheben.
Quellen: php2shell.com, Wiz, beide GitHub-Advisories des PHP-Teams, The Hacker News, Meow Apps
chronologie
Die Bug-Klasse ist seit über 20 Jahren bekannt und galt lange als praktisch nicht ausnutzbar. So kam es zum Emergency-Release. Alle Zeiten in UTC.
memory_limit.
Calif
technischer hintergrund
Wer nur wissen will, was zu tun ist, springt weiter zu den Abschnitten für Website-Betreiber und Admins.
Das gemeinsame Grundproblem
PHP arbeitet mit sogenannten Workern: Ein Prozess beantwortet nacheinander viele Requests und räumt dazwischen den Speicher auf. Läuft ein Request in einen Fatal Error, typischerweise das Überschreiten von memory_limit oder einen Timeout, bricht PHP die laufende Operation per longjmp hart ab. Passiert das im falschen Moment, bleiben halb fertige Datenstrukturen oder Pointer auf bereits freigegebenen Speicher zurück, und der nächste Request behandelt diesen Speicher als gültig. Fachleute nennen das „Use-after-free“.
Entscheidend: Alle bekannten Auslöser stecken im Parsing von multipart/form-data, also Formularen und Datei-Uploads. PHP verarbeitet diese Daten, bevor der Code deiner Website läuft. Deshalb ist eine Seite auch dann angreifbar, wenn ihr eigener Code fehlerfrei ist.
Quellen: beide GitHub-Advisories des PHP-Teams, Wiz, Sansec
CVE-2026-109618: OOM-Corruption mitten in der Initialisierung
Laut PHP ist Speicher eines Requests manchmal schon erreichbar, bevor er fertig initialisiert ist. Schlägt genau dann irgendeine Allocation fehl, verlässt PHP den Vorgang per longjmp, und beim Request-Shutdown wird mit ungültigen Daten gearbeitet. Calif beschreibt ein Beispiel: Eine Hashtable erhöht ihren Zähler, bevor der neue Eintrag fertig ist. Kommt dazwischen der OOM, verarbeitet der Cleanup einen halb fertigen Eintrag.
Angreifer lösen den OOM gezielt aus, etwa mit Multipart-Requests ohne brauchbare Content-Length, die an der Größenprüfung vorbeikommen, mit beliebig vielen Headern pro Part, mit leeren File-Feldern, die nicht gegen das Upload-Limit zählen, und mit verschachtelten Array-Feldnamen, die den Aufwand vervielfachen.
Dazu kommt ein Memory Leak wie bei Heartbleed: Ein Stale Pointer auf die Session-ID kann einen abgebrochenen Request überleben. Ein späterer Request bekommt dann im PHPSESSID-Cookie Inhalte aus fremdem Speicher zurück, auch wenn die Website gar keine Sessions nutzt.
Zur Zuordnung: Wiz und Sansec rechnen das Memory Leak und den Bug im Session Upload Progress CVE-2026-109618 zu. Das PHP-Advisory führt den Session Upload Progress unter CVE-2026-109619. Ich halte mich bei den Beschreibungen an die offiziellen PHP-Texte.
Bestätigt ist laut PHP Remote Code Execution mit den Rechten des Webserver-Benutzers, ohne Login, getestet gegen Apache mit mod_php in der Default-Konfiguration. mod_php räumt auch nach einem fehlgeschlagenen Request-Startup auf und ist dadurch angreifbar, bevor irgendein Website-Code läuft. PHP-FPM beendet den Prozess in diesem Fall, ist laut Quellcode-Analyse aber nach einem normalen Startup trotzdem anfällig. Für FrankenPHP und LiteSpeed gilt das laut PHP vermutlich ähnlich.
Quellen: GHSA-w8hw-w9fx-j79w, Calif, Wiz, Sansec
CVE-2026-109619: Stale Global State aus dem vorherigen Request
Bestimmter globaler State, etwa zu Error-Handling, Sessions oder Extensions, überlebt den Request, der ihn erzeugt hat. Für einen Exploit braucht es zwei Requests an denselben Prozess: einen, der den State durch einen Fatal Error zurücklässt, und einen zweiten, der ihn benutzt, bevor er zurückgesetzt wird.
fatal_error_backtraces aktiv, wird dieser State nicht zurückgesetzt. Das ist laut PHP der stärkste Fall und Grundlage des bestätigten Exploits.
Session Upload Progress: Ein OOM während des Uploads lässt Session-State zurück. Bestätigt für mod_php und PHP-FPM.
OPcache: Laut Wiz geraten nach einem OOM der prozesslokale Cache und der Shared-Memory-Cache aus dem Takt, ein anderer Prozess liest dann Daten als falschen Typ (Type Confusion).
Mehrere Worker und regelmäßige Restarts der Prozesse senken die Erfolgsquote, beseitigen das Risiko aber nicht.
Quellen: GHSA-6wmf-4rv5-p3rp, Wiz, JFrog
Was das Update ändert
Ein OOM bricht PHP nicht mehr per longjmp mitten in einer Operation ab. Stattdessen gibt es ein Soft Limit, an dem PHP am nächsten sicheren Punkt stoppt, und ein Hard Limit, an dem sich der Prozess sofort mit _exit(137) beendet. Persistenter State wird beim Request-Shutdown zurückgesetzt. Eine Nebenwirkung: Wird das Hard Limit erreicht, laufen keine Shutdown-Funktionen mehr. Wer darüber Logging oder Cleanup erledigt, sollte das wissen.
Quellen: GHSA-w8hw-w9fx-j79w, JFrog, php2shell.com, Datadog
betroffene versionen
Wichtig bei Paketen aus Linux-Distributionen: Debian, Ubuntu und andere backporten Fixes oft, ohne die Versionsnummer zu ändern. php -v zeigt dann eine alte Nummer, obwohl das Paket sicher ist. Prüf in dem Fall den Changelog des Pakets.
Wichtig bei 7.4, 8.0 und 8.1: Das PHP-Team hat dafür keinen vollständigen Fix veröffentlicht, sondern laut Commit eine „Minimal mitigation for EOL version“. Sie deckt beide CVEs ab, schaltet aber Session Upload Progress fest ab, egal was in der php.ini steht. Sury nutzt diesen Patch, das habe ich im Quellpaket für 7.4 nachgesehen. Für künftige Lücken gibt es in diesen Zweigen keine Garantie, plan also den Umstieg auf 8.3 oder neuer.
Quellen: GitHub-Advisories des PHP-Teams, SOCRadar (Support-Daten), php.net, Calif, The Hacker News, Commit des Minimal-Patches, deb.sury.org #145
Server-Varianten (SAPIs)
Die Voraussetzungen sind in der Standardeinstellung erfüllt: Session Upload Progress ist per Default aktiv, und praktisch jede Website nimmt Formulardaten an.
Quellen: php.net, Calif, Upwind, JFrog
Betroffene Anwendungen
Weil die Lücke in PHP steckt, ist jede PHP-Anwendung betroffen. Vorgeführt wurden Angriffe ohne Login auf WordPress 7.1.2, Drupal 11.4.3, Joomla 6.1.4, MediaWiki 1.46.2, Roundcube 1.7.4, Magento 2.4.9, phpMyAdmin 5.2.3, Nextcloud 35.0.1, Laravel 13.11, Symfony 8.1 und WHMCS. Das sind nur Beispiele. Shopware, WooCommerce, TYPO3, Contao und Eigenentwicklungen sind genauso betroffen.
Vergiss die versteckten Installationen nicht: Appliances und Admin-Oberflächen mit Embedded PHP, Windows-Programme mit mitgeliefertem PHP, Control-Panels, alte Testseiten und Subdomains. Laut einer Shodan-Auswertung laufen rund 884.000 öffentlich erreichbare Server mit PHP 8.1 oder älter, also ohne offizielles Update.
Quellen: Calif, Sansec, php2shell.com, NCSC-NL, SOCRadar (Zahlen von Mallory.ai), Vincent Schmalbach
stand bei hostern und anbietern
Momentaufnahme vom 21. Oktober 2026. Prüf immer die aktuelle Seite deines Anbieters.
Linux-Distributionen
8.1.2-1ubuntu2.28) und 24.04 (php8.3 8.3.6-0ubuntu0.24.04.13). Für 20.04 (php7.4), 18.04 (php7.2), 16.04 (php7.0) und 14.04 (php5) gibt es den Patch nur über Ubuntu Pro (ESM) (Ubuntu-CVE-Seite).
Debian 12 (php8.2 8.2.35-1~deb12u1) und Debian 13 (php8.4 8.4.27-1~deb13u1) sind über die Security-Repositories gepatcht (Debian Security Tracker). Debian 11 mit PHP 7.4 bekommt keinen kostenlosen Patch, Debian LTS endete am 31. August 2026 (ma.ttias.be). Einen Patch über Freexians kostenpflichtiges ELTS habe ich bis zum Abend nicht gefunden.
packages.sury.org (Ondřej Surý) hat am 21. Oktober für Debian 12 und 13 gepatchte Pakete auch für alle End-of-Life-Zweige von 5.6 bis 8.1 veröffentlicht, kostenlos. Ich habe die Pakete geprüft: Bei 5.6, 7.4 und 8.1 nennt das Changelog beide CVEs. ARM-Builds kommen verzögert, für Ubuntu 16.04 gibt es nichts (Issue #145). In 5.6 bis 7.1 fehlt noch das Multipart-Limit aus CVE-2023-0662, Surý hat ein Update angekündigt (Issue #146). Das Launchpad-PPA für Ubuntu zeigte zunächst noch 8.3.35 und 8.4.26 (Vincent Schmalbach).
Remi: rpms.remirepo.net hatte am 21. Oktober keine Updates, PHP rät zu Paketen der Distribution (php.net). Laut ma.ttias.be patcht Remi 7.4, 8.0 und 8.1 weiter, aber ohne Zusage.
Red Hat und AlmaLinux: Red Hat hatte zunächst nur den Stream php:7.4 auf RHEL 8 gepatcht. AlmaLinux hat zusätzlich 7.2, 7.3, 8.0, 8.1 und die neueren Streams selbst gepatcht, außer 7.4 aber vorerst nur im Testing-Repository. Patches für Streams nach dem RHEL-Lebensende sind laut AlmaLinux künftig nicht garantiert.
SUSE und Slackware: haben laut heise am 22. Oktober nachgezogen.
cPanel: EasyApache 4 (Version 25.91) bringt 8.2.35 bis 8.5.12 und gepatchte ea-php74, ea-php80 und ea-php81. Ältere Zweige deckt das nicht ab (NCSC-NL).
CloudLinux: gepatchte alt-php 7.4 und 8.0 auf den meisten Plattformen, 8.1 auf einigen. alt-php 5.2 bis 7.3 waren am Abend noch im Test (CloudLinux). Plesk hat unten einen eigenen Abschnitt.
Kommerzielle Anbieter: Zend meldet laut ma.ttias.be gepatchte LTS-Builds für 7.2 bis 8.1. TuxCare testet laut InMotion Hosting Pakete für seinen Extended Lifecycle Support. Eine eigene Meldung von Zend oder TuxCare habe ich nicht gefunden.
Community-Patches
Auf GitHub gibt es Community-Repositories mit eigenen Patches für alte Versionen, etwa Anton-Barinov/php2shell-patches für PHP 5.6 bis 8.1. Nach eigener Angabe kombiniert es offizielle und Community-Backports und lässt Uploads samt Fortschrittsbalken funktionieren. Das PHP-Team steht nicht dahinter, und ich habe den Code nicht geprüft. Meine Empfehlung: nur als letzter Ausweg, wenn es weder Pakete der Distribution noch einen Anbieter gibt, und nur nach eigenem Code-Review. Auf GitHub kursieren zu PHP2Shell auch gefälschte Exploits mit Schadcode (JFrog), führ also nichts ungeprüft aus.
Hoster
Die meisten großen Hoster spielen Patches oder WAF-Regeln ein, darunter Cloudways, DreamHost, Kinsta, SiteGround, WP Engine, OVHcloud, Pantheon und Rocket.net. Bei GoDaddy-VPS musst du PHP selbst aktualisieren (Meow Apps). Bei Shared Hosting gilt: Frag nach, ob die sichere Version für jede deiner Domains aktiv ist. Ein Versionswechsel im Kundenmenü beweist das nicht (Vincent Schmalbach).
Google Cloud
Google Cloud selbst ist nicht verwundbar, PHP-Anwendungen der Kunden schon. App Engine Standard mit PHP 8.2 oder neuer wird automatisch aktualisiert, App Engine Flexible nicht. Cloud Run wird automatisch aktualisiert, wenn Automatic Base Image Updates aktiv sind, sonst musst du neu builden und neu deployen. Bei GKE und eigenen Container-Images ebenfalls neu builden und ausrollen. PHP 8.1 und älter bleiben verwundbar (Google Cloud, Bulletin GCP-2026-070).
Cloudflare und andere Schutzdienste
Cloudflare hat seit 21. Oktober, 03:02 UTC, WAF-Regeln gegen die bekannten Angriffsvektoren aktiv, auch im Free-Plan ohne eigenes Zutun. Bezahlkunden sollen prüfen, dass das Managed Ruleset auf Block statt nur auf Log steht. Angreifer haben ihre Requests bereits angepasst, um die Regeln zu umgehen (Cloudflare). Akamai, AWS, Fastly, Imperva, Microsoft und Vercel haben ebenfalls Schutzmaßnahmen veröffentlicht (Wiz). Eine WAF ersetzt das Update nicht: Ist dein Server zusätzlich direkt über seine IP-Adresse erreichbar, läuft der Angriff an ihr vorbei.
Docker
Ein neues Image nur zu pullen reicht nicht. Bau deine Images auf dem gepatchten Base-Image neu und erstell die Container neu (Meow Apps). FrankenPHP braucht eine neue FrankenPHP-Version, Laravel Vapor die gepatchte Runtime plus neues Deployment (Vincent Schmalbach).
Quellen: Meow Apps, Vincent Schmalbach, php.net, Google Cloud, Cloudflare, Wiz, Ubuntu, Debian Security Tracker, deb.sury.org #145, deb.sury.org #146, AlmaLinux, CloudLinux, NCSC-NL, ma.ttias.be, InMotion Hosting, Anton-Barinov/php2shell-patches, heise
wird die lücke schon ausgenutzt?
Ja, es gibt Angriffsversuche. Bestätigte erfolgreiche Einbrüche waren bis zum Abend des 21. Oktober nicht öffentlich dokumentiert.
Vorsicht vor gefälschten Exploits: JFrog berichtet von angeblichen Test-Exploits auf GitHub mit verstecktem Code. Wer „mal eben testen“ will, führt im Zweifel fremden Code auf dem eigenen Rechner aus. Seit dem 21. Oktober gibt es aber auch echte öffentliche PoCs, siehe Update.
Zum Vergleich: Bei der letzten großen PHP-Lücke, CVE-2024-4577 im Juni 2024, sah Akamai Angriffsversuche innerhalb von 24 Stunden nach der Veröffentlichung.
Quellen: Cloudflare, Sansec, The Hacker News, watchTowr, SOCRadar, Help Net Security, JFrog, Cybersecurity News, Amazon Threat Intelligence, Rescana
was website-betreiber jetzt tun sollten
Du hast eine WordPress-Seite, einen Shop oder eine andere PHP-Website und kümmerst dich nicht selbst um den Server? Dann gehst du so vor:
wp-content/uploads, fremde Seiten bei der Google-Suche site:deinedomain.de und Warnungen in der Search Console.
Bei Verdacht: Hoster informieren, sauberes Backup einspielen und alle Passwörter und API-Keys wechseln.
Ein Update von WordPress, Plugins oder Theme behebt PHP2Shell nicht. Das muss auf dem Server passieren.
was server-admins jetzt tun sollten
1. Bestandsaufnahme
Erfasse jede PHP-Installation, öffentlich erreichbare zuerst: Pakete der Distribution, mehrere PHP-Versionen nebeneinander, Docker-Images, Control-Panels, gebündelte PHP-Binaries, Staging- und Testsysteme und alte Subdomains. Das britische NCSC nennt diese Bestandsaufnahme als ersten Schritt. Die Schleife unten ist meine Ergänzung.
# Installierte PHP-Zweige (Debian/Ubuntu) ls /etc/php # Versionen aller PHP-Programme for b in /usr/bin/php* /usr/sbin/php-fpm*; do [ -x "$b" ] && echo "$b: $($b -v 2>/dev/null | head -1)"; done
2. Logs sichern
Kopier vor dem Update die Logs von Webserver und PHP ab dem 20. Oktober 2026 weg. Updates und Log-Rotation können sie sonst löschen.
3. Aktualisieren
sudo apt update apt-cache policy php8.3-fpm # installiert und verfügbar vergleichen apt-mark showhold # gesperrte Pakete blockieren Updates still sudo apt upgrade # Ist die Korrektur im Paket? Änderungsprotokoll prüfen zcat /usr/share/doc/php8.3-fpm/changelog.Debian.gz | head -20
Aktualisier alle installierten PHP-Versionen, nicht nur die gerade genutzte. Update-Buttons in Control-Panels installieren nur, was das eingestellte Repository anbietet. Wer selbst kompiliert, findet die Quellen auf php.net und die Minimal-Patches für 7.4, 8.0 und 8.1 auf GitHub.
4. Alles neu starten
Ein installiertes Paket schützt erst, wenn die alten Prozesse beendet sind.
sudo systemctl restart php8.3-fpm # je PHP-Version sudo systemctl restart apache2 # bei mod_php # Prozesse, die noch das alte Programm nutzen ls -l /proc/*/exe 2>/dev/null | grep -i 'php.*deleted'
Auch Queue-Worker, Laravel Horizon, Octane und Scheduler neu starten. Leg zum Prüfen keine öffentliche phpinfo()-Seite an.
5. Nach dem Update aufräumen
memory_limit = -1 zurücknehmen und Uploads und Formulare testen.
memory_limit, post_max_size und max_input_nesting_level wieder sinnvoll begrenzen.
session.upload_progress.enabled = 0 dauerhaft ausgeschaltet lassen, wenn du die Funktion nicht brauchst. Das empfiehlt PHP auch nach dem Update.
Quellen: Vincent Schmalbach, UK NCSC, php2shell.com, php.net, GHSA-6wmf-4rv5-p3rp
plesk: so kommt das update wirklich an
Plesk ist bei kleinen Agenturen und Hostern weit verbreitet, und gerade hier gab es am 21. Oktober Verwirrung.
Meine Erfahrung: Auf meinem Plesk-Server unter Linux zeigte der Plesk-Updater keine Updates an. Erst diese zwei Befehle auf der Konsole haben die korrigierten PHP-Pakete installiert:
apt update apt upgrade
Damit bin ich nicht allein. Im Plesk-Forum berichten mehrere Admins dasselbe: „In some cases, users won't see the update on their GUI.“ Andere sahen die Updates dagegen im Updater. Verlass dich also nicht auf die GUI, sondern prüf die installierte Version auf der Konsole.
Drei PHP-Baustellen auf einem Plesk-Server
plesk-php82, plesk-php83 und so weiter, installiert unter /opt/plesk/php/). Damit laufen meist deine Websites.
Das PHP deiner Linux-Distribution, falls es als PHP-Version für Domains aktiviert ist.
sw-engine, das PHP, mit dem das Plesk-Panel selbst läuft.
Stand bei Plesk am 21. Oktober
7.4.33-debian.12.261021.1344 (eigene Prüfung)
Nach dem Update der Website-PHP-Versionen zeigten Ausgaben im Forum für sw-engine weiterhin PHP 8.4.24 oder 8.4.25. Das Panel war also zunächst noch nicht abgesichert, obwohl die Websites es schon waren. Den Plesk-Support-Artikel konnte ich nur über ein Suchmaschinen-Snippet lesen, prüf den aktuellen Stand deshalb direkt dort.
Schritt für Schritt unter Debian oder Ubuntu
Erst den Plesk-Installer anstoßen, dann die Repositories aktualisieren. Diese Reihenfolge hat im Forum mehreren Admins geholfen. Laut Plesk spielt das Plesk-Update außerdem fehlende GPG-Keys ein.
sudo plesk installer update sudo apt update sudo apt upgrade # Meldet der Installer "BUSY: Update operation was locked" sudo plesk installer stop sudo plesk installer update
Erscheint bei apt update der Fehler NO_PUBKEY für die Plesk-PHP-Quellen, half im Forum, den GPG-Key von Plesk neu einzuspielen. Das ist ein Community-Workaround, kein offizieller Plesk-Weg:
sudo cp /etc/apt/keyrings/plesk.gpg /etc/apt/keyrings/plesk.gpg.bak curl -fsSL https://autoinstall.plesk.com/plesk.gpg | gpg --dearmor | sudo tee /etc/apt/keyrings/plesk.gpg > /dev/null sudo apt update sudo apt upgrade
Danach die installierten Versionen prüfen. Erwartet werden 8.2.35, 8.3.36, 8.4.27 oder 8.5.12 und neuer:
for p in /opt/plesk/php/*/bin/php; do echo "$p: $($p -v | head -1)"; done apt policy plesk-php83-fpm
Dann die PHP-Dienste neu starten. Die Dienstnamen entsprechen dem Plesk-Standard, das ist meine Ergänzung:
sudo systemctl restart plesk-php83-fpm sudo systemctl restart plesk-php84-fpm sudo systemctl restart apache2
session.upload_progress.enabled = 0 in der php.ini unter /opt/plesk/php/8.3/etc/ (je Version) setzen und die Dienste neu starten. Laut PHP muss die Einstellung greifen, bevor ein Request verarbeitet wird, darum nicht auf .user.ini verlassen.
Domains prüfen: Unter Werkzeuge & Einstellungen, PHP-Einstellungen siehst du die installierten Versionen, bei jeder Domain die verwendete. Domains auf PHP 8.1 oder älter jetzt umstellen und testen.
Quellen: Plesk-Forum, Seite 3, Plesk-Forum, Seite 4, Plesk-Support-Artikel, php.net, Plesk-Repository
workarounds, falls du nicht sofort aktualisieren kannst
Laut PHP gibt es keinen vollständigen Workaround über die Konfiguration. Alle folgenden Maßnahmen schließen nur einzelne Angriffsvektoren. Das britische NCSC rät: Wenn du weder aktualisieren noch die Mitigations schnell genug umsetzen kannst, erwäge, das System vom Netz zu nehmen. CERT-EU rät, betroffene Anwendungen bis zum Update vom öffentlichen Netz abzuschotten. Das BSI rät ebenso zur Trennung vom Internet, und laut RUS-CERT reichen die Mitigations nicht, um eine öffentlich erreichbare PHP-Anwendung zu betreiben.
Gegen CVE-2026-109618
; php.ini memory_limit = -1 ; PHP-FPM-Pool, von Anwendungen nicht überschreibbar php_admin_value[memory_limit] = -1 ; kleine Obergrenzen für Formulardaten post_max_size = 8M ; ohne Datei-Uploads ; post_max_size = 32M ; mit Datei-Uploads upload_max_filesize = 2M ; muss unter post_max_size liegen
Achtung: Mit memory_limit = -1 kann ein einzelner Request den ganzen RAM belegen. PHP empfiehlt als Grenze ein Container- oder cgroup-Limit. Auf keinen Fall RLIMIT_AS oder RLIMIT_DATA verwenden, die lösen genau den verwundbaren Fall aus. Zusätzlich sollte der Webserver Body-Größe, Anzahl der Felder, Multipart-Parts und Header begrenzen, auch für Requests ohne Content-Length.
Gegen CVE-2026-109619
session.upload_progress.enabled = 0 fatal_error_backtraces = 0 ; nur PHP 8.5 ; im PHP-FPM-Pool fest verankern php_admin_flag[session.upload_progress.enabled] = off
Setz das in der php.ini, im FPM-Pool oder in der Server-Konfiguration und starte danach alle PHP-Prozesse neu. Verlass dich nicht auf ini_set() oder .user.ini, die greifen laut PHP zu spät. Entfern außerdem ungültige oder veraltete PHP-Einstellungen, die bei jedem Request Warnungen erzeugen. Bei PHP-FPM hilft pm.max_requests = 1, weil dann kein Prozess zwei Requests bedient. Das kostet aber deutlich Performance.
Bei Shared Hosting ohne Root-Zugang schlagen Vincent Schmalbach und das Tool php-fix eine .user.ini vor. PHP rät ausdrücklich davon ab, sich darauf zu verlassen. Meine Empfehlung: als Notbehelf besser als nichts, aber den Hoster zum Update drängen.
Die harte Variante: Multipart-Requests blocken
Alle bekannten Auslöser sind Requests mit dem Content-Type multipart/form-data. Wer sie am Webserver abweist, blockiert die bekannten Angriffsvektoren. Die Nebenwirkung: Datei-Uploads funktionieren nicht mehr, also etwa die WordPress-Mediathek, und je nach Plugin auch manche Kontaktformulare. Normale Seiten, Logins und APIs laufen weiter.
# nginx: /etc/nginx/conf.d/block-multipart.conf
map $http_content_type $block_multipart {
default 0;
~*multipart 1;
}
# in jedem server-Block, der an PHP weitergibt
if ($block_multipart) { return 444; }
# Apache 2.4
<If "req('Content-Type') =~ /multipart/i">
Require all denied
</If>
# Caddy und FrankenPHP
@multipart header_regexp Content-Type (?i)multipart
respond @multipart 403
# LiteSpeed (.htaccess, oberhalb des WordPress-Blocks)
RewriteEngine On
RewriteCond %{HTTP:Content-Type} multipart [NC]
RewriteRule ^ - [F]
Testen, auch direkt gegen die IP-Adresse des Servers, und die Sperre nach dem Update wieder entfernen:
curl -sS -o /dev/null -w '%{http_code}\n' -X PUT -F test=1 https://deinedomain.de/index.php
curl -sS -o /dev/null -w '%{http_code}\n' -X PUT -F test=1 --resolve deinedomain.de:443:SERVER-IP https://deinedomain.de/index.php
Weitere Möglichkeiten: nicht benötigte Testseiten sofort abschalten, Tools wie phpMyAdmin auf die eigene IP-Adresse beschränken, im Notfall PHP stoppen und eine statische Wartungsseite ausliefern. Der Wartungsmodus von WordPress reicht dafür nicht.
Quellen: php.net, GHSA-w8hw-w9fx-j79w, GHSA-6wmf-4rv5-p3rp, UK NCSC, SOCRadar, Vincent Schmalbach, Sansec, php-fix, BSI, RUS-CERT
was nicht schützt
file_uploads = Off und enable_post_data_reading = Off. PHP liest die Daten trotzdem oder die Formulare gehen kaputt.
disable_functions sowie das Ausblenden von Fehlermeldungen über error_reporting oder display_errors.
Eine WAF oder ein CDN, wenn der Server zusätzlich direkt erreichbar ist.
session.upload_progress.enabled = 0 allein. Das hilft laut The Hacker News nicht gegen CVE-2026-109618 und laut JFrog nicht gegen die Varianten über OPcache und Fatal Error Backtraces.
Quellen: Vincent Schmalbach, Meow Apps, Sansec, php.net, The Hacker News, JFrog
woran du einen angriff erkennst
Hinweise auf Angriffsversuche
PHPSESSID-Cookies in den Antworten, ein Hinweis auf das Memory Leak.
Unerklärliche Crashes (Segfaults) oder Restarts von PHP-Prozessen.
POST-Requests mit dem Feld PHP_SESSION_UPLOAD_PROGRESS vor einem File-Part. Der Feldname lässt sich ändern, und PHP parst auch malformed Requests. Eine einfache Textsuche kann Versuche übersehen.
Hinter einem Proxy fallen gescheiterte Versuche meist als Fehler 502 auf. Ein erfolgreicher Exploit liefert dagegen oft schlicht HTTP 200 und lässt den Worker nicht abstürzen. Statuscodes und Abstürze sind also kein verlässlicher Beleg, ein Shell-Prozess unter dem Webserver schon eher (Datadog).
Laut Wiz finden sich im Application-Log kaum Spuren, weil alles darunter passiert. Diese Hinweise beweisen keinen Angriff, und ihr Fehlen beweist keine Sicherheit. Ein erster Blick in die Logs, meine Ergänzung, Pfade je nach System anpassen:
grep -E "Allowed memory size|SIGSEGV|exited on signal" /var/log/php*-fpm.log grep -i "multipart" /var/log/nginx/access.log | awk '$9 ~ /^5/'
Hinweise auf einen erfolgreichen Einbruch
Prüf rückwirkend ab etwa 20. Oktober 2026, 15:00 UTC. Ab da kursierten die CVE-Nummern öffentlich.
curl und wget starten. Dafür lohnt sich ein Alert.
Geänderte Dateien, zum Beispiel mit find /var/www -type f -newermt '2026-10-17 00:00 UTC'. Amazon rät, ab dem 17. Oktober zu suchen. Caches und Logs erzeugen dabei viele False Positives.
Neue oder geänderte .user.ini-Dateien, auto_prepend_file-Einträge, Cronjobs und systemd-Services.
Neue SSH-Keys, neue Admin- oder Systemkonten, Web-Shells und PHP-Dateien in Upload-Ordnern.
Unerwartete ausgehende Verbindungen des PHP-Benutzers.
Findest du etwas: Server isolieren, Logs sichern, neu aufsetzen statt flicken und alle Secrets rotieren, die der PHP-Benutzer lesen konnte, also Datenbank-Passwörter, API-Keys und App-Keys. Wegen des Memory Leaks kann das nach meiner Einschätzung auch ohne Code Execution sinnvoll sein, wenn Angriffsversuche sichtbar waren. Zum Prüfen gibt es Community-Tools wie php2shell-guard und php2shell-triage. Lies den Code, bevor du sie einsetzt.
Quellen: Wiz, php2shell.com, Upwind, Vincent Schmalbach, SOCRadar, PHP Foundation, Datadog, Amazon Threat Intelligence
die rolle der ki
PHP2Shell ist einer der ersten Fälle, in denen KI-Modelle entscheidend geholfen haben, eine seit Jahrzehnten bekannte, aber als zu aufwendig geltende Bug-Klasse in einen funktionierenden Exploit zu verwandeln. Laut Wiz lag der nötige Aufwand früher nahe an der Grenze dessen, was Menschen praktisch leisten können.
Meine Einschätzung: Die Zeit zwischen „theoretisch problematisch“ und „ausnutzbar“ schrumpft. Regelmäßige Updates werden damit noch wichtiger.
Quellen: Help Net Security, Wiz, Google Cloud, Calif, The Hacker News
auswirkungen weltweit
Viele Organisationen haben Dienste vorsorglich abgeschaltet, nicht wegen bestätigter Einbrüche.
Der Sicherheitsforscher Hal Pomeranz warnt vor dem langen Nachlauf: „So many embedded installations out there that will never be patched.“
Quellen: The Hacker News, Brussels Times, Global Banking & Finance Review, Wikimedia, ITmedia, Help Net Security, NBC News, heise, it-daily, Tagesspiegel (dpa)
häufige fragen
Bin ich betroffen, wenn ich WordPress nutze?
Ja, solange das PHP auf deinem Server nicht aktualisiert ist. Die Lücke hängt nicht von der Anwendung ab, das gilt genauso für Shopware, Joomla oder TYPO3.
Reicht es, WordPress zu aktualisieren?
Nein. Dein Hoster oder Server-Admin muss PHP aktualisieren und die PHP-Prozesse neu starten.
Braucht ein Angreifer Zugangsdaten?
Nein. Die vorgeführten Angriffe funktionieren ohne Login.
Meine PHP-Version zeigt eine alte Nummer. Bin ich verwundbar?
Nicht zwingend. Linux-Distributionen backporten Fixes oft, ohne die Nummer zu ändern. Frag deinen Hoster oder prüf den Changelog des Pakets.
Der Plesk-Updater zeigt nichts an. Bin ich sicher?
Nicht unbedingt. Prüf die Version auf der Konsole und führ gegebenenfalls diese Befehle aus, wie oben im Plesk-Abschnitt beschrieben:
plesk installer update apt update apt upgrade
Schützt mich Cloudflare?
Es senkt das Risiko, ersetzt aber kein Update. Angreifer passen ihre Requests bereits an, und ist dein Server direkt über seine IP erreichbar, läuft der Angriff an Cloudflare vorbei.
Ich nutze noch PHP 7.4 oder 8.1. Was nun?
Frag deinen Hoster nach gepatchten Paketen. Es gibt sie unter anderem von Sury, Plesk, cPanel, AlmaLinux und Ubuntu (teils nur mit Ubuntu Pro), siehe den Abschnitt zu Hostern und Anbietern. Für diese Zweige gibt es nur den Minimal-Patch, der Session Upload Progress abschaltet. Plan deshalb den Umstieg auf PHP 8.3 oder 8.4. PHP 8.2 bekommt nur noch bis Ende 2026 Security-Updates.
Quellen: php2shell.com, Meow Apps, The Hacker News, Cloudflare, Plesk-Forum, SOCRadar
fazit
PHP2Shell gehört zu den schwersten Lücken, die PHP je hatte: aus der Ferne, ohne Login, vor jedem Website-Code und in der Default-Konfiguration ausnutzbar. Der Patch ist da, er wirkt aber nur, wenn sie auf jedem PHP-Server eingespielt wird und alle PHP-Prozesse neu starten. Auf Plesk-Servern solltest du dich dabei nicht auf den Updater verlassen, sondern auf der Konsole nachprüfen.
Du bist unsicher, ob deine Website betroffen ist? Einen ersten Eindruck gibt der kostenlose Website-Check. Gern prüfe ich PHP-Version, Hosting und Spuren eines Angriffs für dich und kümmere mich mit deinem Hoster um das Update, schreib mir einfach. Mehr zu Pflege und Betrieb findest du unter Websites und Shops.
alle quellen
Alle Quellen abgerufen am 21. und 22. Oktober 2026.
Erzähl mir, was du vorhast.
Erstgespräch, 30 Minuten, kostenlos. Danach weißt du, was dein Vorhaben kostet und wie lange es dauert.
Erstgespräch anfragen