Skip to content
KitploitKITPLOIT
ツールブログ
提出
ツールブログ
提出

ハッキング、侵入テスト、サイバーセキュリティツールをあなたのセキュリティアーセナルに!

Kitploitはハッキング、サイバーセキュリティ、ペネトレーションテストのツールディレクトリです。最新のプロジェクトアップデートを見つけて、脆弱性の発見、システム分析、テストの自動化、セキュリティの強化を行いましょう。

··フィード·お問い合わせ·プライバシー·© 2026 Kitploit

ツールディレクトリ

カテゴリ

すべてのカテゴリを見る
Loading categories
POC-CopyEscape-CVE-2026-17106 — CVE-2026-17106 (CopyEscape) の機能的な PoC: docker cp における TOCTOU レースにより、Docker ホストへの任意書き込みが可能になります。Docker ラボ + inotify モニター + LD_PRELOAD。macOS では無害、Linux では破壊的な亜種です。 | Kitploit
ツール/GitHubGitHub/686f6c61/poc-copyescape-cve-2026-17106
特権昇格コンテナセキュリティ脆弱性分析エクスプロイト学習と教育コンテナエスケープ敵対的攻撃ラボと実践
GitHub

人気

すべて見る →

コミュニティで最も使われているツールを見つけましょう。

すべてのツールを探索

ツールコレクションを閲覧

すべてのツールを見る →
共有
686f6c61/poc-copyescape-cve-2026-17106

POC-CopyEscape-CVE-2026-17106

CVE-2026-17106 (CopyEscape) の機能的な PoC: docker cp における TOCTOU レースにより、Docker ホストへの任意書き込みが可能になります。Docker ラボ + inotify モニター + LD_PRELOAD。macOS では無害、Linux では破壊的な亜種です。

リポジトリを見る
1829日前未レビュー

CopyEscape — CVE-2026-17106 の PoC

CopyEscape (CVE-2026-17106) の教育的な Proof of Concept。docker cp における TOCTOU 競合状態の脆弱性で、悪意のあるコンテナが Docker ホスト上に任意のファイルを書き込むことを可能にします。この脆弱性を発見・文書化した masasron 氏によるブログ記事 "CopyEscape: Taking Over Docker Hosts with docker cp" に触発されたものです。


目次

  1. 実行概要
  2. 法的通知
  3. 攻撃チェーンの構造
  4. 要件
  5. リポジトリ構成
  6. クイックスタートガイド
  7. エクスプロイトの検証
  8. オリジナルとの比較
  9. 緩和策
  10. クレジット
  11. ライセンス

実行概要

CVE-2026-17106 は、docker cp <contenedor>:<ruta> <destino> の際に Docker デーモンが生成する tar ファイルの展開処理における競合状態 (TOCTOU) の脆弱性です。Docker CLI 29.6.1 以前に影響し、29.7.0 以降で修正されています。このバグはデーモンではなく CLI (ホスト上での tar 展開) に存在します。

CopyEscape と名付けられたこの攻撃チェーンは、特別な権限を持たない実行中コンテナのみを起点として、攻撃者が以下を行えることを示します:

  1. LD_PRELOAD ライブラリを使って、コンテナ内でそれを開くあらゆるプロセスに対して、実際のディレクトリ /watched/file.txt/ を通常のファイルとして偽装する。このライブラリは open、openat、openat2、fopen、stat、lstat、fstatat、statx および 64 系の各バリアントをインターセプトする。
  2. 16 MiB の囮ファイル aaa.txt を維持し、デーモンが tar を生成するのに十分な時間をかけさせ、モニタが競合に勝てるようにする。
  3. inotify でデーモンのアクセスを監視し、競合ウィンドウの間に、escape/ サブディレクトリを、ロールバック付きの 2 つのアトミックな rename(2) によってホストのターゲットへの絶対 symlink (macOS では /Users/<usuario>、Linux では /usr/bin) に置き換える。
  4. 結果の tar には symlink escape と、それに続く子エントリ escape/<basename> が含まれる。脆弱な CLI はクライアント側で symlink を作成し、その 経由で 子エントリを展開するため、ユーザーが選んだ宛先の外に書き込む。

結果として、docker cp を実行するプロセスの権限でホスト上への任意ファイル書き込みが可能になります。Linux バリアントは /usr/bin/runc を上書きし、次回の docker run / exec でホスト上でのroot によるコード実行を達成します。


法的通知

このリポジトリには、厳密に教育・防御目的の資料が含まれています。

  • 目的: 教育、自身の監査、パッチ の検証を目的として攻撃チェーンを示すこと。
  • 許可される用途: 自分が所有するシステム、または明示的な書面による許可を得たシステムに対してのみ実行すること。
  • 禁止事項: 同意なしに第三者システムに対して使用すること。リポジトリの作者は、ここに含まれる資料の不正使用について責任を負いません。
  • 責任: 適用される法律 (スペインの LOPD/RGPD、米国の CFAA など) の遵守については、運用者が単独で責任を負います。
  • Linux バリアントはホストの runc を破壊します。検証済みのバックアップがある使い捨て VM でのみ使用してください。

この PoC には無害な macOS バリアント (~/pwnd をマーカーとして書き込む) が同梱されており、その唯一の目的は再現可能なデモンストレーションとして機能することです。


攻撃チェーンの構造

root@kitploit:~
┌─────────────────────────────────────────────────────────────────────┐
│  1. LD_PRELOAD camufla /watched/file.txt como archivo regular       │
│     open/openat/openat2/fopen/stat/lstat/fstatat/statx → decoy       │
│     docker exec ... cat /watched/file.txt  →  "top-level file"       │
└──────────────────────────────────────────┬──────────────────────────┘
                                           │
                                           ▼
┌─────────────────────────────────────────────────────────────────────┐
│  2. Layout real dentro del contenedor                               │
│     /watched/file.txt/                                               │
│     ├── aaa.txt            (16 MiB de 'B', cebo lento)               │
│     ├── escape/            (directorio real inicial)                 │
│     ├── escape/<basename>  (payload: runc o pwnd)                    │
│     └── .swap-escape       (symlink → /Users/<usr> o /usr/bin)       │
└──────────────────────────────────────────┬──────────────────────────┘
                                           │
                                           ▼
┌─────────────────────────────────────────────────────────────────────┐
│  3. docker cp pide tar al daemon                                    │
│     daemon recorre /watched/file.txt/ y abre aaa.txt                │
│     inotify detecta IN_OPEN sobre aaa.txt                           │
└──────────────────────────────────────────┬──────────────────────────┘
                                           │
                                           ▼
┌─────────────────────────────────────────────────────────────────────┐
│  4. Monitor pivot: dos rename(2) atomicos con rollback              │
│     escape/ → .old-escape/   (backup)                                │
│     .swap-escape → escape/   (symlink al target del host)            │
└──────────────────────────────────────────┬──────────────────────────┘
                                           │
                                           ▼
┌─────────────────────────────────────────────────────────────────────┐
│  5. Tar resultante contiene:                                        │
│     escape → /Users/<usr>   (symlink absoluto)                       │
│     escape/<basename>        (entrada hija que atraviesa el symlink) │
└──────────────────────────────────────────┬──────────────────────────┘
                                           │
                                           ▼
┌─────────────────────────────────────────────────────────────────────┐
│  6. CLI vulnerable extrae symlink + hija                            │
│     crea escape → /Users/<usr> en el destino local                   │
│     extrae escape/<basename> A TRAVES del symlink                    │
│     escribe /Users/<usr>/<basename> en el host                       │
└──────────────────────────────────────────┬──────────────────────────┘
                                           │
                                           ▼
┌─────────────────────────────────────────────────────────────────────┐
│  macOS: ~/pwnd con "COPYESCAPE_MACOS_DEMO"  (demo inocua)           │
│  Linux: /usr/bin/runc sobrescrito          (RCE como root)          │
└─────────────────────────────────────────────────────────────────────┘

要件

この PoC は macOS での実行を想定して構築されており、以下が必要です:

  • Docker Desktop 4.81+ が稼働していること (デーモンはどのバージョンでも可。バグは CLI にあります)。
  • curl、tar、git、docker が PATH に含まれていること。
  • 脆弱な CLI 29.6.1 (約 18 MB) とベースイメージ alpine:3.21 をダウンロードするためのインターネット接続。
  • HOME が /Users/<usuario> の形式であること。

macOS バリアントでは root は不要です。Linux バリアントでは root と使い捨て VM が必要です。

ランナー run-poc.sh は、Docker 公式サイト (download.docker.com) から脆弱な CLI 29.6.1 のバイナリを自動的にダウンロードします。システムの Docker Desktop インストールは変更しません。現在のデーモンを使用しますが、docker cp 操作にはダウンロードしたバイナリを呼び出します。


リポジトリ構成

root@kitploit:~
POC CopyEscape (CVE-2026-17106)/
├── README.md                 ← Este archivo
├── LICENSE                   ← Licencia MIT
├── .gitignore
├── Dockerfile                ← Dockerfile unificado (macos | linux)
├── entrypoint.sh             ← Arranque del monitor sin LD_PRELOAD
├── monitor.c                 ← Monitor inotify unificado (una sola fuente)
├── watched_preload.c         ← LD_PRELOAD con cobertura ampliada
└── run-poc.sh                ← Runner robusto con reintentos

ディレクトリ cli-vulnerable/ (ダウンロードされた CLI 29.6.1) は .gitignore でリポジトリから除外されます。 ランナーは存在しない場合、自動的にダウンロードします。


クイックスタートガイド

1. PoC を実行する (無害な macOS バリアント)

root@kitploit:~
cd poc-v2
./run-poc.sh

ランナーは次の処理を行います:

  1. 存在しない場合、脆弱な CLI 29.6.1 をダウンロードする。
  2. Docker イメージ copyescape-macos-pocv2:local をビルドする。
  3. COPYESCAPE_HOST_HOME=$HOME を設定した準備済みコンテナを起動する。
  4. コンテナ内で /watched/file.txt が読み取り可能になるのを待つ。
  5. 脆弱な CLI で docker cp を実行する。
  6. マーカー ~/pwnd の作成を検証する。

2. ランナーのオプション

root@kitploit:~
./run-poc.sh 10         # 10 intentos (la carrera es probabilistica)
./run-poc.sh --cleanup  # 5 intentos y borra la imagen al final

3. 期待される出力

root@kitploit:~
[run-poc] CLI vulnerable: 29.6.1
[run-poc] Intento 1/5 (contenedor copyescape-pocv2-NNNN-RRRR)
[run-poc]   /watched/file.txt lee: top-level file
[run-poc]   docker cp (CLI 29.6.1)...
[run-poc]   EXITO en intento 1: se creo /Users/<tu-usuario>/pwnd
  Contenido del marcador: COPYESCAPE_MACOS_DEMO
[run-poc]   Logs del monitor:
    [monitor] plataforma=macos target_dir=/Users/<tu-usuario> target_file=/Users/<tu-usuario>/pwnd quiet_ms=400 trigger=aaa.txt
    [monitor] pivoted /watched/file.txt/escape -> /Users/<tu-usuario>
[run-poc] Resumen: 1 exito en 1 intento(s).

4. クリーンアップ

root@kitploit:~
rm -f -- "$HOME/pwnd"
rm -rf -- poc-v2/file.txt
docker image rm copyescape-macos-pocv2:local

エクスプロイトの検証

攻撃チェーンが完了すると、以下の要素が証拠となります:


オリジナルとの比較

オリジナルから引き継がれている点

アイデアと戦略は masasron 氏のものです: tar 生成プロセスに対する TOCTOU 競合、LD_PRELOAD による偽装、16 MiB の囮、2 つの rename(2) によるピボット、そして escape/ + .swap-escape 構造。この設計がなければ、この書き直しは存在しませんでした。概念的なスキームは同一です。

書き直された点

約 15〜20 % は文字通り一致する行 (短いユーティリティとレイアウト定数) です。残りは新しいコードです。


緩和策

  • Docker CLI を 29.7.0 以上に更新する。 PoC は機能しなくなります (29.7.2 で検証済み)。
  • 信頼できないコンテナから docker cp を実行しない。Linux では絶対に root として実行しない。
  • 簡単な検出方法: docker cp の展開中に宛先内で絶対 symlink が作成されていないか監視するか、デーモン側で symlink 配下の子エントリを含む tar をブロックする。
  • このバグの根源は TarSlip / ZipSlip と同じクラスの欠陥です。CLI は後続のエントリが作成済みの symlink を経由して外部に逃げ出さないことを検証していません。

クレジット

  • オリジナルの調査と公開: masasron — https://github.com/masasron/CopyEscape-CVE-2026-17106
  • このリポジトリの PoC とパッケージ化: 教育目的の独自の作業であり、元のアイデアに基づいてゼロから書き直したものです。

ライセンス

MIT ライセンスの下で配布されています。詳細については LICENSE ファイルを参照してください。

ツールをダウンロード
リソース期待される証拠
~/pwnd内容が COPYESCAPE_MACOS_DEMO\n のファイル
poc-v2/file.txt/escape -> /Users/<tu-usuario> (symlink) と aaa.txt (16 MiB) を含むディレクトリ (ファイルではない)
docker logs <contenedor>行 pivoted /watched/file.txt/escape -> /Users/<tu-usuario>
CLI 29.7.2 (修正版 CLI での docker cp)マーカーは作成されない。PoC は失敗する
ファイル元の行数新しい行数変更内容
watched_preload.c89257書き直し: openat2、fstatat、statx、stat64、lstat64、open64、fopen64 のラッパー、スレッドセーフなコンストラクタ、dlsym == NULL に対するガード、O_TMPFILE
monitor.c (macos + linux)259 + 233 = 492 (重複)344 (統合)-DCOPYESCAPE_TARGET_* で書き直し・統合。try_pivot のロールバック、設定可能な exit_quiet_ms とトリガー、堅牢な検出
entrypoint.sh35unset の代わりに env -u LD_PRELOAD
Dockerfile2243統合、digest 固定、--platform、-Werror なし、-static、LABEL
demo-macos.sh → run-poc.sh88166書き直し: 競合の再試行、失敗時のログ、--cleanup、バイナリへの検証委任