CVE-2026-109618 / -109619 – Kritische PHP-RCE

Zwei Fehler im PHP-Kern – technische Analyse, Sicherheitsupdates und Prüfung auf Hosts und in Containern
· CVSS 9,2 (Kritisch) · PHP · Hosting · KI-unterstützt
Sicherheitsupdates — 21. Oktober 2026

PHP 8.5.12, 8.4.27, 8.3.36 und 8.2.35 schließen beide Schwachstellen. Bei Distributionspaketen kann ein dokumentierter Backport den Fix liefern. Nach dem Update alle betroffenen Web-Worker erneuern.

Zwei Fehler in der Speicher- und Zustandsverwaltung von PHP können einem entfernten Angreifer ohne Anmeldung erlauben, Code mit den Rechten des Web-Workers auszuführen. Betroffen ist die Laufzeitumgebung selbst. Ein Update von WordPress, TYPO3 oder einzelnen Plugins reicht deshalb nicht aus.

Dieser Artikel erklärt die beiden Fehler, die Unterschiede zwischen mod_php und FPM und die Schritte vom ersten Versionscheck bis zur Kontrolle der laufenden Instanzen. Stand: 21. Oktober 2026.

Was steckt dahinter?

CVE-2026-109618 — OOM-Corruption

Bei einem Out-of-Memory-Fehler bricht verwundbares PHP den aktuellen Kontext über longjmp() ab. Geschieht das, während Request-Daten erst teilweise initialisiert sind, kann der Shutdown-Pfad später ungültige Daten lesen oder als gültige Strukturen interpretieren.

HTTP-Anfrage → Speicherallokation schlägt fehl → Initialisierung wird unterbrochen → Cleanup verarbeitet ungültigen Zustand → mögliche Codeausführung

Relevant ist dabei auch der Unterschied zwischen Request-Größe und internem Speicherbedarf. Zahlreiche Multipart-Header oder verschachtelte Felder können deutlich mehr Speicher beanspruchen, als ihre übertragene Größe vermuten lässt. Ein kleines post_max_size allein garantiert deshalb keine Absicherung.

Der Fix verändert die OOM-Behandlung: Ein verzögerter Soft-OOM an einem sicheren VM-Punkt beziehungsweise ein unmittelbarer Prozessabbruch bei einer höheren Grenze verhindert den problematischen Rückweg durch den Cleanup.

Details: GHSA-w8hw-w9fx-j79w — RCE via OOM corruption.

CVE-2026-109619 — Use-after-free

PHP-Worker bearbeiten typischerweise mehrere Anfragen nacheinander. Dabei darf global erreichbarer Zustand nicht weiter auf Speicher einer bereits beendeten Anfrage zeigen. Genau diese Grenze wird hier verletzt: Nach Freigabe des Request-Speichers können veraltete Referenzen bestehen bleiben.

Request A veröffentlicht internen Zustand → Fehler verhindert vollständigen Reset → Request-Speicher wird freigegeben → Request B im selben Worker greift auf die alte Referenz zu

Das ist ein Use-after-free. Dafür braucht es sowohl einen Pfad, der den ungültigen Zustand hinterlässt, als auch einen späteren Zugriff auf diesen Zustand. Upload-Progress ist ein bestätigter Pfad; Fehlerdiagnostik während früher Initialisierungsphasen ein weiterer. Bei PHP 8.5 spielen außerdem Fatal-Error-Backtraces eine Rolle.

Mehr Worker oder Worker-Recycling machen aus einer verwundbaren Installation keine gepatchte Installation. Sie können die Bedingungen einer Angriffskette beeinflussen, beseitigen aber den Fehler nicht.

Details: GHSA-6wmf-4rv5-p3rp — RCE via stale global state.

Bin ich betroffen?

Das PHP-Projekt nennt PHP-FPM, Apache mit mod_php, CGI, FrankenPHP und LiteSpeed als grundsätzlich zu prüfende Web-Betriebsarten. Die konkreten Angriffspfade unterscheiden sich.

BetriebsartTechnische Einordnung
Apache / mod_phpBesonders hohes Risiko: bestätigte RCE vor Ausführung des Anwendungscodes.
PHP-FPMBeendet Worker bei fehlgeschlagenem Request-Startup. Das blockiert bestimmte Sequenzen; andere Pfade hängen von Anwendung und Konfiguration ab.
FrankenPHP / LiteSpeed / CGIIn die Inventur aufnehmen; ein anderer Handler allein ist kein Nachweis der Unverwundbarkeit.

Codeausführung erfolgt zunächst mit den Rechten des Web-Workers. Ob daraus Zugriff auf andere Kunden, Secrets oder den Host entsteht, hängt von Dateirechten, Mounts, Prozessisolation und erreichbaren Diensten ab. Eine PHP-RCE bedeutet daher nicht automatisch Root-Zugriff. Im Shared Hosting ist die Kundentrennung trotzdem ein wesentlicher Teil der Risikobewertung.

Abgrenzung der Angriffspfade: GHSA-w8hw-w9fx-j79w — RCE via OOM corruption und GHSA-6wmf-4rv5-p3rp — RCE via stale global state.

ZweigKorrigiert ab (Upstream)
PHP 8.58.5.12
PHP 8.48.4.27
PHP 8.38.3.36
PHP 8.28.2.35

PHP 8.1 und älter erhalten keine regulären Projekt-Releases mehr. Die bereitgestellten minimalen Source-Backports für 7.4, 8.0 und 8.1 helfen Paketbauern, verlängern aber nicht den regulären Support. Für solche Installationen braucht es einen belastbaren Nachweis des Paketlieferanten oder eine Migration.

Bei distributionsgepflegten Paketen zählt die vollständige Paketversion. Ubuntu 24.04 LTS liefert den Fix beispielsweise als 8.3.6-0ubuntu0.24.04.13; Debian 13 als 8.4.27-1~deb13u1. Die nackte Upstream-Nummer ist damit kein ausreichender Prüfmaßstab.

Paketnachweise: Ubuntu USN-8948-1 und Debian DSA-6574-1 — php8.4; Upstream: PHP Security Advisory — 21 October 2026.

Schnellcheck auf dem System

Die folgenden Befehle lesen lokale Versions-, Konfigurations- und Prozessinformationen. Die Beispiele verwenden rg (ripgrep); Paketabfragen gelten für Debian/Ubuntu.

# CLI-Version und geladene Konfiguration
php -v
php --ini

# Einstellungen dieses CLI-Binarys
php -r 'foreach ([
    "memory_limit",
    "post_max_size",
    "session.upload_progress.enabled",
    "fatal_error_backtraces"
] as $key) {
    printf("%s=%s\n", $key, var_export(ini_get($key), true));
}'

# Laufende Web-Worker und Startzeiten
ps -eo user,pid,lstart,args | rg '[p]hp-fpm|[p]hp-cgi|[a]pache2|[h]ttpd'

# Vollständige Paketversionen (Debian/Ubuntu)
dpkg-query -W -f='${Package} ${Version}\n' \
  'php*' 'libapache2-mod-php*' 2>/dev/null
Geltungsbereich der Ausgabe

php -v, php --ini und ini_get() zeigen die CLI-Umgebung. FPM-Pools, Apache, Plesk-Handler und Container können andere Binaries und Einstellungen verwenden. Die Ausgabe ist ein Einstieg in die Inventur, kein Nachweis für eine Website.

Pro virtuellem Host sollte die Zuordnung zu Socket, FPM-Pool oder Container dokumentiert werden. Bei Plesk zusätzlich die Handler unter /opt/plesk/php/ berücksichtigen. Den effektiven Web-Kontext über einen intern beschränkten Diagnoseweg prüfen; eine öffentliche phpinfo()-Seite würde unnötig Konfigurationsdetails offenlegen.

Sofortmaßnahme: PHP aktualisieren

Der dauerhafte Fix ist das Update der tatsächlich verwendeten PHP-Installation. Dazu gehören auch getrennte Handler, FPM-Pools, Container und ältere Laufzeitumgebungen.

  1. Zuordnung prüfen: Welche Website läuft über welches Binary, welchen Pool oder welches Image?
  2. Gepatchten Build installieren: Upstream-Sicherheitsrelease oder vom Paketlieferanten dokumentierter Backport.
  3. Worker erneuern: Betroffene FPM-Dienste beziehungsweise Apache neu starten; bei Containern den Dienst mit dem korrigierten Image neu erstellen.
  4. Wirksamkeit prüfen: Paketversion, laufende Prozesse und Web-Handler kontrollieren und einen Funktionstest durchführen.
Kein universeller Konfigurationsfix: PHP weist ausdrücklich darauf hin, dass Übergangsmaßnahmen nur einzelne Angriffspfade reduzieren. Kann ein öffentlich erreichbarer Dienst nicht zeitnah gepatcht werden, Zugriff einschränken oder Isolation erwägen.

Hinweise je Umgebung

Die Befehle sind Beispiele für die jeweils genannte Paketquelle und Betriebsart. Sie werden auf dem eigenen System ausgeführt und können eine kurze Unterbrechung verursachen. Vorher Kompatibilität und Wiederherstellbarkeit klären. Wenn der Kandidat noch keinen Fix enthält, ist ein erfolgreiches Upgrade kein Sicherheitsnachweis.

Debian 13 (Trixie) Fix verfügbar
PHP 8.4 · korrigiertes Paket: 8.4.27-1~deb13u1

Beispiel für einen FPM-Host mit PHP 8.4 aus den Debian-Repositories. Weitere installierte PHP-8.4-Pakete und andere Zweige ebenfalls berücksichtigen.

# Paketlisten aktualisieren und angebotene Version prüfen
sudo apt update
apt-cache policy php8.4-fpm php8.4-cli php8.4-common

# Installierte Pakete aktualisieren (keine Neuinstallation)
sudo apt install --only-upgrade php8.4-fpm php8.4-cli php8.4-common

# FPM-Worker erneuern
sudo systemctl restart php8.4-fpm
systemctl status php8.4-fpm --no-pager

Fix-Nachweis: DSA-6574-1. Andere Debian-Releases gegen ihr eigenes Advisory prüfen.

Ubuntu 24.04 LTS (Noble) Fix verfügbar
PHP 8.3 · korrigiertes Paket: 8.3.6-0ubuntu0.24.04.13

Der Backport behält die Upstream-Nummer 8.3.6 bei. Für die Bewertung ist die vollständige Ubuntu-Paketversion entscheidend.

# Beispiel: Ubuntu-Pakete mit FPM
sudo apt update
apt-cache policy php8.3-fpm php8.3-cli php8.3-common
sudo apt install --only-upgrade php8.3-fpm php8.3-cli php8.3-common
sudo systemctl restart php8.3-fpm

# Installierte Paketversion kontrollieren
dpkg-query -W -f='${Package} ${Version}\n' php8.3-fpm php8.3-common

Für Apache mit mod_php stattdessen das installierte libapache2-mod-php8.3 ebenfalls aktualisieren und apache2 neu starten. Bei Apache als FPM-Frontend liegt der entscheidende PHP-Prozess im FPM-Dienst. Weitere Ubuntu-Versionen: USN-8948-1.

Plesk und PHP aus Fremd-Repositories
Mehrere Handler · eigene Paketquellen · getrennte Patch-Nachweise

Ein Update des System-PHP aktualisiert nicht automatisch die Plesk-Handler unter /opt/plesk/php/. Jeder verwendete Zweig benötigt ein korrigiertes Paket seines Lieferanten. Zusätzliche PHP-basierte Panel-Komponenten separat bewerten.

# Beispiel: separates Plesk-Binary prüfen
/opt/plesk/php/8.3/bin/php -v

# Systemweite FPM-Dienste erfassen
systemctl list-units --all --type=service | rg 'php.*fpm|plesk.*fpm'

Die Ausgabe zeigt Versionen und Dienste, bestätigt aber allein keinen Backport. Den Lieferantenhinweis mit der vollständigen Paketversion und der Domain-/Handler-Zuordnung abgleichen. Für EOL-Zweige nicht aus einem vorhandenen Download auf Sicherheitswartung schließen.

Docker / Compose
Host-PHP und Container-PHP sind getrennte Installationen

Die folgenden Namen sind Beispiele. Compose-Datei und Dienstnamen durch die Werte des eigenen Deployments ersetzen. Für ein fertiges Anbieter-Image:

# Aktuellen Dienst und Image prüfen
docker compose -f compose.yml ps
docker compose -f compose.yml images

# Korrigiertes Image laden und nur den PHP-Dienst neu erstellen
docker compose -f compose.yml pull php-web
docker compose -f compose.yml up -d --no-deps --force-recreate php-web

# Binary innerhalb der neuen Instanz prüfen
docker compose -f compose.yml exec php-web php -v

Vorher sicherstellen, dass der konfigurierte Tag oder Digest auf einen Build mit Fix zeigt. Bei einem fest gepinnten verwundbaren Digest muss die Referenz geändert werden. Eigene Images mit aktualisierter Basis beziehungsweise gepatchten Paketen neu bauen und danach neu bereitstellen. restart allein übernimmt kein neues Image.

Auch hier gilt: php -v prüft die CLI. Zusätzlich den verwendeten FPM-/Web-Handler und die laufende Image-ID beziehungsweise den Digest kontrollieren.

Übergangsmaßnahmen ohne sofortiges Update

Wenn das Update nicht sofort möglich ist, lässt sich die Exposition einzelner Pfade reduzieren. Für die bestätigten Session-Pfade nennt PHP:

; Vor Request-Parsing wirksam setzen, danach alle Worker neu starten
session.upload_progress.enabled = 0
; Zusätzlich für PHP 8.5
fatal_error_backtraces = 0

Geeignet sind php.ini oder passende Server-/FPM-Pool-Einstellungen. ini_set() im Anwendungscode und bei FPM eine .user.ini kommen für diese frühen Pfade zu spät.

Für den OOM-Pfad nennt PHP auch administrativ erzwungenes memory_limit=-1. Das entfernt die kontrollierbare PHP-Speichergrenze, lässt aber andere Allokationsfehler möglich. Gleichzeitig fällt eine normale Begrenzung des Speicherverbrauchs weg. Diese Maßnahme erfordert deshalb eine bewusste Prüfung von Isolation und Verfügbarkeit.

Request-Größe, Feldanzahl, Multipart-Teile, Header und Verschachtelung am Frontend begrenzen. Container-/cgroup-Limits können die Verfügbarkeit eingrenzen; RLIMIT_AS und RLIMIT_DATA sollen laut PHP nicht als Ersatz verwendet werden, weil sie gerade den verwundbaren Allokationsfehler auslösen können.

Keine Entwarnung durch Workarounds

WAF-Regeln filtern bekannte Muster. Konfigurationsänderungen blockieren einzelne Pfade. Wenn ein öffentlich erreichbarer Dienst nicht zeitnah gepatcht werden kann, Zugriff einschränken oder Isolation erwägen.

Maßnahmen und Grenzen: PHP Security Advisory — 21 October 2026 und CERT-EU Security Advisory 2026-018.

Nach dem PHP-Update

Nach dem Rollout sollte für jede Website feststehen, welcher korrigierte Build ihre Anfragen verarbeitet. Dabei vier Dinge getrennt prüfen:

  • Paket oder Image: Vollständige Version beziehungsweise Digest gegen das Hersteller-Advisory abgleichen.
  • Laufende Prozesse: Startzeiten kontrollieren; alte Worker dürfen keine Anfragen mehr bearbeiten.
  • Web-Kontext: Tatsächlichen Handler und effektive Konfiguration über einen intern beschränkten Diagnoseweg prüfen.
  • Anwendung: Login, Uploads, Hintergrundjobs und typische Requests testen.
# Beispiel nach einem FPM-Neustart
systemctl show php8.3-fpm -p ActiveEnterTimestamp -p MainPID
ps -eo user,pid,lstart,args | rg '[p]hp-fpm|[a]pache2|[h]ttpd'

Temporäre Einstellungen erst nach bestätigter Patch-Abdeckung kontrolliert auf die gewünschten Betriebswerte zurücksetzen. Das betrifft besonders ein zwischenzeitlich aufgehobenes memory_limit. Alte Images in Rollback- und Skalierungspfaden ebenfalls aktualisieren.

Rollout abgeschlossen: Patch-Nachweis, erneuerte Worker, geprüfte Web-Zuordnung und Funktionstest dokumentieren. Eine Ankündigung oder eine aktualisierte CLI allein genügt dafür nicht.

Angriffslage und Incident Response

Technisch nachgewiesene Ausnutzbarkeit, öffentliches Exploit-Konzept und bestätigte Kompromittierung im produktiven Betrieb sind unterschiedliche Aussagen. Dieser Beitrag leitet aus der Demonstration eines Exploits keine Zahl bereits übernommener Systeme ab.

Für die eigene Prüfung OOM-Ereignisse, Worker-Crashes und auffällige Multipart-Anfragen zeitlich mit neuen Dateien, Kindprozessen oder ausgehenden Verbindungen korrelieren. Einzelne Fehler sind kein Beweis für einen Angriff; unauffällige Logs sind ebenso wenig ein Beweis für Unversehrtheit. Bei konkretem Verdacht Artefakte sichern und Incident Response einleiten. Ein Update schließt die Lücke, entfernt aber keine bereits eingerichtete Persistenz.

Quellen & weiterführende Links

Stand: 21. Oktober 2026. Für spätere Updates die aktuellen Hersteller-Advisories und vollständigen Paketversionen prüfen.