【CVE-2026-23918】Apache HTTP Server の HTTP/2 ダブルフリー脆弱性を解説と対応方法

CVE・脆弱性情報

この記事の概要

Apache HTTP Server 2.4.66 の mod_http2 にダブルフリー脆弱性(CVE-2026-23918、CVSSスコア 8.8)が発見されました。
認証不要・1接続 2フレームで DoS が成立し、Debian系ディストリビューションや Apache 公式 Docker イメージでは RCE PoC も実証されています。
2.4.67 以降へのアップグレード、または HTTP/2 の無効化で早急に対応してください。


この脆弱性について

項目 内容
CVE-ID CVE-2026-23918
CVSSスコア 8.8(CVSS v3.1)
脆弱性タイプ ダブルフリー(CWE-415)
発見者 Bartlomiej Dmitruk(Striga.ai)/ Stanislaw Strzalkowski(ISEC.pl)
公開日 2026年5月5日
PoC公開状況 RCE PoC 実証済み(x86_64 環境)
対応策 パッチあり(Apache HTTP Server 2.4.67)

影響を受けるバージョン:

  • Apache HTTP Server 2.4.66(mod_http2 有効時)

修正済みバージョン:

  • Apache HTTP Server 2.4.67 以降

原因

今回の脆弱性は、Apache HTTP Server の HTTP/2 実装モジュール mod_http2 のストリームクリーンアップ処理に存在するダブルフリーです。
具体的には h2_mplx.c のコードパスで問題が発生します。

技術的な発生メカニズム:

クライアントが同一の HTTP/2 ストリーム上で HEADERS フレームを送信した直後に、非ゼロのエラーコードで RST_STREAM を送信するという特定のシーケンスを実行すると、マルチプレクサーがストリームを登録する前に 2 つのコールバックが連鎖して呼び出されます。

  1. on_frame_recv_cb(RST 受信時)
  2. on_stream_close_cb(ストリームクローズ時)

この 2 つのコールバックがいずれも h2_mplx_c1_client_rst → m_stream_cleanup を呼び出し、同一の h2_stream ポインターをクリーンアップ配列(spurge)に2 回プッシュしてしまいます。
その後 c1_purge_streams が各エントリーに対して h2_stream_destroy → apr_pool_destroy を呼び出すと、2 回目の呼び出しが既に解放済みのメモリーを対象にし、ダブルフリーが発生します。

クライアント
  │
  ├─ HEADERS フレーム送信(ストリーム #N)
  └─ RST_STREAM 送信(ストリーム #N, error_code≠0)
         ↓
   on_frame_recv_cb   ─┐
   on_stream_close_cb ─┘  両方が m_stream_cleanup を呼ぶ
         ↓
   spurge 配列に h2_stream* が 2 回追加
         ↓
   c1_purge_streams が apr_pool_destroy を 2 回実行
         ↓
   ❌ ダブルフリー発生

この攻撃に必要なのは 1 本の TCP 接続と 2 フレームのみであり、認証・特殊ヘッダー・特定 URL は一切不要です。


影響範囲

2 段階の影響シナリオ:

シナリオ 1:DoS(サービス拒否)— 影響: 全対象環境

Apache が multi-threaded MPM(worker / event)でデプロイされている場合、上記の攻撃リクエストにより ワーカープロセスが即座にクラッシュします。
Apache は自動的にワーカーを再生成しますが、攻撃者が連続してリクエストを送り続ける限り、ワーカーが常にクラッシュ状態に保たれ、そのワーカーが処理中の全リクエストがドロップされます。

  • 認証不要
  • 1 接続・2 フレームで成立
  • 標準的な本番デプロイが対象(mod_http2 + worker/event MPM はデフォルト構成)
  • ※ MPM prefork は本脆弱性の影響を受けない

シナリオ 2:RCE(リモートコード実行)— 影響: Debian 系・Docker 公式イメージ

Apache Portable Runtime(APR)が mmap アロケーターを使用している環境では、RCE が可能です。
これは Debian / Ubuntu 系ディストリビューション、および Apache 公式 Docker イメージがデフォルトでこの条件を満たします。

研究者チームは x86_64 環境での RCE PoC を実証しており、その攻撃チェーンは次のとおりです。

  1. ダブルフリーにより解放された仮想アドレスに mmap 再利用で偽の h2_stream 構造体を配置
  2. 偽構造体のプールクリーンアップ関数ポインターを system() に向ける
  3. Apache のスコアボードメモリーを偽構造体・コマンド文字列の安定したコンテナとして利用

スコアボードは ASLR が有効な環境でもサーバーライフタイム全体を通じて固定アドレスに存在するため、これが実用的な RCE を可能にしています。

対象環境まとめ:

環境 DoS リスク RCE リスク
Apache 2.4.66 + mod_http2 + worker/event MPM 🔴 高(即成立) 条件次第
Debian / Ubuntu 系(APR mmap デフォルト) 🔴 高 🟠 中〜高(PoC 実証済み)
Apache 公式 Docker イメージ 🔴 高 🟠 中〜高(PoC 実証済み)
MPM prefork 使用環境 ✅ 影響なし ✅ 影響なし
Apache 2.4.67 以降(パッチ適用済み) ✅ 修正済み ✅ 修正済み


対応策・回避策

推奨対応 1:Apache HTTP Server のアップグレード(最優先)

Apache HTTP Server を 2.4.67 以降にアップグレードしてください。

# Ubuntu / Debian 系
sudo apt update
sudo apt install --only-upgrade apache2
apache2 -v
# 期待出力: Server version: Apache/2.4.67 (Ubuntu)

# RHEL / CentOS / AlmaLinux / Rocky Linux 系
sudo dnf update httpd
httpd -v

# Amazon Linux 2023
sudo dnf update httpd

Docker コンテナの場合:

# Dockerfile: 最新の公式イメージを使用する
FROM httpd:2.4.67-alpine
# または
FROM httpd:latest
# docker-compose.yml を使用している場合
docker-compose pull
docker-compose up -d

# 手動でイメージを更新する場合
docker pull httpd:2.4.67-alpine
docker stop <container_name>
docker rm <container_name>
docker run -d ... httpd:2.4.67-alpine

推奨対応 2:HTTP/2 の無効化(即時の暫定回避策)

パッチ適用が即座にできない場合、mod_http2 を無効化することで本脆弱性の影響を回避できます。

# /etc/apache2/mods-available/http2.conf または httpd.conf / apache2.conf に追記
# Protocols ディレクティブから h2 / h2c を除外する

# 変更前(脆弱)
Protocols h2 h2c http/1.1

# 変更後(回避策)
Protocols http/1.1

変更後に設定を反映します。

# Ubuntu / Debian 系
sudo a2dismod http2
sudo systemctl reload apache2

# RHEL 系
sudo systemctl reload httpd

確認方法

現在のバージョン確認:

# Apache バージョン確認
apache2 -v        # Debian 系
httpd -v          # RHEL 系
apachectl -v      # 汎用

# 期待するアウトプット例(修正済み)
# Server version: Apache/2.4.67 (Ubuntu)

mod_http2 が有効かどうかの確認:

# ロード済みモジュールの確認
apache2ctl -M 2>/dev/null | grep http2
# 出力: http2_module (shared)  ← 有効になっている場合

# 設定ファイルで HTTP/2 が有効になっているか確認
grep -r "Protocols" /etc/apache2/ /etc/httpd/ 2>/dev/null | grep -i h2

MPM の種類を確認:

# prefork なら DoS/RCE の影響なし
apache2ctl -M 2>/dev/null | grep -E "worker|event|prefork"
# または
apachectl -M | grep mpm

Docker 環境での確認:

# コンテナ内で確認
docker exec <container> httpd -v

# 使用中の Docker イメージのダイジェストを確認
docker inspect <container> | grep -i image


まとめ

CVE-2026-23918 は Apache HTTP Server 2.4.66 の mod_http2 に存在するダブルフリー脆弱性で、認証不要・1 接続 2 フレームで DoS が成立します。
Debian 系・Docker 公式イメージではさらに RCE も実証されており、CVSSスコア 8.8 の評価は妥当です。
mod_http2 はデフォルト有効なため影響範囲が広く、まず自環境の Apache バージョンと mod_http2 の有効状態を確認し、2.4.67 以上へのアップグレードを優先してください。
即時対応が難しい場合は HTTP/2 の無効化で暫定的に回避できます。


参考リンク

コメント