
CVE-2026-23918 の概念実証エクスプロイト。Apache mod_http2 における double-free 脆弱性により、認証不要のリモートコード実行が可能になります。偵察、スレッド化された HEADERS+RST_STREAM バースト、および RCE リスクスコアリングが含まれます。
影響を受ける: Apache HTTP Server 2.4.66 の mod_http2 + Event MPM
修正バージョン: Apache 2.4.67 (mod_h2 v2.0.37)
CVSS 3.1: 8.8 HIGH — 認証なしのリモートコード実行の可能性
CWE: CWE-415 (ダブルフリー)
Apache 2.4.66 の mod_http2 には、h2_mplx.c:m_stream_cleanup() 内にダブルフリーのバグがあります。この問題は、クライアントが同じストリーム上で HEADERS フレームの直後に RST_STREAM を送信した場合に発生します。タイミングが合うと、ストリームは2回 m->spurge パージ配列にプッシュされます。mplx が破棄されると、APR プールが2回解放され、ヒープが破損し、SIGABRT または SIGSEGV が発生します。
Apache は mod_h2 v2.0.37 で add_for_purge() を導入してこの問題を修正しました。これは、同じストリームが2回追加されるのを防ぐ単純な重複排除チェックです。
// Vulnerable (< v2.0.37)
APR_ARRAY_PUSH(m->spurge, h2_stream *) = stream; // can happen twice
// Fixed (v2.0.37+)
static int add_for_purge(h2_mplx *m, h2_stream *stream) {
for (int i = 0; i < m->spurge->nelts; ++i)
if (APR_ARRAY_IDX(m->spurge, i, h2_stream*) == stream)
return FALSE;
APR_ARRAY_PUSH(m->spurge, h2_stream *) = stream;
return TRUE;
}
デフォルトでは、スクリプトはターゲットに対して3フェーズのパイプラインを実行します:
| フェーズ | 説明 |
|---|---|
| 1 — 偵察 | Apache のバージョン、ALPN による HTTP/2 サポート、MPM タイプを検出します |
| 2 — 攻撃 | スレッド化された HEADERS+RST_STREAM バーストを送信し、まずインラインモード、次にステージモードを試みます |
| 3 — RCE 評価 | クラッシュの一貫性を測定し、リスクレベルをスコアリングします |
RCE スコアは、リモートで検出可能な3つのシグナルから計算されます。第一に、Apache 2.4.66 が実行されているかどうか。第二に、Event または Worker MPM が使用されているかどうか(mod_http2 は Prefork では起動しないため、HTTP/2 が動作する場合はスレッド化 MPM です)。第三に、クラッシュの決定性の程度 — 最初のラウンドでクラッシュするということは、ヒープの破損が制御可能で再現可能であることを意味し、これは RCE に必要な条件です。
pip install hpack requests
# Full PoC on a single target (default behavior)
python poc.py -t 192.168.1.100
# Increase pressure with more rounds, bigger bursts and more threads
python poc.py -t 192.168.1.100 -n 20 -b 500 -w 5
# Passive check only, nothing is sent to the target
python poc.py -t example.com --check-only
# Scan a whole list of targets
python poc.py -l sites.txt -o results.json
# Passive check on a list
python poc.py -l sites.txt --check-only
# Generate a Markdown report after the run
python poc.py -t target.com --report report.md
# one target per line, comments are ignored
192.168.1.100
example.com
example.com:8443
https://example.com
http://example.com:8080
適切な修正は Apache を 2.4.67 以降にアップグレードすることです。すぐにアップグレードできない場合は、HTTP/2 を無効にすることで攻撃対象領域を完全に除去できます:
# Before
Protocols h2 http/1.1
# After (disables HTTP/2)
Protocols http/1.1
このツールは、認可されたセキュリティテストおよび研究のみを目的としています。どのターゲットに対しても実行する前に、明示的な書面による許可を得ていることを確認してください。作者は誤用に対する一切の責任を負いません。
| フラグ | デフォルト | 説明 |
|---|
-t | — | 単一ターゲット(ホスト名またはIP) |
-l | — | ターゲットリストファイル(1行に1つ) |
-p | 443 | ポート |
-n | 10 | 攻撃ラウンド数 |
-b | 200 | 1ラウンドあたりのHEADERS+RSTペア数 |
-w | 3 | 1ラウンドあたりの並列接続数 |
-d | 0.1 | ラウンド間の遅延(秒) |
-m | inline | 攻撃モード: inline または staged |
--no-tls | — | TLS の代わりに h2c を使用 |
--check-only | — | パッシブ偵察のみ、攻撃なし |
-o | — | 結果をJSONファイルに保存 |
--report | — | Markdown レポートを生成 |
-v | — | 詳細出力 |
| レベル | 意味 |
|---|
| CRITICAL | 2.4.66 確認、HTTP/2 有効、Event MPM 検出、クラッシュが決定論的 — 今すぐパッチ適用 |
| HIGH | 2.4.66 確認、HTTP/2 有効、スレッド化 MPM 使用中 |
| MEDIUM | 2.4.66 検出されたが、HTTP/2 またはクラッシュが未確認 |
| LOW | バージョンが一致しない、または HTTP/2 未検出 |
| NONE | 既に 2.4.67+ にパッチ済み、または影響なし |