Bei CVE-2026-23918 handelt es sich um einen Double-Free in mod_http2 von Apache httpd 2.4.66. Ausgelöst wird der Fehler, wenn ein Client einen HTTP/2-HEADERS-Frame sendet, unmittelbar gefolgt von einem RST_STREAM mit einem von null verschiedenen Fehlercode auf demselben Stream – und zwar bevor der Multiplexer den Stream registriert hat.

In der Folge werden laut Dmitruk zwei nghttp2-Callbacks nacheinander ausgelöst: on_frame_recv_cb für das RST und on_stream_close_cb für das Schließen. Beide rufen über h2_mplx_c1_client_rst die Funktion m_stream_cleanup auf, wodurch derselbe h2_stream-Zeiger zweimal in das spurge-Array zum Aufräumen geschoben wird. Iteriert c1_purge_streams später über dieses Array und ruft für jeden Eintrag h2_stream_destroy beziehungsweise apr_pool_destroy auf, trifft der zweite Aufruf bereits freigegebenen Speicher.

Den DoS bezeichnet Dmitruk als trivial: Er funktioniert auf jeder Standardinstallation mit mod_http2 und einem mehrfädigen MPM. Eine einzige TCP-Verbindung, zwei Frames, keine Authentifizierung, keine besonderen Header und keine bestimmte URL genügen, um den Worker zum Absturz zu bringen. Apache startet den Prozess zwar neu, doch jede Anfrage auf dem abgestürzten Worker geht verloren, und der Angriff lässt sich beliebig lange aufrechterhalten.

Der Weg zur Remote Code Execution ist anspruchsvoller. Er setzt eine Apache Portable Runtime (APR) mit dem mmap-Allocator voraus, der auf Debian-basierten Systemen und im offiziellen httpd-Docker-Image standardmäßig aktiv ist. Die Forscher entwickelten nach eigenen Angaben einen funktionierenden Proof of Concept auf x86_64: Über die Wiederverwendung von mmap-Speicher platziert die Angriffskette eine gefälschte h2_stream-Struktur an der freigegebenen virtuellen Adresse, lässt deren Pool-Aufräumfunktion auf system() zeigen und nutzt den Scoreboard-Speicher von Apache als stabilen Behälter für die gefälschten Strukturen und die Befehlszeichenkette.

Das Scoreboard liegt über die gesamte Laufzeit des Servers an einer festen Adresse, selbst bei aktiviertem ASLR – genau das macht den RCE-Weg praktikabel. Dmitruk nennt allerdings Einschränkungen: Für system() und die Scoreboard-Offsets ist ein Information Leak nötig, und das Heap-Spraying ist probabilistisch. Unter Laborbedingungen gelinge die Codeausführung dennoch innerhalb von Minuten.

Nicht betroffen ist laut Dmitruk das MPM prefork. Die Angriffsfläche sei jedoch groß, da mod_http2 in Standardbuilds enthalten und HTTP/2 in produktiven Umgebungen weit verbreitet ist.