PHP2Shell: zwei kritische PHP-Lücken schließen und auf Missbrauch prüfen
Am 21. Oktober 2026 hat das PHP-Projekt zwei Lücken geschlossen, über die Angreifer ohne Anmeldung eigenen Code auf Webservern ausführen können. Beide sitzen in PHP selbst, nicht in WordPress, Nextcloud oder dem Shop darüber; erste Angriffe laufen bereits. Dieser Beitrag erklärt, wer betroffen ist, welche Paketstände sicher sind, was bis zum Patch hilft und wie Sie mit unserem freien Prüfskript nach Spuren eines Einbruchs suchen.
Das Wichtigste vorab
- Was: zwei Lücken im PHP-Kern,
CVE-2026-109618undCVE-2026-109619, genannt „PHP2Shell“; CVSS 4.0 je 9,2. - Folge: Codeausführung ohne Anmeldung unter dem Benutzer des Webservers, bei mod_php noch bevor Ihr Anwendungscode läuft.
- Lage: massenhafte Angriffsversuche seit dem 21.10., ein erster schon am 17.10.; das BSI warnt mit Stufe 3 (Orange), Sicherheitsanbieter melden erste erfolgreiche Einbrüche.
- Fix: PHP 8.5.12, 8.4.27, 8.3.36, 8.2.35 oder das Paket Ihrer Distribution, danach PHP-FPM bzw. Apache neu starten.
- Prüfen: unser read-only Skript
php2shell-check.shsucht nach Spuren und zeigt im Terminal nur Zählwerte.
Prüfskript herunterladen: php2shell-check.sh, Version 1.0.0, Bash, BSD-2-Clause,
ändert nichts am System.
SHA-256: 095b35d4fa5826c0
php2shell-check.sh herunterladen
Prüfsumme (.sha256)
Was ist passiert?
Die Lücke hat eine lange Vorgeschichte und eine sehr kurze Schlussphase. Erste Hinweise auf das Speicherproblem fand ein von OSTIF organisiertes Audit schon 2024, ohne dass ein Angriffsweg erkennbar war. Im August 2026 meldeten die Sicherheitsfirma Calif und kurz darauf Wiz unabhängig voneinander einen Weg zur Codeausführung; im September folgten weitere Angriffswege von OpenAI. Geplant war das Release für den 22. Oktober.
- 17.10.: Amazon sieht in seinen Honeypots einen ersten Angriffsversuch, vier Tage vor der Veröffentlichung.
- 20.10.: Die beiden CVE-Nummern machen mit einem falschen CVSS-Wert von 10,0 die Runde. Das PHP-Projekt zieht das Release auf den 21.10. vor; am Abend erscheint versehentlich ein Video des Angriffs.
- 21.10.: Gegen 13:30 UTC erscheinen PHP 8.5.12, 8.4.27, 8.3.36 und 8.2.35 samt Sicherheitshinweisen. Ubuntu, Debian und die offiziellen Docker-Images ziehen am selben Tag nach. Das BSI gibt eine Cybersicherheitswarnung der Stufe 3 (Orange) heraus; CISA, das britische NCSC und CERT-EU warnen ebenfalls. Cloudflare, watchTowr und andere sehen massenhafte Angriffsversuche.
- 22.10.: Das BSI meldet in Version 1.2 seiner Warnung, dass Berichte über umgehbare Patches widerlegt sind; bestätigte Kompromittierungen in der Bundesverwaltung und in regulierten Branchen kennt es noch nicht. Sophos berichtet von einer ersten erfolgreichen Ausnutzung, bei der vermutlich eine Mirai-Variante nachgeladen wurde.
Einordnung: Massenhafte Angriffsversuche sind belegt, einzelne erfolgreiche Einbrüche melden Sicherheitsanbieter. In den Katalog aktiv ausgenutzter Lücken der CISA (KEV) sind beide CVEs zum Stand dieses Beitrags nicht aufgenommen. Offiziell gilt CVSS 4.0 mit 9,2 für beide Lücken; die NVD kommt nach CVSS 3.1 auf 9,8 und 8,1. Wer PHP im Internet betreibt, sollte nicht auf eine Bestätigung warten.
Die beiden Lücken verständlich erklärt
Ein PHP-Worker arbeitet Anfragen in einer festen Reihenfolge ab: Er nimmt die Anfrage an, liest die Eingaben ein (Formularfelder, Cookies, den Fortschritt laufender Uploads), führt das Skript aus, räumt den Speicher der Anfrage auf und nimmt die nächste. Beide Fehler sitzen in diesem Rahmen, nicht im Anwendungscode darüber.
CVE-2026-109618: Speicher läuft beim Einlesen voll
PHP begrenzt den Speicher je Anfrage über memory_limit. Ist die Grenze erreicht, springt PHP
abrupt aus dem laufenden Code heraus. Passiert das, während die Anfragedaten erst halb aufgebaut sind, hält
das spätere Aufräumen den halben Zustand für gültig; daraus lässt sich Codeausführung machen. Den Speicher
treibt ein Angreifer gezielt hoch, ohne die üblichen Grenzen zu reißen: Multipart-Anfragen ohne
Längenangabe umgehen die Prüfung von post_max_size, ein Multipart-Teil darf beliebig viele
Header tragen und verschachtelte Feldnamen vervielfachen die Arbeit.
Das PHP-Projekt hat die volle Codeausführung mit mod_php und Standardgrenzen nachgewiesen. Im
Labor von Datadog genügte ein einzelner Feldname von rund 3,5 MB, allerdings bei einem bewusst auf
16 MB gesenkten memory_limit. Der Fix ersetzt den abrupten Sprung durch einen geordneten
Abbruch an sicherer Stelle.
CVE-2026-109619: Zustand überlebt seinen Speicher
Ein PHP-Worker bedient viele Anfragen nacheinander und hält dafür globalen Zustand. Unterbricht ein fataler Fehler, ein Timeout oder ein Speicherfehler das Aufräumen, zeigt ein Teil dieses Zustands weiter auf Speicher der alten Anfrage, obwohl der schon freigegeben ist (use-after-free). Die nächste Anfrage im selben Worker kann ihn dann benutzen. Bestätigt sind drei Wege:
- Upload-Fortschritt:
session.upload_progress.enabledist ab Werk an und auch ohnesession_start()in der Anwendung erreichbar. - Einstellungen je Anfrage: INI-Werte etwa aus
.htaccessoderphp_value, die früh Warnungen werfen. Fehler auszublenden hilft nicht. - Backtrace fataler Fehler: nur PHP 8.5 mit
fatal_error_backtraces.
Warum das so gefährlich ist: Bei mod_php gelingt der Angriff, bevor Ihr eigener Code überhaupt läuft. Ein Update von WordPress, Nextcloud oder Shopware schließt die Lücken nicht, eine Web Application Firewall in der Anwendung sieht sie nicht. Nur ein gepatchtes PHP hilft.
Wer ist betroffen?
Betroffen ist jede PHP-Laufzeit, die HTTP-Anfragen bedient, nach Angaben von BSI und CERT-EU über alle Versionen seit PHP 5. Das Risiko hängt von der Betriebsart ab:
| Betriebsart | Risiko | Anmerkung |
|---|---|---|
Apache mit mod_php | sehr hoch | Beide Lücken mit voller Codeausführung nachgewiesen, vor jedem Anwendungscode. |
| PHP-FPM (nginx, Apache mit proxy_fcgi) | hoch | CVE-2026-109619 über den Session-Weg auf einem normalen Pool nachgewiesen; für CVE-2026-109618 gibt es laut Advisory noch keinen vollständigen Exploit. |
php-cgi, FrankenPHP, LiteSpeed | gefährdet | Vom PHP-Projekt als gefährdet eingestuft; die Ausnutzbarkeit hängt von der Konfiguration ab. |
| PHP auf der Kommandozeile (CLI) | nicht genannt | Keine Quelle nennt die CLI als betroffen; das Update ersetzt sie trotzdem mit. |
| PHP in Containern | wie oben | Das Image bringt sein eigenes PHP mit; apt upgrade auf dem Host hilft nicht. |
Falle php -v: Der Befehl zeigt nur die Version der Kommandozeile. Apache
oder PHP-FPM können eine andere Version oder einen anderen Build laden. Prüfen Sie deshalb die installierten
Pakete und die laufenden Prozesse, nicht die CLI. Distributionen spielen Korrekturen außerdem zurück, ohne
die Versionsnummer von PHP zu ändern: maßgeblich ist die Paketversion.
Sichere Versionen
Die wichtigsten Fixstände, Stand 22. Oktober 2026. Vergleichen Sie mit der Paketversion Ihrer Quelle:
| Quelle | Paket | Fixstand | Hinweis |
|---|---|---|---|
| PHP (upstream) | 8.5 · 8.4 · 8.3 · 8.2 | 8.5.12 · 8.4.27 · 8.3.36 · 8.2.35 | 8.1 und älter: kein offizielles Release, nur Quell-Backports |
| Ubuntu 26.04 LTS | php8.5 | 8.5.4-0ubuntu1.5 | USN-8948-1 |
| Ubuntu 24.04 LTS | php8.3 | 8.3.6-0ubuntu0.24.04.13 | USN-8948-1 |
| Ubuntu 22.04 LTS | php8.1 | 8.1.2-1ubuntu2.28 | USN-8948-1 |
| Ubuntu 20.04 · 18.04 | php7.4 · php7.2 | 7.4.3-4ubuntu2.29+esm5 · 7.2.24-0ubuntu0.18.04.17+esm14 | USN-8948-2, nur mit Ubuntu Pro |
| Debian 13 trixie | php8.4 | 8.4.27-1~deb13u1 | DSA-6574-1 |
| Debian 12 bookworm | php8.2 | 8.2.35-1~deb12u1 | DLA-4848-1 (Debian LTS) |
| RHEL 10 | php · php8.4 | 8.3.36-1.el10_2 · 8.4.27-1.el10_2 | RHSA-2026:87070 und :87071 |
| RHEL 9 | php 8.0, Module 8.2 und 8.3 | 8.0.30-8.el9_8.1, Module laut Erratum | RHSA-2026:87151, :87072, :87079; Modul 8.4 noch offen |
| RHEL 8 | Module 7.4 und 8.2 | laut Erratum | RHSA-2026:87080 und :87073 |
| AlmaLinux · Rocky Linux | alle Streams | eigene Builds | AlmaLinux seit 21.10. abends, Rocky seit 22.10. |
| PPA ondrej/php · packages.sury.org | php8.1 · php8.0 · php7.4 | 8.1.34-9 · 1:8.0.30-25 · 1:7.4.33-31 | Backport aus 8.2.35; 8.2 bis 8.5 mit den Upstream-Versionen |
Docker Official Image php | Tags 8.5.12, 8.4.27, 8.3.36, 8.2.35 | seit 21.10. | keine 8.1-Tags mehr; Images neu ziehen, Container neu bauen |
PHP 8.1 und älter: Upstream ist 8.1 seit Ende 2025 ohne Unterstützung. Sicher sind Sie nur mit einem Paket, das den Fix zurückportiert hat (Ubuntu, Ubuntu Pro, Sury, Ihr Panel-Anbieter), oder nach dem Wechsel auf 8.2 oder neuer; auch 8.2 erreicht am 31.12.2026 sein Lebensende. Plesk und cPanel haben nach eigenen Angaben ebenfalls korrigierte Builds ausgeliefert, Plesk für 7.4 bis 8.1 unter unveränderter Versionsnummer.
1.Patchen und neu starten
Auf Ubuntu und Debian genügen die normalen Paketquellen. Wichtig ist der zweite Schritt: Ein laufender PHP-FPM- oder Apache-Prozess behält den alten Code im Speicher, bis er neu startet.
# install the fixed packages
sudo apt update
sudo apt install --only-upgrade 'php8.1*' libapache2-mod-php8.1
# restart whatever runs PHP for the web (only the services you have)
sudo systemctl restart php8.1-fpm
sudo systemctl restart apache2
# Debian 12 (php8.2) or Debian 13 (php8.4)
sudo apt update && sudo apt install --only-upgrade 'php8.2*'
# RHEL, AlmaLinux, Rocky: compare with the erratum, not with php -v
sudo dnf upgrade 'php*'
rpm -q php-common php-fpm
Ob der Patch drin ist, zeigt auf Ubuntu 22.04 dieser Einzeiler; er gibt je Paket OK oder
VULNERABLE aus:
dpkg-query -W -f='${db:Status-Abbrev} ${Package} ${Version}\n' 'php8.1*' libapache2-mod-php8.1 2>/dev/null \
| awk '$1=="ii"{r=system("dpkg --compare-versions "$3" ge 8.1.2-1ubuntu2.28"); print $2, $3, (r==0?"OK":"VULNERABLE")}'
Und dieser zählt die Prozesse, die noch alten PHP-Code im Speicher halten. Bei 0 ist alles
neu geladen:
sudo grep -ls 'php.*(deleted)' /proc/[0-9]*/maps 2>/dev/null | wc -l
2.Notbehelf bis zum Patch
Wer nicht sofort patchen kann, sollte das System vom Internet trennen; das empfehlen BSI, CISA und CERT-EU übereinstimmend. Ist das nicht möglich, senken die offiziellen Notbehelfe des PHP-Projekts das Risiko, schließen die Lücken aber nicht. Das PHP-Projekt sagt dazu unmissverständlich: Einen vollständigen Schutz gibt es nur durch das Update.
; CVE-2026-109618: no memory limit inside PHP, use a cgroup/container limit instead
memory_limit = -1
post_max_size = 8M ; 32M if uploads are needed
upload_max_filesize = 8M ; always below post_max_size
; CVE-2026-109619: no upload progress tracking
session.upload_progress.enabled = 0
; PHP 8.5 only
fatal_error_backtraces = 0
- Unumgehbar setzen: in
php.ini, im FPM-Pool alsphp_admin_value[…]oder in Apache mitphp_admin_value, nicht perini_set()oder.user.ini. Prüfen, dass kein Pool, kein Verzeichnis und keine Anwendung wieder ein Limit setzt. - Speicher anders begrenzen: Ohne
memory_limitbraucht der Server eine Grenze über cgroups oder den Container. NiemalsRLIMIT_ASoderRLIMIT_DATAverwenden: Sie lösen genau den verwundbaren Pfad aus. - Am Webserver oder Proxy begrenzen: Größe, Feldzahl, Zahl der Multipart-Teile, Header je Teil und Verschachtelungstiefe der Anfrage, auch für Anfragen ohne
Content-Length. Wer kein Multipart braucht, blockt es ganz. - Worker kurz leben lassen:
pm.max_requests = 1im FPM-Pool, wenn die Leistung es zulässt. - Aufräumen: ungültige oder veraltete INI-Einstellungen je Anfrage entfernen, die früh Warnungen erzeugen, und von außen erreichbare fatale Fehler und Timeouts beheben.
- WAF als Zusatz: Cloudflare schützt seit dem 21.10. mit verwalteten Regeln auch im kostenlosen Tarif; bei bezahlten Zonen prüfen, dass sie auf „Block“ stehen. Die Regel von AWS deckt nur CVE-2026-109619 ab. Beide Anbieter sehen ihre Regeln ausdrücklich als Ergänzung zum Update.
3.Woran man Angriffe erkennt
Ein Angriff hinterlässt je nach Ausgang unterschiedliche Spuren. Fehlversuche stehen oft im Error-Log, ein
erfolgreicher Angriff dagegen meist nicht: Im Labor von Datadog kam nach 3,1 Sekunden ein normales
HTTP 200 zurück, der Worker lief weiter. Deshalb zählen Prozesse und Dateien mehr als Logs.
| Spur | Woran Sie sie erkennen | Aussagekraft |
|---|---|---|
| Speicherfehler beim Anfragestart | PHP Fatal error: Allowed memory size … exhausted … in Unknown on line 0; „Unknown on line 0“ heißt: Fehler vor jedem Skript | Versuch, auch normale Last kann das auslösen |
| Abgestürzte Worker | Apache AH00052: child pid … exit signal Segmentation fault (11), PHP-FPM child … exited on signal 11 | Versuch, oft beim Erraten von Speicheradressen |
| Session-Fehler | Failed to decode session object, Apache exit signal Aborted (6), Core-Dumps unter /var/crash oder /var/lib/systemd/coredump; Session-Dateien, die mit upload_progress_ beginnen | Versuch über CVE-2026-109619 |
| Auffällige Anfragen | viele große POST- oder Multipart-Anfragen einer Quelle, Multipart ohne Content-Length, ungewöhnlich lange PHPSESSID | nur sichtbar, wo Anfragegrößen geloggt werden (Proxy, WAF) |
| Bekannte Scanner und Quellen | User-Agents php2shell-scan, php2shell-verify, php2shell-test; Quelladressen aus den Berichten von Amazon, Sophos und ELLIO | Versuch; Adressen untersuchen, nicht blind sperren |
| Nachgeladene Schadsoftware | Datei /tmp/nfs, gestartet als ./nfs php (Mirai-Variante laut Sophos) | starkes Zeichen für einen Einbruch |
| Shell unter dem Web-Benutzer | sh, bash, curl, python3 mit Elternprozess apache2 oder php-fpm | starkes Zeichen für einen Einbruch |
| Webshell und Nachlader | neue .php-, .phtml- oder .php.jpg-Dateien des Web-Benutzers, Programme aus /tmp oder /dev/shm | starkes Zeichen |
| Persistenz | neue Cron-Einträge, systemd-Units, SSH-Schlüssel, Konten | starkes Zeichen |
4.Das Prüfskript php2shell-check.sh
Wir haben die Prüfungen aus diesem Beitrag in ein Skript gegossen, das wir auf eigenen und betreuten Servern einsetzen. Es läuft als root, ändert nichts am System und schreibt nur einen Bericht. Im Terminal erscheinen ausschließlich feste Texte, Zählwerte und Zeilennummern; Pfade, Adressen und Logzeilen stehen nur im Bericht, den nur root lesen kann. So lässt sich die Ausgabe gefahrlos weitergeben.
curl -fsSLO https://nokkela.blog/downloads/php2shell-check.sh
curl -fsSLO https://nokkela.blog/downloads/php2shell-check.sh.sha256
sha256sum -c php2shell-check.sh.sha256 # must print: php2shell-check.sh: OK
sudo bash php2shell-check.sh # lookback from 2026-10-17
sudo SINCE=2026-08-01 bash php2shell-check.sh # longer lookback
Lesen Sie das Skript vor dem ersten Lauf: Es sind gut 500 Zeilen Bash ohne Abhängigkeiten außer den Bordmitteln von Debian und Ubuntu. Die Ausgabe auf einem Testsystem mit absichtlich gelegten Spuren sieht so aus:
### php2shell-check 1.0.0 (CVE-2026-109618, CVE-2026-109619), since 2026-10-17
[ INFO ] Platform Ubuntu 22.04.5 LTS
[ INFO ] Web users: 1, web roots: 2, error logs: 2, access logs: 1
### PHP packages
[ OK ] 'All 5 PHP packages at a fixed version'
[ OK ] 'Running processes use the current PHP code'
### Attack attempts in the logs
[FAILED] 'Errors while setting up requests (Unknown on line 0): 2 (report lines 17-18)'
[FAILED] 'Crashed Apache or PHP workers, core dumps: 3 (report lines 21-23)'
[FAILED] 'Session errors and upload-progress sessions: 2 (report lines 26-27)'
[FAILED] 'Published PHP2Shell indicators (scanners, source IPs, payload): 3 (report lines 30-32)'
### Traces of a compromise
[FAILED] 'Foreign processes under the web user: 2 (report lines 35-36)'
[FAILED] 'Programs running from /tmp, /dev/shm, memory or a web root: 1 (report line 39)'
[FAILED] 'Script files written by the web user: 1 (report line 42)'
[ INFO ] Other changed script files (deployment?): 1 (report line 45)
[FAILED] 'Files of the web user in /tmp, /var/tmp, /dev/shm: 1 (report line 48)'
[FAILED] 'Signs of persistence (cron, SSH, systemd, accounts): 2 (report lines 51-52)'
[FAILED] 'Package files differing from their package: 1 (report line 55)'
[ INFO ] No SSH logins in the journal
### Result
[FAILED] 'Yellow: 10, review and assess'
[ INFO ] Report: /opt/php2shell-check/reports/report-20261022-212135.txt
[ INFO ] View all findings: tail -n +16 /opt/php2shell-check/reports/report-20261022-212135.txt
Rote Zeilen bedeuten: Patch fehlt oder alter Code läuft noch. Gelbe Zeilen sind Funde, die Sie ansehen
und bewerten. Der Rückgabewert ist 2 bei Rot, 1 bei Gelb und 0
ohne Funde, damit lässt sich das Skript auch in Ansible oder ein Monitoring einbinden.
| Prüfung | Was genau | Bei Fund |
|---|---|---|
| Paketstand | PHP-Pakete gegen den Fixstand von Ubuntu, Debian oder den Sury-Builds; Versionen ohne bekannten Fix | rot |
| Alter Code im Speicher | Prozesse, die ersetzte PHP-Dateien noch eingeblendet haben | rot |
| Fehler beim Anfragestart | „in Unknown on line 0“ in den Error-Logs von Apache, nginx und PHP (auch rotiert und gepackt) | gelb |
| Worker-Abstürze | AH00052, „exited on signal“ von PHP-FPM, Segfaults im Kernel-Log, Core-Dumps | gelb |
| Session-Fehler | „Failed to decode session object“ und Session-Dateien, die nur aus Upload-Fortschritt bestehen | gelb |
| Veröffentlichte Indikatoren | Scanner-User-Agents und Quelladressen in den Access-Logs, bekannter Dateiname der Schadsoftware | gelb |
| Fremde Prozesse | Prozesse des Web-Benutzers, die kein Webserver sind, mit Zahl ihrer Sockets | gelb |
| Programme aus ungewöhnlichen Orten | aus /tmp, /var/tmp, /dev/shm, dem Speicher (memfd) oder dem Webverzeichnis | gelb |
| Neue Skriptdateien | vom Web-Benutzer geschrieben, auch .php.jpg, .htaccess, .user.ini; andere Änderungen nur als Info | gelb |
| Dateien in Temp-Verzeichnissen | Dateien des Web-Benutzers in /tmp, /var/tmp, /dev/shm | gelb |
| Persistenz | Cron, SSH-Schlüssel, Login-Shell des Web-Benutzers, weitere uid 0, ld.so.preload, geänderte Dateien in /etc und den Home-Verzeichnissen; unveränderte Paketdateien werden ausgefiltert | gelb |
| Paketdateien | dpkg --verify: Programmdateien mit abweichender Prüfsumme | gelb |
| SSH-Anmeldungen | erfolgreiche Anmeldungen laut Journal zum Abgleich mit Ihren eigenen | Info |
Grenzen: Ein grünes Ergebnis ist kein Beweis. Das Skript sucht nach den bekannten
Mustern, ein geschickter Angreifer mit Root-Rechten kann Spuren verwischen. Gelb ist nicht gleich Angriff:
eigene Deployments, eine Passwortänderung oder PHP-Cronjobs lösen ebenfalls aus. PHP in Docker-Containern
prüft das Skript nicht; es weist darauf hin, wenn Docker installiert ist. Es läuft auf Debian und Ubuntu
(dpkg); für die RHEL-Familie gelten die Prüfungen sinngemäß mit rpm -q und
rpm -Va.
5.Was tun bei einem Fund?
Die Reihenfolge ist wichtiger als jeder einzelne Schritt: erst schließen, dann prüfen, dann aufräumen.
- Isolieren: Den Server vom Netz nehmen oder per Firewall auf Ihren Verwaltungszugang beschränken. Nicht ausschalten, solange Sie Beweise sichern wollen: Prozesse und Speicher sind dann verloren.
- Beweise sichern: den Bericht des Prüfskripts, die Error- und Access-Logs ab dem 17.10., die Liste der laufenden Prozesse und, wenn möglich, ein Abbild der Platte.
- Geheimnisse wechseln: alles, was PHP lesen konnte, gilt als bekannt: Datenbank-Passwörter, API-Schlüssel in
.envoder Konfigurationsdateien, Cloud-Zugänge, SMTP-Zugänge, Sitzungsschlüssel der Anwendung. Das gilt vorsorglich auch ohne Hinweis auf Codeausführung, wenn der Server ungepatcht im Internet stand: Wiz hat gezeigt, dass sich über die Lücke Speicherinhalte auslesen lassen. - Neu aufsetzen statt bereinigen: Einen kompromittierten Server sauber zu putzen gelingt selten sicher. Neu installieren, gepatchtes PHP einspielen, Daten aus einer Sicherung vor dem 17.10. prüfen und zurückspielen.
- Melden: Bei personenbezogenen Daten gilt die 72-Stunden-Frist der DSGVO (Art. 33); Einrichtungen unter NIS2 haben eigene Meldepflichten.
Häufige Fragen
Was ist PHP2Shell?
PHP2Shell ist der Name für zwei kritische Lücken im PHP-Kern, CVE-2026-109618 und CVE-2026-109619, die das PHP-Projekt am 21. Oktober 2026 geschlossen hat. Sie erlauben Angreifern ohne Anmeldung, Code unter dem Benutzer des Webservers auszuführen, bei Apache mit mod_php sogar bevor der Anwendungscode läuft. Beide sind mit CVSS 4.0 9,2 bewertet; das BSI warnt mit Stufe 3 (Orange).
Bin ich betroffen, wenn ich WordPress oder Nextcloud aktuell halte?
Ja, solange das darunterliegende PHP nicht gepatcht ist. Die Lücken liegen in PHP selbst, nicht in der Anwendung; ein Update von WordPress, Nextcloud oder Shopware schließt sie nicht. Entscheidend sind die Paketversion von PHP und ein Neustart von PHP-FPM bzw. Apache nach dem Update.
Welche PHP-Versionen sind sicher?
Upstream sind PHP 8.5.12, 8.4.27, 8.3.36 und 8.2.35 korrigiert. Für ältere Versionen gibt es zurückportierte Pakete, etwa bei Ubuntu 22.04 php8.1 ab 8.1.2-1ubuntu2.28, bei Debian 12 php8.2 ab 8.2.35-1~deb12u1 und bei Debian 13 php8.4 ab 8.4.27-1~deb13u1. Maßgeblich ist die Paketversion, nicht die Ausgabe von php -v.
Reicht ein Notbehelf wie memory_limit=-1?
Nein. Das PHP-Projekt nennt memory_limit=-1, kleinere Anfragegrenzen und session.upload_progress.enabled=0 als Notbehelfe, betont aber, dass sie nur einzelne Angriffswege schließen. Vollständigen Schutz bietet nur das Update; bis dahin empfehlen BSI, CISA und CERT-EU, betroffene Systeme vom Internet zu trennen.
Wie prüfe ich, ob ein Server über PHP2Shell angegriffen wurde?
Der Nokkela-Blog stellt dafür das freie Prüfskript php2shell-check.sh bereit. Es läuft read-only als root auf Debian- und Ubuntu-Servern und prüft den Paketstand, alten PHP-Code im Speicher, die Logs ab dem 17. Oktober 2026 auf Speicherfehler beim Anfragestart, Worker-Abstürze, Session-Fehler und veröffentlichte Indikatoren sowie fremde Prozesse des Web-Benutzers, neue Skriptdateien, Persistenz und veränderte Paketdateien. Im Terminal erscheinen nur Zählwerte; die Einzelheiten stehen in einem Bericht, den nur root lesen kann. Ein sauberes Ergebnis ist kein Beweis, denn ein erfolgreicher Angriff kann ohne Logeintrag ablaufen.
Was tun, wenn das Prüfskript Funde meldet?
Gelbe Funde zuerst bewerten: Eigene Deployments, Passwortänderungen oder PHP-Cronjobs lösen ebenfalls aus. Bestätigt sich ein Einbruch, den Server isolieren, Beweise sichern, alle Geheimnisse wechseln, die PHP lesen konnte, und das System neu aufsetzen statt es zu bereinigen. Bei personenbezogenen Daten gilt die Meldefrist von 72 Stunden nach Art. 33 DSGVO.
Quellen
Externe Quellen, Stand 22. Oktober 2026 (öffnen in einem neuen Tab):
- PHP-Projekt, Sicherheitsrelease vom 21. Oktober 2026
- PHP-Projekt, GHSA-w8hw-w9fx-j79w (CVE-2026-109618)
- PHP-Projekt, GHSA-6wmf-4rv5-p3rp (CVE-2026-109619)
- The PHP Foundation, Hintergrund zum Sicherheitsrelease
- BSI, Cybersicherheitswarnung zu PHP (Stufe 3)
- CISA, Critical Vulnerabilities in PHP Require Immediate Patching
- NCSC (Vereinigtes Königreich), Critical security issue affecting PHP
- CERT-EU, Security Advisory 2026-018
- NVD, CVE-2026-109618
- Ubuntu, USN-8948-1
- Ubuntu, USN-8948-2 (ESM)
- Debian, DSA-6574-1 (trixie)
- Debian LTS, DLA-4848-1 (bookworm)
- Red Hat, RHSB-2026-013
- AlmaLinux, Updates zu PHP2Shell
- Ondřej Surý, PPA ondrej/php
- Amazon Threat Intelligence, Ausnutzung vor der Veröffentlichung
- Cloudflare, WAF-Schutz gegen PHP2Shell
- Calif, PHP2Shell
- Wiz, PHP2Shell
- Datadog Security Labs, Erkennung und Analyse
- Sophos, Proof of Concept und erste Ausnutzung
- ELLIO, Beobachtungen aus dem Sensornetz
- Eye Security, Risikobewertung
- Bitdefender, Technical Advisory
- Elastic Security Labs, Erkennungsregeln
Patchen, prüfen, im Ernstfall aufräumen
Sie betreiben PHP-Anwendungen und wollen sicher sein, dass PHP2Shell bei Ihnen keine Spuren hinterlassen hat? Wir prüfen Ihre Server, spielen die Korrekturen ein und begleiten im Ernstfall die Aufarbeitung, herstellerunabhängig und DSGVO-konform, mit Rechenzentren in Deutschland und Finnland.
Dieser Beitrag dient der allgemeinen Information und ersetzt keine Prüfung im Einzelfall. Versionsstände und Befehle beziehen sich auf den genannten Stand und sind an Ihre Umgebung anzupassen. Das Prüfskript wird unter der BSD-2-Clause-Lizenz ohne Gewähr bereitgestellt. Stand: Oktober 2026.