12 Min. Lesezeit
Hoch

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_rstm_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:

StackBetroffenNicht betroffen / Bedingungen
Apache HTTP Server 2.4.66Default-Build mit mod_http2 aktiviert und multi-threaded MPM2.4.67 und höher; mod_http2 deaktiviert; reines prefork-MPM ohne HTTP/2-Modul
Debian 12 / 13Apache 2.4.66 aus dem Distro-Repo, APR mit mmap-Allokator (Default) — RCE-Pfad offenApache 2.4.67-Backport eingespielt oder HTTP/2 deaktiviert
Ubuntu 24.04 / 26.04 LTSApache 2.4.66 aus dem Distro-Repo, APR mmap-Default — RCE-Pfad offen2.4.67-Update via unattended-upgrades eingespielt
RHEL / Rocky / AlmaLinux 9Apache 2.4.66 aus dem AppStream; APR typischerweise privater Heap-Allokator, nur DoS-Pfad2.4.67-Update via dnf upgrade eingespielt
Docker httpd:2.4, httpd:2.4.66Alle Image-Tags vor dem 2.4.67-BumpNeu gezogene httpd:2.4-Tags nach dem Bump
Wolfi-basierte Apache-ContainerAlle vor dem apk-Index-Update der laufenden WocheNeu gebautes Image nach apk upgrade
nginx, Caddy, HAProxy, TraefikNicht betroffen vom Apache-Cluster — eigene HTTP/2-Implementationen
TYPO3-/Sylius hinter Reverse-ProxyApache als Reverse-Proxy mit HTTP/2 nach außen ist direkt betroffenApache 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. Wir behandeln 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.

Pfad 1 — Distribution-Patch (empfohlen)

 

# Debian / Ubuntu
sudo apt-get update
sudo apt-get install --only-upgrade apache2

# RHEL / Rocky / AlmaLinux
sudo dnf upgrade httpd

# Version prüfen
apache2 -v   # bzw. httpd -v
# Erwartet: Apache/2.4.67 oder höher

 

Pfad 2 — Container-Image neu ziehen

 

# Standard-Docker-Image
docker pull httpd:2.4
docker pull httpd:2.4-alpine

# In Compose-Setups
docker compose pull
docker compose up -d --force-recreate webserver

# In Helm-Charts
helm upgrade <release> <chart> \
  --set image.tag=2.4.67 \
  --reuse-values

 

Pfad 3 — Stopgap, wenn das Wartungsfenster nicht in 24 Stunden öffnet

 

# /etc/apache2/conf-available/disable-http2.conf
# Apache zwingt HTTP/1.1 zurück, mod_http2 wird nicht angesprochen
Protocols http/1.1

 

# Linux: Konfiguration aktivieren und Apache reloaden
sudo a2enconf disable-http2
sudo systemctl reload apache2

# RHEL-Linie
echo "Protocols http/1.1" | sudo tee /etc/httpd/conf.d/disable-http2.conf
sudo systemctl reload httpd

 

Verifizieren, dass HTTP/2 tatsächlich aus ist:

 

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 wir parallel fahren.

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.

 

# Apache-Error-Log auf mod_http2-Crash-Hinweise prüfen
sudo grep -E "h2_(stream|mplx)|child pid .* exit signal|Segmentation fault" \
  /var/log/apache2/error.log* | tail -50

 

Pfad 2: Falco-Regel für Apache-Worker-Crashes mit ungewöhnlichem Process-Tree

 

# /etc/falco/rules.d/apache-h2-crash.yaml
- rule: Apache worker unexpected exit with mod_http2
  desc: Apache worker died abnormally while serving mod_http2 — possible CVE-2026-23918 exploitation
  condition: >
    proc_exit and
    proc.name in (apache2, httpd) and
    proc.exitcode != 0 and
    proc.aname[1] in (apache2, httpd)
  output: >
    Apache worker exited abnormally: pid=%proc.pid exitcode=%proc.exitcode cmdline=%proc.cmdline
  priority: WARNING
  tags: [apache, mod_http2, cve-2026-23918]

 

Pfad 3: Tetragon-TracingPolicy als eBPF-Alternative

 

apiVersion: cilium.io/v1alpha1
kind: TracingPolicy
metadata:
  name: apache-mod-http2-anomaly
spec:
  kprobes:
    - call: "sys_munmap"
      syscall: true
      args:
        - index: 0
          type: "uint64"
        - index: 1
          type: "size_t"
      selectors:
        - matchBinaries:
            - operator: "In"
              values:
                - "/usr/sbin/apache2"
                - "/usr/sbin/httpd"
          matchActions:
            - action: "Audit"

 

PoC-Validierung im eigenen Mandanten-Bestand

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

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.

Deklarative Stacks (NixOS / Talos / Flatcar / Wolfi)

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 wir konkret getan haben

Wir haben 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 wir mit CVE-2026-31431 „Copy Fail“ als „die Distribution ist die Architektur“-Befund aufgemacht haben.

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. Wir empfehlen 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.

Bevor das nächste mod_http2-CVE kommt — sprechen wir über Ihre Frontline-Patch-Disziplin.

Wir prüfen, patchen und validieren produktive Apache-2.4-Frontlines gegen CVE-2026-23918.

Inventur der TYPO3- und Sylius-Hosting-Bestände, Stopgap-HTTP/1.1-Fallback wo nötig, Distribution-Patch auf 2.4.67 im Wartungsfenster, WAF-Regel-Einbau gegen die HEADERS-/RST-Frame-Sequenz, PoC-basierte Detection-Validierung auf Staging-Umgebungen.

Wenn Sie TYPO3- oder Sylius-Hostings im DACH-Mittelstand betreiben, Apache 2.4 als Mandanten-Frontline im Eigenbetrieb fahren, oder eine kuratierte Container-Image-Linie mit Apache-Base verantworten — sprechen wir vor dem nächsten Mandanten-Wartungsfenster. Schauen Sie sich vorab unsere Standard-Linie für DevSecOps-Plattformbetrieb und TYPO3-Plattformbetrieb an.

Termin direkt vereinbaren

Über den Autor

Foto von Kai Ole Hartwig.

Kai Ole Hartwig

Founder · Moselwal Digitalagentur · OnlyOle

Programmiert seit 2002 – autodidaktisch gelernt, 2012 mit KO-Web selbständig gemacht, heute Moselwal. Über 100 Projekte, Fokus auf Security, Performance, Automatisierung und Qualität.