
Erkennungsregeln für CVE-2026-23918 Apache http2 RCE - Credit: stringa.ai, isec.pl
Veröffentlicht: 2026-05-04
CVSSv3: 8.8 (Hoch)
Typ: Remote Code Execution / Denial of Service (Double-Free Memory Corruption)
Komponente: Apache HTTP Server mod_http2 (h2_mplx.c stream cleanup path)
Betroffen: Apache HTTP Server 2.4.66 mit aktiviertem HTTP/2 und Multi-Threaded MPM
Referenzen:
CVE-2026-23918 ist eine Double-Free-Speicherverfälschungsschwachstelle in der HTTP/2-Protokollimplementierung von Apache HTTP Server 2.4.66, die nur den Stream-Bereinigungspfad des mod_http2-Moduls in h2_mplx.c betrifft. Sie ermöglicht es einem nicht authentifizierten entfernten Angreifer, Apache-Worker-Prozesse mit einer einzigen TCP-Verbindung und zwei HTTP/2-Frames zum Absturz zu bringen (Denial of Service). Unter Bedingungen, die auf Debian-basierten Systemen und offiziellen Apache-Docker-Images vorhanden sind, kann die Double-Free zu einer vollständigen Remote Code Execution ausgebaut werden.
Die Ausnutzung für DoS wurde in freier Wildbahn bestätigt. Es wurden groß angelegte Internet-Scans beobachtet, die auf HTTP/2-Endpunkte abzielen. Der RCE-Exploit hat sich in kontrollierten Umgebungen als durchführbar erwiesen, obwohl es derzeit keine Hinweise auf eine weit verbreitete öffentliche Ausnutzung für RCE gibt.
MPM prefork ist nicht betroffen – die Schwachstelle erfordert eine Multi-Threaded-MPM-Konfiguration (worker, event oder ähnlich). CVE-2026-23918 betrifft nur die Apache HTTP Server Version 2.4.66.
Attacker opens HTTP/2 connection to Apache 2.4.66 (mod_http2 loaded, multi-threaded MPM) └─ Sends HTTP/2 HEADERS frame on stream N (opens the stream) └─ Immediately sends RST_STREAM on stream N (non-zero error code) └─ Sent BEFORE the multiplexer has registered the stream
Two nghttp2 callbacks fire in sequence: ├─ on_frame_recv_cb (RST received) → calls h2_mplx_c1_client_rst → m_stream_cleanup └─ on_stream_close_cb (stream closed) → calls h2_mplx_c1_client_rst → m_stream_cleanup
Result: same h2_stream pointer pushed onto spurge[] cleanup array TWICE
c1_purge_streams() iterates spurge[] and calls h2_stream_destroy() on each entry: ├─ First call: valid — frees the stream └─ Second call: DOUBLE-FREE — operates on already-freed memory → heap corruption
DoS path (trivial, in the wild): └─ Heap corruption → SIGABRT in worker process → worker dies → service disruption
RCE path (requires mmap allocator — default on Debian/Ubuntu and official Docker): └─ Attacker places fake h2_stream struct at freed virtual address via mmap reuse └─ Points pool cleanup function pointer to system() └─ Uses Apache scoreboard shared memory (fixed address, ASLR-resistant) as payload container └─ c1_purge_streams() executes system() with attacker-controlled argument → RCE
> **Wichtige Asymmetrie:** Der DoS-Pfad erfordert keine Heap-Manipulationskenntnisse und wird aktiv ausgenutzt. Der RCE-Pfad ist technisch anspruchsvoll, wurde jedoch unter Laborbedingungen demonstriert und wird angesichts der ASLR-resistenten festen Adresse des Scoreboards in naher Zukunft mit ziemlicher Sicherheit bewaffnet werden.
---
## Erkennungsarchitektur
> In diesem Abschnitt wird erläutert, warum sich die hier bereitgestellten Erkennungswerkzeuge erheblich von einem typischen Paket zur lokalen Privilegienerweiterung unterscheiden.
Copy Fail (CVE-2026-31431) war eine **hostseitige, nach dem Zugriff auftretende** Schwachstelle. Der Angreifer benötigte eine bestehende Präsenz auf dem System. Die Erkennung fand hauptsächlich auf der Syscall-Ebene statt (auditd, Wazuh) mit YARA-Scans nach dem PoC-Skript auf der Festplatte.
CVE-2026-23918 ist eine **netzwerkseitige, vor dem Zugriff auftretende** Schwachstelle. Der Exploit trifft als HTTP/2-Protokollframes über die Leitung ein, bevor Anwendungscode ausgeführt wird. Dies verschiebt den Erkennungsstapel erheblich:
| Layer | Copy Fail (LPE) | CVE-2026-23918 (RCE) |
|---|---|---|
| **Primäre Erkennung** | Auditd-Syscall-Regeln | Suricata-Netzwerkregeln |
| **WAF (ModSecurity)** | Eingeschränkt – kann Exploit nicht sehen | Relevant – Anomalie + Post-Exploit |
| **Auditd** | Kernerkennung | Ergebniserkennung (Abstürze, Post-Exploit) |
| **YARA** | Scannt nach PoC-Skript | Scannt nach Web-Shells (Post-Exploit-Artefakte) |
| **Netzwerk-IDS** | Nicht anwendbar | Erstklassige Erkennungsschicht |
| **TLS-Inspektion** | N/V | Für vollständige Suricata-Abdeckung erforderlich |
Die Faustregel: Bei RCE auf Netzwerkebene von außen nach innen arbeiten (Netzwerk → WAF → Host). Bei lokaler Privilegienerweiterung vom Host aus nach außen arbeiten.
---
## Erkennungsgrenzen
> **Lesen Sie dies, bevor Sie Regeln bereitstellen.**
**1. TLS beendet HTTP/2-Sichtbarkeit.**
Die meisten Produktions-Apache-Bereitstellungen verwenden HTTPS. Suricata kann den Inhalt verschlüsselter HTTP/2-Frames nicht überprüfen, ohne dass TLS-Entschlüsselung konfiguriert ist. Wenn Ihre Suricata-Bereitstellung keinen Zugriff auf TLS-Sitzungsschlüssel oder einen Entschlüsselungsspiegel hat, erfassen die folgenden Netzwerkregeln nur:
- Klartext-HTTP/2 (h2c) – in der Produktion ungewöhnlich, aber in internen Umgebungen vorhanden
- Die Netzwerksignatur des TCP-Verbindungsverhaltens (Verbindungsanzahl, RST-Muster auf der TCP-Ebene)
Für HTTPS-Bereitstellungen aktivieren Sie die TLS-Entschlüsselung von Suricata über die `tls-decrypt`-Einstellung und die Protokollierung von Sitzungsschlüsseln oder verlassen Sie sich stattdessen auf die WAF (ModSecurity/Coraza) und die hostbasierten Ebenen (auditd/Wazuh).
**2. ModSecurity kann den Exploit-Trigger nicht blockieren.**
Der Double-Free tritt im HTTP/2-Frame-Parser auf, bevor eine vollständige HTTP-Anfrage zusammengestellt und an ModSecurity übergeben wird. Die WAF sieht die Anfrage erst, nachdem die Frame-Parsing abgeschlossen ist – zu diesem Zeitpunkt kann der Schaden bereits eingetreten sein. ModSecurity wird in diesem Paket für Anomalieerkennung, Ratenbegrenzung und Post-Exploitation-Erkennung verwendet, nicht als Blocker für den Trigger.
**3. MPM prefork ist nicht betroffen.**
Wenn Ihre Apache-Bereitstellung `mpm_prefork_module` (single-threaded) verwendet, ist diese Schwachstelle nicht anwendbar. Der Fehler tritt nur in multithreaded MPMs auf (`mpm_event_module` oder `mpm_worker_module`). Überprüfen Sie mit `apachectl -V | grep MPM`, bevor Sie Regeln bereitstellen, die auf Prefork-Servern Fehlalarme erzeugen würden.
**4. RCE erfordert den mmap-Allokator.**
Der RCE-Pfad (nicht der DoS-Pfad) benötigt den mmap-Allokator von APR, der auf Debian-basierten Distributionen und offiziellen Apache-Docker-Images der Standard ist. RHEL/CentOS-basierte Bereitstellungen mit jemalloc oder system malloc haben ein reduziertes RCE-Risiko, sind aber weiterhin vollständig anfällig für DoS.
**5. Noch keine stabilen Post-Exploitation-IoCs.**
Zum Zeitpunkt der Erstellung dieses Textes gibt es noch keine von Anbietern veröffentlichten IoCs für Post-Exploitation-Aktivitäten. Die YARA-Regeln und auditd-Regeln, die auf Post-Exploitation-Verhalten abzielen, basieren auf allgemeinen Web-Shell- und Privilegienerweiterungsmustern – sie werden häufige Ergebnisse erfassen, aber keine ausgeklügelte, maßgeschneiderte Nutzlast.
---
## Sofortige Abhilfe
In der Reihenfolge der Präferenz anwenden. Jede ist störender als die vorherige, aber jede ist vollständiger.```bash
# Option 1 (Preferred): Upgrade to 2.4.67
# See Patching & Remediation section below
# Option 2: Disable HTTP/2 in Apache config (no reboot required, restart required)
# In httpd.conf or relevant VirtualHost / site config:
# Remove or comment out: Protocols h2 h2c http/1.1
# Replace with: Protocols http/1.1
# Then:
apachectl configtest && sudo systemctl restart apache2
# Option 3: Switch to MPM prefork (eliminates vulnerability entirely — more disruptive)
sudo a2dismod mpm_event mpm_worker
sudo a2enmod mpm_prefork
apachectl configtest && sudo systemctl restart apache2
# Option 4: Reverse proxy HTTP/2 termination
# If nginx, HAProxy, or a CDN is in front of Apache and terminates HTTP/2,
# Apache only receives HTTP/1.1 — confirm your proxy config explicitly:
# nginx: proxy_http_version 1.1; (already the default for upstream connections)
# HAProxy: use-server-close + http/1.1 on backend bind
# Verify with: curl -v --http2 https://your-origin-directly
Überprüfung der Maßnahme: Überprüfen Sie nach dem Deaktivieren von HTTP/2 mit:
curl -s -o /dev/null -w "%{http_version}" --http2 http://localhost/ # Should return "1.1", not "2" apachectl -M | grep http2 # Should produce no output
Speichern Sie als cve-2026-23918.rules und referenzieren Sie es aus suricata.yaml.
Voraussetzungen:
- Suricata 6.0+ für Unterstützung der Schlüsselwörter
http2.frametype/http2.errorcode(Suricata 7.x empfohlen)app-layer.protocols.http2.enabled: yesinsuricata.yaml- TLS-Entschlüsselung für HTTPS-Abdeckung konfiguriert (siehe Erkennungsgrenzen oben)
- Variable
$HTTP_SERVERSgesetzt, um Ihre Apache-Hosts einzubeziehen- Die folgenden SIDs sind Beispiele — passen Sie sie an Ihre lokale SID-Richtlinie an```
alert http2 $EXTERNAL_NET any -> $HTTP_SERVERS any
(msg:"CVE-2026-23918 Apache mod_http2 Double-Free - RST_STREAM with non-zero error code";
flow:established,to_server;
http2.frametype:3;
http2.errorcode:!0;
classtype:web-application-attack;
reference:cve,2026-23918;
sid:9926231801; rev:1;)
alert http2 $EXTERNAL_NET any -> $HTTP_SERVERS any
(msg:"CVE-2026-23918 Apache mod_http2 Double-Free - RST_STREAM flood (active DoS/exploit scan)";
flow:established,to_server;
http2.frametype:3;
http2.errorcode:!0;
threshold: type both, track by_src, count 10, seconds 30;
classtype:denial-of-service;
reference:cve,2026-23918;
sid:9926231802; rev:1;)
alert tcp $EXTERNAL_NET any -> $HTTP_SERVERS [80,8080,8000,8443]
(msg:"CVE-2026-23918 Apache mod_http2 - HTTP/2 RST_STREAM frame detected (cleartext)";
flow:established,to_server;
content:"|00 00 04 03 00|"; depth:5; offset:0;
threshold: type both, track by_src, count 5, seconds 30;
classtype:web-application-attack;
reference:cve,2026-23918;
sid:9926231803; rev:1;)
alert tcp $EXTERNAL_NET any -> $HTTP_SERVERS [80,8080,8000]
(msg:"CVE-2026-23918 Apache mod_http2 - HTTP/2 client preface with rapid RST_STREAM (exploit pattern)";
flow:established,to_server;
content:"PRI * HTTP/2.0|0d 0a 0d 0a|SM|0d 0a 0d 0a|"; depth:24; offset:0;
content:"|00 00 04 03|"; distance:0; within:512;
classtype:web-application-attack;
reference:cve,2026-23918;
sid:9926231804; rev:1;)
alert http $HTTP_SERVERS any -> $EXTERNAL_NET any
(msg:"CVE-2026-23918 Apache 2.4.66 version string in response - vulnerable version exposed";
flow:established,to_client;
http.header; content:"Apache/2.4.66";
classtype:policy-violation;
reference:cve,2026-23918;
sid:9926231805; rev:1;)
alert tcp $HTTP_SERVERS [80,443,8080,8443] -> $EXTERNAL_NET ![$HTTP_PORTS,443,80]
(msg:"CVE-2026-23918 Apache possible post-RCE reverse shell - outbound from web server port";
flow:established,to_server;
classtype:trojan-activity;
reference:cve,2026-23918;
sid:9926231806; rev:1;)
### Tuning-Hinweise
Nachdem Sie 24–48 Stunden im Modus `alert` deployed haben, überprüfen Sie Treffer bei den Regeln 3 und 4 — legitime HTTP/2-Clients können diese in Umgebungen mit hohem Datenverkehr auslösen. Wenn Regel 1 (Anwendungsschicht) ausreichend Signale erfasst, können die Regeln 3 und 4 auf eine niedrigere Schweregradstufe gesenkt oder ganz entfernt werden.
Bei Suricata-Installationen mit `stream-depth`-Limitierungen stellen Sie sicher, dass das HTTP/2-Präambelmuster in Regel 4 innerhalb des Inspektionsfensters liegt.
---
## ModSecurity / Coraza-Konfiguration
> **Voraussetzungen:**
> - ModSecurity 2.x (`libapache2-mod-security2`) oder [Coraza](https://coraza.io/) (Drop-in-Nachfolger, aktiv gepflegt)
> - OWASP Core Rule Set (CRS) 4.x empfohlen: [coreruleset.org/installation](https://coreruleset.org/installation/)
> - `SecRuleEngine On` (oder `DetectionOnly` für reinen Logging-Modus während des anfänglichen Tunings)
### Warum ModSecurity hier relevant (aber nicht ausreichend) ist
Wie im Abschnitt zu den Erkennungseinschränkungen erwähnt, kann ModSecurity den Double-Free-Trigger nicht abfangen, da der Exploit auf der HTTP/2-Frame-Ebene operiert. Dennoch bietet ModSecurity für diese CVE drei sinnvolle Ebenen des Mehrwerts:
1. **Ratenbegrenzung** — verlangsamt automatisierte DoS-Scans und erhöht die Kosten für das Durchprobieren des RCE-Heap-Sprays
2. **Post-Exploitation-Erkennung** — falls eine RCE erreicht wird, wird der Angreifer versuchen, eine Webshell zu deployen oder Befehle auszuführen; ModSecurity kann beides abfangen
3. **OWASP-CRS-Anomaliebewertung** — fehlerhafte Header und Verbindungsmuster, die mit der Ausnutzung verbunden sind, können unter CRS Paranoia Level 2+ anomal auffallen
### Apache-Konfigurationshärtung (zusätzlich zu ModSecurity anwenden)
Fügen Sie Folgendes in die `httpd.conf` oder eine Include-Datei ein. Dies sind Apache-Direktiven, keine ModSecurity-Regeln, aber sie reduzieren die HTTP/2-Angriffsfläche:```apache
# ============================================================
# CVE-2026-23918 Apache HTTP/2 Hardening Directives
# ============================================================
# Limit concurrent streams per HTTP/2 session.
# The exploit typically uses 1 stream, but limiting sessions
# reduces the rate at which a single client can attempt the trigger.
H2MaxSessionRequests 100
# Restrict H2 stream push (unused surface, reduce complexity)
H2Push Off
# Suppress version information in Server headers.
# Prevents trivial identification of vulnerable 2.4.66 instances.
ServerTokens Prod
ServerSignature Off
# Constrain HTTP/2 window size — reduces memory available for heap spray
H2WindowSize 65535
# If HTTP/2 is not required at all:
# Protocols http/1.1
Speichern Sie diese in Ihrer ModSecurity-Custom-Regeldatei (z.B. /etc/modsecurity/cve-2026-23918.conf):```apache
SecAction
"id:9923918001,
phase:1,
nolog,
pass,
initcol:ip=%{REMOTE_ADDR},
setvar:ip.http2_requests=+1,
expirevar:ip.http2_requests=60"
SecRule ip:http2_requests "@gt 30"
"id:9923918002,
phase:1,
deny,
status:429,
log,
msg:'CVE-2026-23918: Rate limit exceeded - possible DoS/exploit scan',
tag:'CVE-2026-23918',
tag:'OWASP_CRS/DoS',
severity:'CRITICAL'"
SecAction
"id:9923918003,
phase:1,
nolog,
pass,
initcol:ip=%{REMOTE_ADDR}"
SecRule RESPONSE_STATUS "@rx ^(4|5)[0-9]{2}"
"id:9923918004,
phase:5,
nolog,
pass,
setvar:ip.error_count=+1,
expirevar:ip.error_count=120"
SecRule ip:error_count "@gt 20"
"id:9923918005,
phase:1,
log,
pass,
msg:'CVE-2026-23918: Elevated error rate from source IP - possible exploit scanning',
tag:'CVE-2026-23918',
severity:'WARNING'"
SecRule REQUEST_BODY
"@rx (?:system|exec|passthru|shell_exec|popen|proc_open)\s*(\s*(?:$_(?:GET|POST|REQUEST|COOKIE)|base64_decode)"
"id:9923918010,
phase:2,
deny,
status:403,
log,
msg:'CVE-2026-23918: Possible web shell command execution in POST body',
tag:'CVE-2026-23918',
tag:'WEBSHELL',
severity:'CRITICAL'"
SecRule ARGS
"@rx (?:(?:^|[;&|`])\s*(?:id|whoami|uname|cat\s+/etc|ls\s+/|pwd|wget\s+http|curl\s+http|bash\s+-[ci]|nc\s+-[el]|python[23]?\s+-c|perl\s+-e|ruby\s+-e))"
"id:9923918011,
phase:2,
deny,
status:403,
log,
msg:'CVE-2026-23918: OS command injection pattern in request arguments - possible post-exploit web shell',
tag:'CVE-2026-23918',
tag:'WEBSHELL',
severity:'CRITICAL'"
SecRule FILES_TMPNAMES "@inspectFile /etc/modsecurity/util/php-filter.pm"
"id:9923918012,
phase:2,
log,
deny,
status:403,
msg:'CVE-2026-23918: PHP code detected in file upload - possible web shell deployment',
tag:'CVE-2026-23918',
tag:'WEBSHELL',
severity:'CRITICAL'"
SecRule REQUEST_BODY|ARGS
"@rx (?:bash\s+-i\s+>&?\s*/dev/tcp|/dev/tcp/[0-9]{1,3}.[0-9]{1,3}|nc\s+(?:-e|-c)\s+/bin/(?:bash|sh)|python[23]?\s+-c\s+['"]import\s+socket)"
"id:9923918013,
phase:2,
deny,
status:403,
log,
msg:'CVE-2026-23918: Reverse shell pattern in request - possible post-exploit activity',
tag:'CVE-2026-23918',
tag:'REVERSE_SHELL',
severity:'CRITICAL'"
### OWASP CRS Tuning-Empfehlung
Für das höchste Anomaliesignal ohne übermäßige Fehlalarme setzen Sie CRS auf Paranoia-Level 2 mit aktiviertem Anomalie-Scoring ein. Das auslösende Verbindungsverhalten (fehlerhaftes HTTP/2, das zu HTTP/1.x-Fallback-Fehlern führt, wiederholte Resets) sammelt Anomalie-Score unter den CRS-Regeln 920xxx und 921xxx und kann den Standardwert `inbound_anomaly_score_threshold` von 5 überschreiten, wodurch Warnungen ohne benutzerdefinierte Regeln generiert werden.
---
## Auditd-Regeln
Speichern Sie als `/etc/audit/rules.d/cve-2026-23918.rules`
Neu laden mit: `sudo augenrules --load`
> **Entwurfsprinzip:** Da der Exploit-Trigger auf der Netzwerk-/Kernel-HTTP/2-Parsing-Schicht lebt, kann auditd den Trigger selbst nicht abfangen. Diese Regeln erkennen:
> 1. Das **Ergebnis** der DoS-Ausnutzung (Apache-Worker-Absturzsignale)
> 2. **Post-Exploitation-Aktivitäten**, falls RCE erreicht wird (Shell-Ausführung, Dateischreibvorgänge, ausgehende Verbindungen durch den Apache-Benutzer)```bash
## ============================================================
## CVE-2026-23918 Apache HTTP/2 Double-Free — Auditd Rules
## ============================================================
## These rules detect the CONSEQUENCES of exploitation, not the
## trigger. The trigger is a network protocol event and is
## detected by Suricata. These rules catch:
## 1. Apache worker process crashes (DoS outcome)
## 2. Shell execution by the web server user (RCE outcome)
## 3. Web root file creation (web shell deployment)
## 4. Outbound network connections by web server process (reverse shell)
##
## Distribution notes for UID values:
## - Debian/Ubuntu: www-data = uid 33
## - RHEL/Rocky/CentOS: apache = uid 48
## Adjust -F uid= values for your distribution. Use `id www-data`
## or `id apache` to confirm the UID on your systems.
## ============================================================
## --- Apache worker SIGABRT detection (DoS exploitation outcome) ---
## A double-free that reaches the crash path generates SIGABRT (signal 6).
## Monitoring kill() syscalls with a1=6 (SIGABRT) targets abnormal process
## termination, which Apache itself triggers on double-free detection.
## Correlate with Apache error log entries (child exited with signal 6).
-a always,exit -F arch=b64 -S kill -F a1=6 -k cve_2026_23918_sigabrt
-a always,exit -F arch=b32 -S kill -F a1=6 -k cve_2026_23918_sigabrt
## --- SIGSEGV monitoring (alternative crash path) ---
## Depending on heap state, the double-free may produce a SIGSEGV (signal 11)
## rather than SIGABRT. Both are abnormal for production Apache workers.
-a always,exit -F arch=b64 -S kill -F a1=11 -k cve_2026_23918_sigsegv
-a always,exit -F arch=b32 -S kill -F a1=11 -k cve_2026_23918_sigsegv
## --- Shell execution by web server user (RCE outcome - Debian/Ubuntu) ---
## If RCE is achieved via the mmap allocator path, the attacker's payload
## runs as the Apache worker user (www-data on Debian/Ubuntu, uid=33).
## Legitimate Apache does not exec() a shell. Any execve() of bash/sh/dash
## by www-data is anomalous and warrants immediate investigation.
-a always,exit -F arch=b64 -S execve -F uid=33 -F exe=/bin/bash -k cve_2026_23918_rce_shell_deb
-a always,exit -F arch=b64 -S execve -F uid=33 -F exe=/bin/sh -k cve_2026_23918_rce_shell_deb
-a always,exit -F arch=b64 -S execve -F uid=33 -F exe=/bin/dash -k cve_2026_23918_rce_shell_deb
-a always,exit -F arch=b64 -S execve -F uid=33 -F exe=/usr/bin/python3 -k cve_2026_23918_rce_shell_deb
-a always,exit -F arch=b64 -S execve -F uid=33 -F exe=/usr/bin/perl -k cve_2026_23918_rce_shell_deb
## --- Shell execution by web server user (RCE outcome - RHEL/Rocky, uid=48) ---
-a always,exit -F arch=b64 -S execve -F uid=48 -F exe=/bin/bash -k cve_2026_23918_rce_shell_rhel
-a always,exit -F arch=b64 -S execve -F uid=48 -F exe=/bin/sh -k cve_2026_23918_rce_shell_rhel
## --- Web root file creation (web shell deployment) ---
## Post-RCE, the most common next step is writing a persistent web shell.
## Monitor web root directories for new file creation and write operations.
## Adjust paths for your DocumentRoot configuration.
-w /var/www/html -p wa -k cve_2026_23918_webroot_write
-w /var/www -p wa -k cve_2026_23918_webroot_write
-w /srv/www -p wa -k cve_2026_23918_webroot_write
-w /usr/share/apache2/default-site -p wa -k cve_2026_23918_webroot_write
## --- Outbound network connections by web server user (reverse shell) ---
## Apache workers do not normally initiate outbound TCP connections.
## connect() syscalls by www-data/apache indicate post-exploitation activity.
-a always,exit -F arch=b64 -S connect -F uid=33 -k cve_2026_23918_apache_outbound_deb
-a always,exit -F arch=b64 -S connect -F uid=48 -k cve_2026_23918_apache_outbound_rhel
## --- Apache config and module modification (persistence) ---
## An attacker with RCE may attempt to persist by modifying Apache config
## or dropping a malicious module. Watch for writes to config directories.
-w /etc/apache2 -p wa -k cve_2026_23918_apache_config
-w /etc/httpd -p wa -k cve_2026_23918_apache_config
-w /etc/apache2/mods-enabled -p wa -k cve_2026_23918_apache_mods
Nach der Bereitstellung verwende diesen ausearch-Einzeiler, um nach Crash-dann-Shell-Sequenzen zu suchen:```bash
sudo ausearch -k cve_2026_23918_sigabrt
-k cve_2026_23918_rce_shell_deb
-k cve_2026_23918_rce_shell_rhel
-k cve_2026_23918_webroot_write
--start yesterday -i
sudo ausearch -k cve_2026_23918_rce_shell_deb --start today -i | grep -A5 "exe="
---
## Wazuh-Regeln
Speichern Sie als benutzerdefinierte Regeln-Datei (z.B. `/var/ossec/etc/rules/local_rules.xml`).
> **Voraussetzungen:**
> - Auditd-Regeln wie oben bereitgestellt und Wazuh auditd-Decoder aktiv
> - Apache-Fehlerprotokoll (`/var/log/apache2/error.log` oder `/var/log/httpd/error_log`) zu den überwachten Wazuh-Dateien hinzugefügt
> - Apache-Zugriffsprotokoll auf HTTP/2-Verbindungsfehlermuster überwacht```xml
<!-- ==============================================================
CVE-2026-23918 Apache HTTP/2 Double-Free — Wazuh Rules
Requires:
- auditd rules from cve-2026-23918.rules deployed
- Apache error log monitored by Wazuh agent
============================================================== -->
<!-- Level 10: Apache worker crash signal (SIGABRT) detected via auditd -->
<rule id="113001" level="10">
<if_group>auditd</if_group>
<field name="audit.key">cve_2026_23918_sigabrt</field>
<description>CVE-2026-23918: SIGABRT sent to process — possible Apache worker double-free crash (DoS exploitation)</description>
<group>cve,denial_of_service,apache,http2,</group>
</rule>
<!-- Level 10: SIGSEGV variant crash path -->
<rule id="113002" level="10">
<if_group>auditd</if_group>
<field name="audit.key">cve_2026_23918_sigsegv</field>
<description>CVE-2026-23918: SIGSEGV sent to process — possible Apache worker memory corruption crash</description>
<group>cve,denial_of_service,apache,http2,</group>
</rule>
<!-- Level 14 CRITICAL: Multiple worker crashes in short window — active DoS -->
<rule id="113003" level="14" frequency="3" timeframe="60">
<if_matched_sid>113001</if_matched_sid>
<description>CVE-2026-23918 CRITICAL: Multiple Apache worker SIGABRT crashes within 60 seconds — active DoS exploitation in progress</description>
<group>cve,denial_of_service,apache,http2,high_confidence,</group>
</rule>
<!-- Level 15 CRITICAL: Shell execution by web server user — RCE achieved -->
<rule id="113004" level="15">
<if_group>auditd</if_group>
<field name="audit.key">cve_2026_23918_rce_shell_deb|cve_2026_23918_rce_shell_rhel</field>
<description>CVE-2026-23918 CRITICAL: Shell executed by web server user (www-data/apache) — RCE likely achieved, immediate incident response required</description>
<group>cve,rce,privilege_escalation,apache,http2,high_confidence,</group>
</rule>
<!-- Level 14 CRITICAL: Web shell written to web root -->
<rule id="113005" level="14">
<if_group>auditd</if_group>
<field name="audit.key">cve_2026_23918_webroot_write</field>
<description>CVE-2026-23918: File written to web root directory — possible web shell deployment post-RCE</description>
<group>cve,rce,webshell,apache,</group>
</rule>
<!-- Level 13 CRITICAL: Outbound connection by Apache worker process -->
<rule id="113006" level="13">
<if_group>auditd</if_group>
<field name="audit.key">cve_2026_23918_apache_outbound_deb|cve_2026_23918_apache_outbound_rhel</field>
<description>CVE-2026-23918: Outbound TCP connection by web server user — possible reverse shell post-RCE</description>
<group>cve,rce,reverse_shell,apache,</group>
</rule>
<!-- Level 14: RCE shell followed by outbound connection (reverse shell confirmed) -->
<rule id="113007" level="14">
<if_matched_sid>113004</if_matched_sid>
<if_group>auditd</if_group>
<field name="audit.key">cve_2026_23918_apache_outbound_deb|cve_2026_23918_apache_outbound_rhel</field>
<description>CVE-2026-23918 CRITICAL: Shell execution AND outbound connection by web server user — reverse shell active</description>
<group>cve,rce,reverse_shell,apache,high_confidence,</group>
</rule>
<!-- Level 12: Apache config modified (persistence attempt) -->
<rule id="113008" level="12">
<if_group>auditd</if_group>
<field name="audit.key">cve_2026_23918_apache_config|cve_2026_23918_apache_mods</field>
<description>CVE-2026-23918: Apache config or module directory modified — possible attacker persistence attempt</description>
<group>cve,rce,persistence,apache,</group>
</rule>
<!-- Level 10: Apache error log — child process crash (log-based correlation) -->
<!-- Requires Apache error log monitored by Wazuh, decoded via apache decoder -->
<rule id="113009" level="10">
<decoded_as>apache-errorlog</decoded_as>
<match>child pid \d+ exit signal Aborted|child process \d+ still did not exit|segmentation fault</match>
<description>CVE-2026-23918: Apache child process crash in error log — possible double-free DoS exploitation</description>
<group>cve,denial_of_service,apache,http2,</group>
</rule>
<!-- Level 13: Multiple Apache child crashes in error log + auditd SIGABRT (high confidence) -->
<rule id="113010" level="13">
<if_matched_sid>113009</if_matched_sid>
<if_matched_sid>113001</if_matched_sid>
<description>CVE-2026-23918: Apache error log crash + auditd SIGABRT — high-confidence active DoS, investigate immediately</description>
<group>cve,denial_of_service,apache,http2,high_confidence,</group>
</rule>
Speichern als cve_2026_23918.yar
Wichtiger Hinweis zum Umfang: Im Gegensatz zu Copy Fail (CVE-2026-31431) kann YARA den Exploit-Trigger für diese Schwachstelle nicht erkennen. Der Trigger besteht aus zwei rohen HTTP/2-Frames, die über eine Netzwerkverbindung gesendet werden — es gibt kein Skript oder keine Datei, die gescannt werden können. Die folgenden YARA-Regeln zielen auf:
- Post-Exploitation-Webshells, die nach einer erfolgreichen RCE eingesetzt werden können
- Reverse-Shell-One-Liner und codierte Payloads in webzugänglichen Dateien
- Das Exploit-Tool selbst, falls es auf einem Pivot-Host oder einem Angreifer-Staging-Server vorhanden ist
Empfohlener Scan-Bereich: Web-Root-Verzeichnisse (
/var/www/,/srv/www/), Apache-Temporärverzeichnisse (/tmp/,/var/tmp/), und kürzlich erstellte Dateien, diewww-dataoderapachegehören.```yara rule CVE_2026_23918_PostExploit_PHP_WebShell { meta: description = "Post-exploitation PHP web shell — possible CVE-2026-23918 outcome" author = "Detection Engineering" reference = "https://insomnisec.com/posts/2026-05-05-cve-2026-23918-apache-http2-rce_v2/" cve = "CVE-2026-23918" date = "2026-05-08" severity = "Critical" note = "Not specific to CVE-2026-23918 trigger — detects likely post-exploitation artifacts"
strings:
$php_open = "<?php" ascii nocase
$php_short = "<?" ascii nocase
// OS command execution functions
$sys = "system(" ascii nocase
$exec = "exec(" ascii nocase
$passthru = "passthru(" ascii nocase
$shell_exec = "shell_exec(" ascii nocase
$popen = "popen(" ascii nocase
$proc_open = "proc_open(" ascii nocase
// Parameter sourcing — required for command injection
$get_param = "$_GET[" ascii
$post_param = "$_POST[" ascii
$req_param = "$_REQUEST[" ascii
$cookie_param = "$_COOKIE[" ascii
$server_param = "$_SERVER[" ascii
// Obfuscation patterns common in web shells
$b64decode = "base64_decode(" ascii nocase
$str_rot13 = "str_rot13(" ascii nocase
$gzinflate = "gzinflate(" ascii nocase
$eval_call = "eval(" ascii nocase
// Common web shell capability strings
$phpinfo = "phpinfo()" ascii nocase
$file_put = "file_put_contents(" ascii nocase
condition:
filesize < 512KB and
(
// Classic command web shell: PHP + execution function + parameter input
($php_open or $php_short) and
any of ($sys, $exec, $passthru, $shell_exec, $popen, $proc_open) and
any of ($get_param, $post_param, $req_param, $cookie_param)
)
or
(
// Obfuscated web shell: eval + decode chain
($php_open or $php_short) and
$eval_call and
any of ($b64decode, $str_rot13, $gzinflate)
)
}
rule CVE_2026_23918_PostExploit_ReverseShell_InFile { meta: description = "Reverse shell one-liner in web-accessible file — possible post-RCE persistence" author = "Detection Engineering" cve = "CVE-2026-23918" date = "2026-05-08" severity = "Critical" note = "Scan web directories and /tmp; may also appear in crontabs and rc.local"
strings:
// Bash TCP reverse shell
$bash_tcp = "/dev/tcp/" ascii
$bash_rev = "bash -i >&" ascii nocase
// Netcat reverse shell
$nc_e = "nc -e /bin/" ascii nocase
$nc_c = "nc -c /bin/" ascii nocase
$ncat_e = "ncat -e /bin/" ascii nocase
// Python reverse shell
$py_socket = "import socket,subprocess" ascii
$py_pty = "import pty;pty.spawn" ascii
// Perl reverse shell
$perl_rev = "perl -e 'use Socket" ascii
// Common reverse shell via curl/wget pipe to bash
$curl_bash = "curl http" ascii
$wget_bash = "wget -O- http" ascii
$bash_pipe = "|bash" ascii
condition:
filesize < 1MB and
(
($bash_tcp and $bash_rev)
or ($nc_e or $nc_c or $ncat_e)
or ($py_socket and $py_pty)
or $perl_rev
or ($curl_bash and $bash_pipe)
or ($wget_bash and $bash_pipe)
)
}
rule CVE_2026_23918_ExploitTool_Artifacts { meta: description = "CVE-2026-23918 exploit tool artifacts — for scanning attacker staging hosts or memory dumps" author = "Detection Engineering" reference = "https://hadrian.io/blog/cve-2026-23918-apache-http-server-double-free-rce-in-http-2-implementation" cve = "CVE-2026-23918" date = "2026-05-08" severity = "High" note = "Matches known PoC tool strings — not expected in production Apache environments"
strings:
// h2_mplx.c specific identifier from public PoC analysis
$mplx_ref = "h2_mplx_c1_client_rst" ascii
$spurge_ref = "c1_purge_streams" ascii
$stream_ref = "h2_stream_destroy" ascii
// CVE reference strings that appear in PoC tools
$cve_str = "CVE-2026-23918" ascii
$version_target = "Apache/2.4.66" ascii
// HTTP/2 HEADERS + RST_STREAM frame bytes (common in PoC HTTP/2 libraries)
// HTTP/2 HEADERS frame header: type=0x01
$h2_headers_frame = { 00 00 ?? 01 }
// HTTP/2 RST_STREAM frame header: type=0x03 with payload=4
$h2_rst_frame = { 00 00 04 03 00 }
// Python h2 library usage (hyper-h2) typical in PoC tools
$hyper_h2 = "import h2" ascii
$h2_connection = "H2Connection" ascii
condition:
(
($mplx_ref or $spurge_ref or $stream_ref)
or
($cve_str and $version_target)
or
($hyper_h2 and $h2_connection and $h2_rst_frame)
)
}
---
## MISP Event Vorlage
Speichern als `misp_cve_2026_23918.json` und importieren via MISP → Events → Import.
> Ersetzen Sie Platzhalter-UUIDs vor dem Import durch frisch generierte UUID4s.```json
{
"Event": {
"uuid": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"info": "CVE-2026-23918 Apache mod_http2 Double-Free — Remote DoS and possible RCE",
"threat_level_id": "2",
"analysis": "2",
"date": "2026-05-04",
"Attribute": [
{
"type": "vulnerability",
"category": "External analysis",
"to_ids": false,
"uuid": "b2c3d4e5-f6a7-8901-bcde-f12345678901",
"comment": "CVE identifier",
"value": "CVE-2026-23918"
},
{
"type": "text",
"category": "Other",
"to_ids": false,
"uuid": "c3d4e5f6-a7b8-9012-cdef-012345678902",
"comment": "Vulnerability description",
"value": "Double-free in Apache HTTP Server 2.4.66 mod_http2 h2_mplx.c stream cleanup path. Triggered by HTTP/2 HEADERS frame immediately followed by RST_STREAM with non-zero error code before stream registration. Results in DoS (confirmed in-wild) or RCE (lab-demonstrated) in multi-threaded MPM configurations."
},
{
"type": "text",
"category": "Other",
"to_ids": false,
"uuid": "d4e5f6a7-b8c9-0123-defa-123456789003",
"comment": "Affected component",
"value": "Apache HTTP Server 2.4.66, mod_http2 module, h2_mplx.c — multi-threaded MPM only (event, worker). MPM prefork is NOT affected."
},
{
"type": "text",
"category": "Other",
"to_ids": false,
"uuid": "e5f6a7b8-c9d0-1234-efab-234567890104",
"comment": "RCE precondition",
"value": "RCE requires APR mmap allocator (default on Debian/Ubuntu and official Apache Docker images). Scoreboard at fixed address bypasses ASLR for practical exploitation."
},
{
"type": "text",
"category": "Other",
"to_ids": false,
"uuid": "f6a7b8c9-d0e1-2345-fabc-345678901205",
"comment": "Fix commit — r1930444",
"value": "https://svn.apache.org/viewvc?view=revision&revision=1930444"
},
{
"type": "text",
"category": "Other",
"to_ids": false,
"uuid": "a7b8c9d0-e1f2-3456-abcd-456789012306",
"comment": "Fix commit — r1930796",
"value": "https://svn.apache.org/viewvc?view=revision&revision=1930796"
},
{
"type": "text",
"category": "Other",
"to_ids": true,
"uuid": "b8c9d0e1-f2a3-4567-bcde-567890123407",
"comment": "IoC: HTTP/2 frame trigger sequence",
"value": "HTTP/2 HEADERS frame (type=0x01) immediately followed by RST_STREAM (type=0x03) with non-zero error code, same stream ID, before multiplexer stream registration"
},
{
"type": "text",
"category": "Other",
"to_ids": true,
"uuid": "c9d0e1f2-a3b4-5678-cdef-678901234508",
"comment": "IoC: RST_STREAM frame bytes (raw)",
"value": "00 00 04 03 00 [stream_id 4 bytes] [non-zero error code 4 bytes]"
},
{
"type": "text",
"category": "Other",
"to_ids": true,
"uuid": "d0e1f2a3-b4c5-6789-defa-789012345609",
"comment": "IoC: Server response header (vulnerable version)",
"value": "Server: Apache/2.4.66"
},
{
"type": "text",
"category": "Other",
"to_ids": true,
"uuid": "e1f2a3b4-c5d6-7890-efab-890123456710",
"comment": "Exploitation status",
"value": "DoS exploitation confirmed in the wild. RCE demonstrated in lab conditions; widespread weaponization anticipated."
},
{
"type": "text",
"category": "Other",
"to_ids": false,
"uuid": "f2a3b4c5-d6e7-8901-fabc-901234567811",
"comment": "Immediate mitigation",
"value": "Disable mod_http2: remove 'Protocols h2 h2c' from Apache config and restart. Or switch to MPM prefork. Definitive fix: upgrade to Apache HTTP Server 2.4.67."
},
{
"type": "url",
"category": "External analysis",
"to_ids": false,
"uuid": "a3b4c5d6-e7f8-9012-abcd-012345678912",
"comment": "Apache official advisory",
"value": "https://httpd.apache.org/security/vulnerabilities_24.html"
},
{
"type": "url",
"category": "External analysis",
"to_ids": false,
"uuid": "b4c5d6e7-f8a9-0123-bcde-123456789013",
"comment": "oss-security disclosure",
"value": "https://seclists.org/oss-sec/2026/q2/387"
}
],
"Object": [
{
"name": "vulnerability",
"meta-category": "vulnerability",
"Attribute": [
{
"type": "vulnerability",
"object_relation": "id",
"value": "CVE-2026-23918"
},
{
"type": "cvss-score",
"object_relation": "cvss-score",
"value": "8.8"
},
{
"type": "text",
"object_relation": "summary",
"value": "Apache mod_http2 double-free via HTTP/2 early reset — remote DoS and possible RCE"
}
]
}
]
}
}
| Version | Status | Aktion |
|---|---|---|
| 2.4.67 | Gepatched | Zielversion |
| 2.4.66 |
Befehle zur Distributionsaktualisierung:
Nach der Aktualisierung überprüfen:```bash apache2 -v # or httpd -v
### Weitere in 2.4.67 behobene CVEs
Das Release 2.4.67 adressiert fünf CVEs. Die beiden bedeutendsten neben CVE-2026-23918 sind:
- **CVE-2026-24072** — Privilegieneskalation durch CGI-Skriptverarbeitung unter Windows (betrifft nur Windows-Bereitstellungen)
- **CVE-2026-24081** — `mod_rewrite`-Ausdrucksauswertung erlaubt `.htaccess`-Autoren, beliebige Dateien als httpd-Benutzer zu lesen (betrifft 2.4.66 und früher, gemeldet am 20.01.2026)
- **CVE-2026-24088** — Heap-Pufferüberlauf in `mod_proxy_ajp` durch manipulierte AJP-Nachrichten von einem bösartigen AJP-Backend (betrifft 2.4.66 und früher)
Ein Upgrade auf 2.4.67 behebt alle fünf mit einem einzigen Schritt.
---
## Wichtige IoCs-Referenz
| Indikator | Wert | Vertrauen | Anmerkungen |
|---|---|---|---|
| Betroffene Version | `Apache/2.4.66` im Server-Header | **Hoch** | Allein das Vorhandensein weist auf Gefährdung hin |
| HTTP/2-Frametyp | RST_STREAM (0x03) mit Fehlercode ungleich Null | Mittel | Legitime Verbindungsfehler erzeugen dasselbe |
| Frame-Bythemuster | `00 00 04 03 00` (RST_STREAM-Header) | Mittel | In Kombination mit Schwellenwert = hoch |
| RST-Flut-Schwellenwert | >10 RST_STREAM/Fehler ungleich Null von gleicher Quelle in 30s | **Hoch** | Konsistent mit tatsächlich genutzter DoS-Tooling |
| SIGABRT auf Apache-Worker | Signal 6 gesendet an `httpd`/`apache2`-PID | **Hoch** | Normale Worker brechen nicht ab |
| Shell-Ausführung durch www-data | `execve()` von bash/sh durch uid 33 oder 48 | **Kritisch** | Weist stark auf RCE hin |
| Ausgehende Verbindung durch Apache-Benutzer | `connect()` durch uid 33 oder 48 zu externer IP | **Kritisch** | Weist stark auf Reverse Shell hin |
| Web-Dateierstellung im Web-Root | Neue `.php`/`.py`/`.sh` geschrieben unter `/var/www` | **Hoch** | Kann auf Web-Shell-Bereitstellung hinweisen |
| MPM-Typ | `mpm_prefork` | N/V — **nicht betroffen** | Überprüfen mit `apachectl -V \| grep MPM` |
| RCE-Vorbedingung | APR-mm-Allokator | Kontextabhängig | Standard auf Debian/Ubuntu; nicht Standard auf RHEL |
---
*Erkennungspaket wird gemäß den Sicherheitshinweisen von Apache HTTP Server unter [httpd.apache.org/security](https://httpd.apache.org/security/) gepflegt. Wenn Sie Exploit-Varianten oder Post-Exploitation-Muster beobachten, die nicht von diesen Regeln abgedeckt werden, erstellen Sie bitte ein Issue.*
| Sofort aktualisieren |
| 2.4.65 und älter | Von diesem spezifischen Fehler nicht betroffen | Kann andere bekannte CVEs enthalten — Hinweise prüfen |
| Distribution | Befehl |
|---|
| Ubuntu / Debian | sudo apt-get update && sudo apt-get upgrade apache2 |
| RHEL / Rocky / AlmaLinux | sudo dnf update httpd |
| Amazon Linux | sudo dnf update httpd |
| SUSE / openSUSE | sudo zypper update apache2 |
| Arch Linux | sudo pacman -Syu |