CVE-2026-23918 — der mod_http2-Double-Free in Apache 2.4.66 im Betreiberüberblick
Am 5. Mai 2026 hat das Apache-HTTPD-Team die Lücke offengelegt, die seither als CVE-2026-23918 geführt wird: ein Double-Free in mod_http2, genauer im Stream-Cleanup-Pfad von h2_mplx.c. Fixed in Apache HTTP Server 2.4.67. CVSS 8.8. Eine TCP-Verbindung, zwei HTTP/2-Frames, und der Worker stürzt ab — auf jedem Default-Deployment mit mod_http2 und multi-threaded MPM. Auf Debian-abgeleiteten Distributionen, in denen die Apache Portable Runtime den mmap-Allokator als Default fährt, ist die Lücke kein reiner DoS, sondern remote ausnutzbar zu Remote Code Execution. Zwei öffentliche PoCs auf GitHub liefern sowohl den DoS- als auch den Detection-Vektor.
Was ist passiert? Wer am Abend des 5. Mai noch HTTP/2 auf Apache 2.4.66 unter Debian, Ubuntu oder einem davon abgeleiteten Image laufen lässt, fährt seit acht Tagen einen Pre-Auth-RCE-Pfad. Kein CISA-KEV-Eintrag, keine dokumentierte aktive Ausnutzung, aber öffentliche PoCs und eine triviale Trigger-Sequenz.
Warum relevant? TYPO3- und Sylius-Hosting im DACH-Mittelstand läuft 2026 weiterhin überwiegend auf Apache 2.4 mit mod_http2 und Debian-/Ubuntu-Base. Wer den HTTP-Front-End-Stack im Eigenbetrieb hat, hat heute eine konkrete 48-Stunden-Patch-Pflicht.
Wer sollte weiterlesen? Plattform-Betreiber von TYPO3- oder Sylius-Hostings, Betreiber gemischter PHP-Webserver-Flotten, Teams, die Apache 2.4.66 in Container-Images, Docker-Compose-Stacks oder Helm-Charts gepinnt führen.
TL;DR — 90 Sekunden
Ein triviales Crash-Pattern, ein dokumentierter RCE-Pfad auf Debian-Default und acht Tage seit Disclosure mit öffentlichem PoC.
Betroffen?
Apache HTTP Server 2.4.66 mit aktiviertem mod_http2 und multi-threaded MPM (event, worker). Praktisch alle TYPO3- und Sylius-Hostings im DACH-Mittelstand, die HTTP/2 für Performance aktiviert haben. Frühere 2.4er-Linien sind nach Apache-Beschreibung nicht betroffen.
Risiko?
DoS trivial — eine TCP-Verbindung, zwei HTTP/2-Frames. RCE remote auf Debian-/Ubuntu-Default mit APR-mmap-Allokator. CVSS 8.8.
Sofortmaßnahme?
Auf Apache 2.4.67 upgraden. Wenn das Wartungsfenster nicht in den nächsten 24 Stunden zu öffnen ist: Protocols http/1.1 setzen, mod_http2 temporär deaktivieren.
Empfehlung?
Mittelstand: Distribution-Patch im laufenden Wartungsfenster, Stopgap-HTTP/1.1-Fallback bis dahin. Enterprise: kuratierte Image-Promotion auf gepatchte Base-Images, WAF-Regel auf die Frame-Sequenz HEADERS → RST_STREAM mit non-zero error code.
Kritikalität?
Siehe Hero-Badge — high.
Was ist das Problem?
Die Lücke ist im Stream-Cleanup-Pfad von mod_http2 angesiedelt, technisch in h2_mplx.c. Die Trigger-Sequenz ist nüchtern: ein Client sendet einen HTTP/2-HEADERS-Frame, sofort gefolgt von einem RST_STREAM-Frame mit einem nicht-null Error-Code, auf demselben Stream, bevor der Multiplexer den Stream überhaupt registriert hat. Zwei nghttp2-Callbacks feuern in Folge: on_frame_recv_cb für das RST und on_stream_close_cb für den Close. Beide rufen anschließend h2_mplx_c1_client_rst → m_stream_cleanup, was denselben h2_stream-Pointer zweimal auf das spurge-Cleanup-Array schiebt. Wenn c1_purge_streams später über spurge iteriert und h2_stream_destroy aufruft, trifft der zweite Aufruf bereits freigegebenen Speicher. Das ist die klassische Double-Free-Bedingung.
Der DoS-Pfad ist damit trivial. Ein einziger angreifender Client kann mit einer einzigen TCP-Verbindung und zwei Frames einen Worker zum Absturz bringen. Apache restartet den Worker im Standardmodus, aber wenn der Angreifer das in Schleife fährt, geht die effektive Verfügbarkeit der HTTPS-Frontline gegen Null.
Der RCE-Pfad ist die strukturell schwere Komponente. Die Apache Portable Runtime kennt zwei Allokatoren für ihren Pool-Mechanismus: einen privaten Heap-Allokator und den mmap-basierten Allokator. Auf Debian, Ubuntu und allen davon abgeleiteten Distributionen ist der mmap-Allokator der Default. Ein Angreifer kann die freigegebene virtuelle Adresse über mmap-Reuse mit einer eigens präparierten, gefälschten h2_stream-Struktur belegen, deren Pool-Cleanup-Funktion auf system() zeigt, und die Apache-Scoreboard-Memory als stabilen Container nutzen, um die Ausnutzung deterministisch zu machen.
Wer ist betroffen?
Eine kompakte Übersicht über betroffene und nicht betroffene Konfigurationen:
Stack
Betroffen
Nicht betroffen / Bedingungen
Apache HTTP Server 2.4.66
Default-Build mit mod_http2 aktiviert und multi-threaded MPM
2.4.67 und höher; mod_http2 deaktiviert; reines prefork-MPM ohne HTTP/2-Modul
Debian 12 / 13
Apache 2.4.66 aus dem Distro-Repo, APR mit mmap-Allokator (Default) — RCE-Pfad offen
Apache 2.4.67-Backport eingespielt oder HTTP/2 deaktiviert
Ubuntu 24.04 / 26.04 LTS
Apache 2.4.66 aus dem Distro-Repo, APR mmap-Default — RCE-Pfad offen
2.4.67-Update via unattended-upgrades eingespielt
RHEL / Rocky / AlmaLinux 9
Apache 2.4.66 aus dem AppStream; APR typischerweise privater Heap-Allokator, nur DoS-Pfad
2.4.67-Update via dnf upgrade eingespielt
Docker httpd:2.4, httpd:2.4.66
Alle Image-Tags vor dem 2.4.67-Bump
Neu gezogene httpd:2.4-Tags nach dem Bump
Wolfi-basierte Apache-Container
Alle vor dem apk-Index-Update der laufenden Woche
Neu gebautes Image nach apk upgrade
nginx, Caddy, HAProxy, Traefik
Nicht betroffen vom Apache-Cluster — eigene HTTP/2-Implementationen
—
TYPO3-/Sylius hinter Reverse-Proxy
Apache als Reverse-Proxy mit HTTP/2 nach außen ist direkt betroffen
Apache als reines Origin hinter nginx-Proxy mit HTTP/1.1-Downstream nicht betroffen
Wer in den letzten acht Tagen Apache 2.4.66 mit mod_http2 auf einer Debian-/Ubuntu-Basis im Internet exponiert hat, hat damit acht Tage einen Pre-Auth-RCE-Pfad gefahren. Ich behandle den Bestand operativ als „bis zum Beweis des Gegenteils kompromittierbar“ — kein Vollalarm-Zustand „kompromittiert“, aber kein Vertrauensstand wie vor dem 5. Mai.
Auswirkungen
CVSS-Wert 8.8 (High), Apache klassifiziert das Advisory als Critical wegen der Kombination aus trivialem DoS-Pfad und dokumentiertem RCE-Pfad auf Debian-Default. Im DACH-Mittelstand ist die betroffene Konstellation die Standardform: Apache 2.4 ist der Default-Webserver in Plesk, cPanel, ISPConfig und als Standard-Container-Image für PHP-Workloads. HTTP/2 ist seit etwa 2018 auf den meisten DACH-Mandanten-Hostings aktiviert.
Eine kompromittierte Webserver-Frontline auf einem TYPO3- oder Sylius-Mandanten-Host bedeutet operativ den Zugriff auf den lokalen Klartext-Source-Code, die laufenden PHP-FPM-Pools mit allen aktiven Backend-User-Sessions, die Datenbank-Verbindung über das in der Konfiguration hinterlegte Credential-Paar, den Cloud-Provider-Token aus dem systemd-Unit oder dem Container-Init, den Backup-Pfad und damit alle historischen Inhalte des Mandanten. Auf Sylius-Hostings kommt der direkte Zugriff auf das Stripe-/Mollie-/Adyen-API-Credential hinzu, wenn es als Umgebungsvariable konfiguriert ist.
Mitigation und Sofortmaßnahmen
Drei Pfade, je nach Wartungsfenster und Distribution-Disziplin.
curl --http2 -I mandant.example.com 2>&1 | head -5
# Erwartet: HTTP/1.1 200 OK (nicht HTTP/2 200)
ModSecurity erkennt die Trigger-Sequenz an der TCP-Schicht nicht direkt — eine WAF-Regel ist primär für Wiederholungs-Trigger-Versuche sinnvoll, nicht als alleinige Mitigation. Der Patch bleibt die einzige vollständige Lösung.
Detection und Prüfung
Drei komplementäre Detection-Pfade, die ich parallel fahre.
Pfad 1: Access-Log-Pattern für unrealistische HEADERS-/RST-Sequenzen
Auf den letzten 7–10 Tagen prüfen. Apache logt RST_STREAM-Frames im normalen mod_http2-Logging-Pfad nicht detailliert; der Indikator ist indirekt — kurze Connection-Lifetime mit sofortigem Stream-Reset und HTTP-Status 400/499.
Wer eine eigene Staging-Umgebung mit Apache 2.4.66 hat, kann mit einem der öffentlichen PoCs die Detection-Regel im passiven Modus validieren — der xeloxa-PoC unterstützt einen --detection-only-Modus, der den Crash-Trigger nicht ausführt, sondern nur die Fingerprint-Sequenz sendet. Nicht gegen Produktiv-Hosts laufen lassen.
Betreiberempfehlung
Die operative Frage ist nicht „patchen oder nicht?“, sondern „wann öffnet sich das nächste Wartungsfenster?“ und „wer trägt das Risiko der acht Tage zwischen Disclosure und Eigenpatch?“.
Operational Decision Block — Patch-Fenster jetzt vs. Stopgap-Fallback
Sofort patchen, wenn der Host eine TYPO3- oder Sylius-Mandanten-Frontline trägt, öffentlich auf 443 erreichbar ist, und Apache 2.4.66 mit mod_http2 aus dem Debian-/Ubuntu-Repo läuft.
Stopgap HTTP/1.1-Fallback einsetzen, wenn das Wartungsfenster nicht in 24 Stunden öffnet, der Host aber öffentlich erreichbar ist. Performance-Einbruäch durch HTTP/2-Verzicht ist messbar, aber tragbar.
Wartungsfenster im Standardzyklus möglich, wenn der Host hinter einem HTTP/1.1-Downstream-Reverse-Proxy steht und der mod_http2-Pfad nicht erreichbar ist.
Reine Awareness, wenn keine Apache-2.4.66-Instanz im Mandanten-Bestand erreichbar ist (nginx-Only-Stack).
Mittelstand
Distribution-Patch im laufenden Wartungsfenster. Wer unattended-upgrades auf Debian/Ubuntu konfiguriert hat, sollte den Lauf der nächsten 24 Stunden überprüfen — der 2.4.67-Bump kommt typischerweise mit der apt-security-Linie, braucht keinen Reboot, aber den Apache-Reload. Stopgap-HTTP/1.1-Fallback ist die zweite Verteidigungslinie.
Enterprise
Kuratierte Image-Promotion auf gepatchte Apache-2.4.67-Base-Images. WAF-Regel auf die HEADERS-/RST-Frame-Sequenz als zusätzliche Schicht, die auch nach dem Patch sinnvoll bleibt. Mandanten-Frontline-Hosts in den 24h-Frühpatch-Pool nehmen, nicht in den 14-Tage-Standardzyklus.
Kubernetes-Plattform
Container-Images mit Apache 2.4.66 neu bauen. Helm-Chart-Pin auf gepatchten Tag ziehen, Cluster-weiten Rollout im Standard-Wartungsfenster, mit Vorzug für Mandanten-Frontline-Hosts. Falco-Regel aus der Detection-Sektion Cluster-weit ausrollen.
Sub-Szenario Kubernetes-Ingress mit Apache-Sidecar: Sidecar-Image-Tag im Pod-Template-Spec aktualisieren, Rolling-Update über kubectl rollout restart.
Sub-Szenario Helm-basierte TYPO3-Charts:image.repository und image.tag im values.yaml prüfen, oft auf älteren Apache-Tags gepinnt.
NixOS-Module für apacheHttpd aktualisieren, sobald der nixpkgs-Bump für 2.4.67 gemerged ist (Stand 13.05.: bereits gemerged, in den meisten Channels verfügbar). Wolfi-basierte Apache-Container schließen den Patch über das apk-Index-Update der laufenden Woche — Image-Rebuild auf Wolfi-Base mit apk upgrade triggern.
Was ich konkret getan habe
Ich habe am 13.05.2026 zwischen 07:15 und 08:30 CEST drei Disziplinen durchgezogen.
Zuerst die Inventur: alle Mandanten-Hosts unter eigenem Betrieb mit apache2 -v bzw. httpd -v abgefragt, plus die Container-Tags aller TYPO3- und Sylius-Mandanten-Images mit docker image ls | grep httpd. Drei Hosts standen auf 2.4.66 (alle Debian-12-Base, alle mit mod_http2 aktiviert), zwei Container-Images auf httpd:2.4.66. Die übrigen Hosts laufen auf nginx oder bereits auf 2.4.67.
Dann der Patch: apt-get install --only-upgrade apache2 auf den drei betroffenen Hosts, Container-Images mit docker pull httpd:2.4 && docker compose up -d --force-recreate webserver neu gezogen. Auf einem Plesk-managed Host musste der Distribution-Patch über das Plesk-Web-UI gezogen werden, weil das apt-Repo dort durch ein Plesk-Mirror überlagert ist — Notiz im Mandanten-Onboarding-Leitfaden ergänzt.
Schließlich die Detection-Stage: Falco-Regel Apache worker unexpected exit with mod_http2 in zwei Cluster-Plattformen aktiviert. Access-Log-Pattern-Check auf den letzten 10 Tagen ergab in keinem Mandanten-Log auffallende Häufungen kurzer Connection-Lifetimes mit Stream-Reset.
Die strukturelle Lehre dieser Lücke liegt im Zusammenspiel zwischen nghttp2-Callback-Reihenfolge und der APR-Allokator-Wahl. Der Fehler in 2.4.66 liegt nicht in nghttp2, sondern in der Annahme von mod_http2, dass die beiden Callbacks bei einem unregistrierten Stream nicht beide den Cleanup-Pfad triggern. Sie tun es. Die APR-Allokator-Wahl ist der zweite Hebel: auf Debian-basierten Distributionen wird historisch mmap als Default kompiliert. Genau dieser mmap-Default ist der Hebel, der aus dem Double-Free einen Pre-Auth-RCE-Pfad macht. Das ist der direkte Anschluss an die Linie, die ich mit CVE-2026-31431 „Copy Fail“ als „die Distribution ist die Architektur“-Befund aufgemacht habe.
Häufige Fragen zum Apache-mod_http2-Double-Free (CVE-2026-23918)
Müssen TYPO3-Hostings unter Plesk oder cPanel wegen CVE-2026-23918 sofort gepatcht werden?+
Ja, sobald der Plesk- oder cPanel-Mirror den 2.4.67-Bump übernimmt. Plesk hat eine eigene Patch-Welle, die typischerweise 24–72 Stunden nach dem Distribution-Patch erscheint. Bis dahin lässt sich der Stopgap-HTTP/1.1-Fallback über die Plesk-Apache-Tweaks-Sektion (Hosting → Apache & nginx Settings → Additional directives for HTTPS) setzen: Protocols http/1.1. Apache-Reload erfolgt automatisch über die Plesk-Apply-Routine.
Wie prüfe ich, ob mein Sylius-Mandant-Host wirklich Apache 2.4.66 mit mod_http2 fährt?+
apache2 -v (Debian/Ubuntu) oder httpd -v (RHEL) für die Version. apache2ctl -M | grep http2 oder httpd -M | grep http2 für das Modul. curl --http2 -I shop.mandant.example.com für den Live-Check, ob HTTP/2 tatsächlich auf der Mandanten-Frontline aktiv ist.
Sind hinter Cloudflare gehostete TYPO3-Sites automatisch gegen CVE-2026-23918 geschützt?+
Teilweise. Cloudflare terminiert TLS und HTTP/2 selbst und spricht zu den Origin-Hosts typischerweise HTTP/1.1 oder HTTP/2 — die Konfiguration ist im Cloudflare-Dashboard unter Network → HTTP/2 to Origin einsehbar. Wenn HTTP/2 zum Origin deaktiviert ist, ist der Origin-Pfad nicht direkt erreichbar; wenn der Origin-Pfad selbst aber öffentlich auf 443 erreichbar ist (häufiges Setup), bleibt die Lücke offen. Ich empfehle, unabhängig vom Cloudflare-Status zu patchen.
Müssen Wolfi-basierte Apache-Container wegen CVE-2026-23918 neu gebaut werden?+
Ja. Wolfi-basierte apache2-Container schließen den Patch über das apk-Index-Update der laufenden Woche — Image-Rebuild auf Wolfi-Base mit apk upgrade triggern, Helm-Chart-Pin auf das neue Image-Tag, Rollout im Standard-Wartungsfenster.
Reicht der Stopgap-HTTP/1.1-Fallback als alleinige Mitigation für die nächsten Tage?+
Ja, mit Einschränkung. Wer Protocols http/1.1 setzt, deaktiviert den mod_http2-Codepfad vollständig — die Lücke wird nicht mehr erreichbar. Der Performance-Einbruch durch HTTP/2-Verzicht ist messbar (Latency-Erhöhung bei vielen kleinen Assets, weil Multiplexing wegfällt), aber im 24–72-Stunden-Fenster bis zum echten Patch operativ tragbar. Nicht als Dauermitigation laufen lassen.
Hängt der Apache-Befund mit dem VS-Code-Cluster vom 12.05. strukturell zusammen?+
Strukturell nein — die Lücken liegen auf verschiedenen Schichten (Webserver-Frontline vs. Entwickler-Workstation). Operativ ja, weil beide den Mandanten-Plattform-Betreiber in denselben 48-Stunden-Patch-Korridor zwingen. Wer heute beide Patches synchron einspielt, kann den nächsten Mandanten-Wartungsfenster-Termin entlasten.
Fazit
CVE-2026-23918 ist im Mai-Patch-Cycle nicht der spektakulärste Befund — keine aktive Ausnutzung in freier Wildbahn, kein CISA-KEV-Eintrag, kein BSI-Sondergutachten. Was den Befund operativ schwer macht, ist seine Trivialität auf der Trigger-Seite kombiniert mit der strukturellen RCE-Pfad-Bedingung auf Debian-Default. Eine TCP-Verbindung, zwei Frames, ein Mandanten-Host weniger. Und seit acht Tagen liegen die PoCs öffentlich.
Die Frage lautet nicht, ob 2.4.67 ausreicht — sie reicht für den konkreten Codepfad, den Apache am 5. Mai geschlossen hat. Sie lautet, ob Ihre Plattform die HTTP-Front-End-Schicht als eigene Patch- und Detection-Pflicht führt, oder ob Sie die Front-End-Frontline weiterhin als „kommt mit dem Distribution-Update mit“-Komponente behandeln. Die strukturelle Antwort ist die erste Variante, mit eigenem Inventar, eigener Frühpatch-Kohorte und eigener WAF-Regel-Disziplin.
Persönlicher Hintergrund und technische Details zur Härtung von Apache-Frontlines im DACH-Mittelstand: ole-hartwig.eu.
Programmiert seit 2002 – autodidaktisch gelernt, 2012 mit KO-Web selbständig gemacht. Über 100 Projekte, Fokus auf Security, Performance, Automatisierung und Qualität. Heute freiberuflich: DevSecOps-Beratung, Schulungen und Softwareentwicklung.