この記事ではセキュリティに特化して解説します。AIセキュリティ全般は サプライチェーンセキュリティ完全ガイド2026|攻撃手法・防御ツール・実践チェックリスト をご覧ください。

Docker Engineに深刻な認可バイパス脆弱性、CVSS 8.8

Docker Engineに高深刻度の脆弱性CVE-2026-34040が公開された。CVSS 8.8。攻撃者がDocker APIへのアクセス権を持っている場合、AuthZ(認可)プラグインを完全にバイパスし、特権コンテナを作成してホストファイルシステムを掌握できる。

修正版はDocker Engine 29.3.1。影響を受けるのは29.3.1未満の全バージョンで、根本原因はDocker Engine 1.10(約10年前)から存在していた。

攻撃の仕組み ── 1MBの壁を悪用する

この脆弱性の核心は、Docker EngineのAuthZプラグイン連携におけるdrainBody関数にある。

sequenceDiagram participant A as 攻撃者 participant D as Docker Daemon participant P as AuthZプラグイン participant C as コンテナ A->>D: コンテナ作成リクエスト(1MB超にパディング) D->>D: drainBody() → 1MBバッファ超過 D->>D: Peek() → 空データを返す D->>P: 空のリクエストボディを送信 P->>P: 空ボディ → デフォルトで"許可" P->>D: 認可OK D->>D: 元の悪意あるペイロードを実行 D->>C: 特権コンテナ作成(--privileged, -v /:/host) C->>A: ホストファイルシステム完全アクセス

drainBody関数はリクエストボディを読み取ってAuthZプラグインに渡す役割を持つが、ハードコードされた1MBのバッファ制限がある。攻撃者がリクエストボディを1MB超にパディングすると:

  1. Peek()操作が空データを返す
  2. Docker Daemonは空のボディをAuthZプラグインに送信
  3. 多くのAuthZプラグインは空ボディに対してデフォルトで「許可」を返す
  4. Docker Daemonは元の悪意あるペイロードをそのまま実行する
# 攻撃のイメージ(概念的なコマンド)
# 1MB超のパディングを含むコンテナ作成リクエスト
curl -X POST http://docker-host:2375/containers/create \
  -H "Content-Type: application/json" \
  -d '{"Image":"alpine","HostConfig":{"Privileged":true,"Binds":["/:/ host"]},"padding":"AAAA...(1MB超)..."}'

# AuthZプラグインには空ボディが渡され → 許可
# Docker Daemonは元のリクエストを実行 → 特権コンテナ作成

CVE-2024-41110の不完全な修正 ── 同じ問題が再発

この脆弱性はCVE-2024-41110の修正が不完全だったことが原因。2024年に発見された同じAuthZバイパスの修正パッチが、1MB超のリクエストボディに対する処理を正しくカバーしていなかった。

  CVE-2024-41110 CVE-2026-34040
発見年 2024 2026
原因 AuthZに空ボディが渡される 同上(修正漏れ)
攻撃条件 Content-Length 0のリクエスト 1MB超のリクエストボディ
修正 Docker 27.1.1 Docker 29.3.1
CWE CWE-187 CWE-288

根本原因のコードは約10年前のDocker Engine 1.10から存在しており、長期間にわたって潜在的なリスクとなっていた。

影響範囲 ── 誰が危険か

環境 リスク 理由
マルチテナントDocker環境 極めて高い テナント間の認可制御がバイパスされる
CI/CDパイプライン 高い ビルドワーカーが特権コンテナを作成可能
Docker APIを公開している環境 高い ネットワーク経由で攻撃可能
AuthZプラグイン未使用の環境 低い AuthZを使っていなければ直接的影響なし
Flociのようなローカル開発環境 低い ローカルでの開発利用では通常AuthZ不使用

今すぐ確認すべきこと

Step 1: バージョン確認

docker version --format ''
# → 29.3.1 未満なら脆弱

Step 2: 危険なコンテナの検出

# 特権コンテナの検出
docker ps --format ' ' | while read name status; do
  priv=$(docker inspect "$name" --format '')
  if [ "$priv" = "true" ]; then
    echo "⚠️ 特権コンテナ検出: $name"
  fi
done

# ホストファイルシステムマウントの検出
docker ps -q | xargs -I {} docker inspect {} \
  --format ': → ' \
  | grep -E "/:| /etc| /var/run/docker.sock"

Step 3: 修正

# Docker Engine 29.3.1にアップグレード
# Ubuntu/Debian
sudo apt-get update && sudo apt-get install docker-ce=5:29.3.1-1~ubuntu.24.04~noble

# macOS (Docker Desktop)
# Docker Desktop → Check for Updates → 29.3.1以上に更新

パッチ適用が困難な場合の回避策

# Dockerデーモンソケットの権限制限
sudo chmod 660 /var/run/docker.sock

# user namespace remapping有効化(/etc/docker/daemon.json)
{
  "userns-remap": "default"
}

# デーモン再起動
sudo systemctl restart docker

Docker 29.3.1での修正内容

修正コミット(e89edb1、3月25日)では以下が変更された:

  • バッファ制限を1MBから4MiBに引き上げ
  • fail-closedバリデーションを実装: ペイロードサイズ超過を検知した場合、AuthZプラグインに渡す前にリクエストを拒否
  • 空ボディに対するデフォルト「許可」の動作を廃止
flowchart LR subgraph BEFORE["修正前(29.3.0以前)"] B1["1MB超のリクエスト"] --> B2["空ボディをAuthZに渡す"] B2 --> B3["デフォルト許可"] end subgraph AFTER["修正後(29.3.1)"] A1["4MiB超のリクエスト"] --> A2["サイズ超過を検知"] A2 --> A3["リクエスト拒否(fail-closed)"] end style BEFORE fill:#ff6b6b15,stroke:#ff6b6b style AFTER fill:#22c55e15,stroke:#22c55e

タイムライン

日付 事象
2024年7月 CVE-2024-41110(同じAuthZバイパス)が公開・修正
2026年3月25日 修正コミット e89edb1 がマージ
2026年3月31日 CVE-2026-34040 割り当て、Docker 29.3.1リリース
2026年4月2日 セキュリティアドバイザリ公開
2026年4月7日 各メディアで報道開始

同日に発覚したaxiosサプライチェーン攻撃Claude Codeソースコード流出と合わせて、2026年3-4月はインフラ・開発ツールのセキュリティインシデントが集中している。Grypeのようなコンテナ脆弱性スキャンツールを導入していれば、こうした脆弱性の早期検知が可能だ。

関連記事: サプライチェーンセキュリティ完全ガイド2026|攻撃手法・防御ツール・実践チェックリスト

参照ソース