
Правила обнаружения для CVE-2026-23918 Apache http2 RCE - Источник: stringa.ai, isec.pl
Опубликовано: 2026-05-04
CVSSv3: 8.8 (High)
Тип: Удаленное выполнение кода / Отказ в обслуживании (Double-Free повреждение памяти)
Компонент: Apache HTTP Server mod_http2 (путь очистки потоков h2_mplx.c)
Подвержены: Apache HTTP Server 2.4.66 с включенным HTTP/2 и многопоточным MPM
Ссылки:
CVE-2026-23918 — это уязвимость двойного освобождения памяти (double-free) в реализации протокола HTTP/2 в Apache HTTP Server версии 2.4.66, затрагивающая только путь очистки потоков модуля mod_http2 в h2_mplx.c. Она позволяет неаутентифицированному удаленному злоумышленнику вызвать аварийное завершение рабочих процессов Apache (отказ в обслуживании) с помощью одного TCP-соединения и двух HTTP/2-фреймов. В условиях, присутствующих в системах на базе Debian и официальных Docker-образах Apache, двойное освобождение можно превратить в полноценное удаленное выполнение кода.
Эксплуатация для DoS подтверждена в реальных атаках. Наблюдаются масштабные интернет-сканирования, нацеленные на HTTP/2-конечные точки. Эксплойт для RCE доказал свою жизнеспособность в контролируемых средах, хотя на данный момент нет свидетельств широкой публичной эксплуатации для RCE.
MPM prefork не подвержен — уязвимость требует многопоточной конфигурации MPM (worker, event или аналогичной). CVE-2026-23918 затрагивает только Apache HTTP Server версии 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
> **Ключевая асимметрия:** Путь DoS не требует навыков работы с кучей и активно эксплуатируется. Путь RCE технически сложен, но был продемонстрирован в лабораторных условиях и почти наверняка будет превращён в оружие в ближайшем будущем, учитывая фиксированный адрес scoreboard, устойчивый к ASLR.
---
## Архитектура обнаружения
> В этом разделе объясняется, почему инструментарий для обнаружения здесь существенно отличается от типичного пакета для локального повышения привилегий.
Copy Fail (CVE-2026-31431) была **хостовой уязвимостью, доступной после атаки**. Злоумышленнику требовалось уже присутствовать в системе. Обнаружение в основном происходило на уровне системных вызовов (auditd, Wazuh) с YARA-сканированием PoC-скрипта на диске.
CVE-2026-23918 — это **сетевая уязвимость, доступная до атаки**. Эксплойт поступает в виде фреймов протокола HTTP/2 по сети до того, как выполняется какой-либо прикладной код. Это существенно меняет стек обнаружения:
| Layer | Copy Fail (LPE) | CVE-2026-23918 (RCE) |
|---|---|---|
| **Первичное обнаружение** | Правила auditd для системных вызовов | Сетевые правила Suricata |
| **WAF (ModSecurity)** | Ограниченно — не видит эксплойт | Актуально — аномалии + пост-эксплойт |
| **Auditd** | Основное обнаружение | Обнаружение последствий (сбои, пост-эксплойт) |
| **YARA** | Сканирует PoC-скрипт | Сканирует веб-шеллы (артефакты пост-эксплойта) |
| **Сетевые IDS** | Не применимо | Основной слой обнаружения |
| **TLS-инспекция** | Н/П | Требуется для полного покрытия Suricata |
Эмпирическое правило: для RCE на сетевом уровне работайте снаружи внутрь (сеть → WAF → хост). Для локального повышения привилегий — от хоста наружу.
---
## Ограничения обнаружения
> **Прочитайте это перед развёртыванием любых правил.**
**1. TLS прекращает видимость HTTP/2.**
Большинство промышленных развёртываний Apache используют HTTPS. Suricata не может проверять содержимое зашифрованных фреймов HTTP/2 без настроенной дешифрации TLS. Если ваше развёртывание Suricata не имеет доступа к ключам сессии TLS или зеркалу дешифрации, приведённые ниже правила сетевого уровня будут перехватывать только:
- HTTP/2 в открытом виде (h2c) — редко встречается в продакшне, но присутствует во внутренних средах;
- Сетевую сигнатуру поведения TCP-соединения (количество соединений, шаблоны RST на уровне TCP).
Для развёртываний HTTPS включите дешифрацию TLS в Suricata через настройку `tls-decrypt` и журналирование ключей сессии, либо полагайтесь вместо этого на WAF (ModSecurity/Coraza) и хостовые слои (auditd/Wazuh).
**2. ModSecurity не может заблокировать триггер эксплойта.**
Double-free происходит внутри парсера фреймов HTTP/2, до того как полный HTTP-запрос будет собран и передан ModSecurity. WAF видит запрос только после завершения парсинга фреймов — к этому моменту повреждение уже может произойти. ModSecurity в этом пакете используется для обнаружения аномалий, ограничения скорости и детектирования пост-эксплуатации, а не как блокиратор триггера.
**3. MPM prefork не подвержен уязвимости.**
Если ваше развёртывание Apache использует `mpm_prefork_module` (однопоточный), эта уязвимость не применяется. Ошибка проявляется только в многопоточных MPM (`mpm_event_module` или `mpm_worker_module`). Проверьте с помощью `apachectl -V | grep MPM` перед развёртыванием правил, которые могут давать ложные срабатывания на серверах с prefork.
**4. RCE требует аллокатора mmap.**
Путь RCE (не путь DoS) требует mmap-аллокатора APR, который используется по умолчанию в дистрибутивах на основе Debian и официальных Docker-образах Apache. Развёртывания на RHEL/CentOS, использующие jemalloc или системный malloc, имеют сниженный риск RCE, но всё ещё полностью уязвимы к DoS.