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

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

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

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

ツールディレクトリ

カテゴリ

すべてのカテゴリを見る
Loading categories
Copy-Fail-CVE-2026-31431-Kubernetes-PoC — Kubernetes上でCVE-2026-31431のカーネルページキャッシュ破損を介したコンテナエスケープを実証する概念実証であり、非特権コンテナからノードレベルのコード実行を達成します。 | Kitploit
ツール/GitHubGitHub/starscow/copy-fail-cve-2026-31431-kubernetes-poc
特権昇格脆弱性分析エクスプロイト学習と教育コンテナエスケープ
GitHubstarscow/copy-fail-cve-2026-31431-kubernetes-poc

Copy-Fail-CVE-2026-31431-Kubernetes-PoC

Kubernetes上でCVE-2026-31431のカーネルページキャッシュ破損を介したコンテナエスケープを実証する概念実証であり、非特権コンテナからノードレベルのコード実行を達成します。

リポジトリを見る

人気

すべて見る →

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

すべてのツールを探索

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

すべてのツールを見る →
共有
4ヶ月前未レビュー

Copy Fail (CVE-2026-31431) — KubernetesコンテナエスケープPoC

完全に非特権のコンテナが、共有コンテナイメージレイヤーを通じてCVE-2026-31431 Linuxカーネルのページキャッシュ破損バグを悪用し、Kubernetes上でノードレベルのコード実行を達成できることを実証するProof-of-Conceptです。

免責事項: このリポジトリは教育および防御目的でのみ公開されています。所有しているシステム、または明示的なテスト許可を得たシステムでのみ使用してください。

背景

CVE-2026-31431("Copy Fail")は、ページキャッシュのコピーオンライト(CoW)パスにおけるLinuxカーネルの脆弱性です。AF_ALGスプライスレースにより、非特権プロセスが読み取り専用ファイルのページキャッシュページを破損させることができます。この破損はカーネルのページキャッシュに永続し、その後そのファイルを読み取るまたは実行するすべてのプロセス(他のコンテナやホスト上のプロセスを含む)から参照可能になります。

元の脆弱性の詳細については、copy.failを参照してください。

仕組み

攻撃チェーンには3つの段階があります:ページキャッシュ破損、クロスコンテナ伝播、特権実行です。

1. AF_ALGスプライスレースによるページキャッシュ破損

カーネルのAF_ALG(暗号)サブシステムは、ユーザー空間の暗号操作のためのソケットベースのインターフェースを公開しています。このエクスプロイトは、ファイルからAF_ALGソケットへのsplice()をカーネルが処理する際のレースコンディションを悪用します:

  1. ターゲットバイナリ(例: /usr/sbin/ipset)を読み取り専用で開きます。
  2. authesn(hmac(sha256),cbc(aes))にバインドされたAF_ALG AEADソケットを作成します。
  3. MSG_MOREフラグを付けてAF_ALGソケット経由で小さなペイロードチャンクを送信し、カーネルにさらなるデータが来ることを伝えます。
  4. ターゲットファイルの内容をfd → パイプ → AF_ALGソケットへsplice()します。
  5. CoWバグにより、カーネルは攻撃者のペイロードバイトを適切に分離する代わりに、ターゲットファイルのページキャッシュページに書き込みます。

エクスプロイトは、ターゲットバイナリのキャッシュされたページ全体がカスタムペイロードで上書きされるまで、これを4バイトウィンドウごとに繰り返します。

ファイルへの書き込み権限は不要です。ディスク上のファイルは変更されません — メモリ内のページキャッシュのみが破損します。

2. イメージレイヤー共有によるクロスコンテナ伝播

コンテナランタイム(containerd、CRI-O)はoverlayファイルシステムを使用します。2つのコンテナが同じイメージレイヤーを共有する場合、カーネルは同じページキャッシュページからファイル読み取りを提供します。

このPoCイメージはFROM registry.k8s.io/kube-proxy:v1.35.2でビルドされています。すべてのKubernetesノード上のkube-proxy DaemonSetはまったく同じベースレイヤーを使用します。その結果、両方のコンテナ内の/usr/sbin/ipsetは同一のページキャッシュページセットにマッピングされます。

非特権のPoCコンテナがipsetのページキャッシュを破損すると、その破損はクロスコンテナ通信を一切行わずに、同じノード上の特権kube-proxyコンテナに即座に認識されます。

3. kube-proxyによる特権実行

kube-proxyはhostNetwork: trueを持つ特権DaemonSetとして実行されます。iptables/ipsetルールを管理するために/usr/sbin/ipsetを定期的に呼び出します。次にipsetを実行するとき、カーネルは破損したページキャッシュページをロードし、kube-proxyの完全な特権で攻撃者のペイロードを実行します:

  • ノード上の完全なroot
  • すべてのケーパビリティ
  • ホスト名前空間へのアクセス

このPoCのペイロード(payload/payload.c)は、ホストのルートファイルシステムをマウントし、ノードレベルのコード実行の証明として/root/resにマーカーファイルを書き込むだけです。

攻撃フロー図

root@kitploit:~
┌──────────────────────────┐     ┌──────────────────────────┐
│   PoCコンテナ             │     │   kube-proxyコンテナ      │
│   (非特権)                │     │   (特権)                 │
│                          │     │                          │
│  1. /usr/sbin/ipsetを開く │     │                          │
│     (読み取り専用)        │     │                          │
│                          │     │                          │
│  2. AF_ALGスプライスレース│     │                          │
│     ページキャッシュを破損 │     │                          │
│          │               │     │                          │
└──────────┼───────────────┘     └──────────────────────────┘
           │                                  │
           ▼                                  │
  ┌─────────────────────┐                     │
  │  カーネルページキャッシュ│                     │
  │  /usr/sbin/ipset     │◄────────────────────┘
  │  (破損)              │     3. kube-proxyがipsetを実行
  │  攻撃者のペイロードを  │        → 破損ページをロード
  │  含む                │        → ペイロードがホスト上で
  └─────────────────────┘           rootとして実行

リポジトリ構造

root@kitploit:~
.
├── cmd/copyfail/main.go          # エントリポイント; コンパイル済みペイロードを埋め込み
├── internal/
│   ├── exploit/
│   │   ├── exploit.go            # コアエクスプロイト: AF_ALGスプライスレースループ
│   │   └── patch.go              # ペイロードを4バイトパッチウィンドウに分割
│   └── alg/
│       └── alg.go                # AF_ALG AEADソケット抽象化
├── payload/
│   ├── payload.c                 # 検証ペイロード (ホストfsのマウント、マーカー書き込み)
│   └── nolibc/                   # 静的・依存関係なしペイロード用のカーネルの小型libc
├── deploy/
│   └── poc.yaml                  # Kubernetes Deploymentマニフェスト
├── Dockerfile                    # イメージレイヤー共有のためkube-proxyからビルド
├── Makefile                      # ビルドオーケストレーション
└── docs/                         # ACK (Alibaba Cloud) からの検証エビデンス

前提条件

  • Go 1.25以上
  • nolibcペイロード用のクロスコンパイラ(デフォルト: x86_64-linux-gnu-gcc)
  • Docker / Buildx
  • kube-proxyをDaemonSetとしてimagePullPolicy: IfNotPresent(デフォルト)で実行しているKubernetesクラスター
  • CVE-2026-31431修正前のLinuxカーネル

ビルド

root@kitploit:~
# ペイロード + Goバイナリをビルド
make build

# Dockerイメージをビルド
make docker-build

# GHCRにビルドしてプッシュ
make docker-push IMAGE=ghcr.io/<you>/copy-fail-poc TAG=latest

arm64ターゲットの場合:

root@kitploit:~
make build CC=aarch64-linux-gnu-gcc GOARCH=arm64

使用方法

PoCのデプロイ

root@kitploit:~
kubectl apply -f deploy/poc.yaml

Deploymentは単一の非特権ポッドを作成します。そのポッドは:

  1. /bin/copyfail -target /usr/sbin/ipsetを実行してページキャッシュを破損します。
  2. 観察のためにポッドが実行し続けるよう無期限にスリープします。

エスケープの検証

kube-proxyが次にipsetを実行した後(通常はリコンシリエーションループにより数秒以内、または次の再起動時)、ノードを確認します:

root@kitploit:~
# ノードにSSH接続するか、特権デバッグポッドを使用
cat /root/res
# 期待される出力: [*] success

ホストファイルシステム上に/root/resが存在することは、攻撃者が提供したコードがノードレベルの特権で実行されたことを証明します — kube-proxyの特権コンテナコンテキスト内から書き込まれます。

クリーンアップ

root@kitploit:~
kubectl delete -f deploy/poc.yaml

# 影響を受けたノードで、マーカーを削除しkube-proxyを再起動:
rm -f /root/res
systemctl restart kubelet   # またはkube-proxyポッドを削除して再プルを強制

なぜkube-proxy + ipsetなのか?

kube-proxyは理想的なターゲットです。なぜなら:

  1. すべてのノードに存在 — DaemonSetとして実行されます。
  2. 高度に特権化 — privileged: true、hostNetwork: true。
  3. イメージにipsetを同梱 — ipsetはiptables管理に使用されるsetuidバイナリです。
  4. imagePullPolicy: IfNotPresentを使用 — 攻撃者のイメージがプルされ同じベースレイヤーを共有すると、overlayのlower-dirページが共有されます。

予測可能なバイナリを含むイメージを持つ特権DaemonSetは、同じ方法でターゲットにできる可能性があります。

ペイロードのカスタマイズ

デフォルトのペイロード(payload/payload.c)は、マーカーファイルを書き込む検証専用プログラムです。カスタムペイロードをビルドするには:

  1. payload/payload.cを編集します。このプログラムは静的で依存関係のないバイナリのため、nolibc(カーネルの最小Cライブラリ)に対してビルドされます。
  2. make payloadを実行してクロスコンパイルします。
  3. コンパイルされたペイロードは//go:embedを介してGoバイナリに埋め込まれます。

影響を受けるバージョン

  • Linuxカーネル: CVE-2026-31431パッチより前のすべてのバージョン。
  • Kubernetes: パッチ未適用のノードカーネルを使用する任意のバージョン。脆弱性はKubernetes自体ではなくカーネルにあります。Kubernetesは単に実行コンテキスト(共有イメージレイヤー+特権DaemonSet)を提供し、ローカルなページキャッシュ破損から完全なコンテナエスケープへの影響を増幅させます。

緩和策

  • カーネルにパッチを適用します。 これが決定的な修正です。
  • イメージレイヤーの分離を有効にします。 一部のランタイムは、ページキャッシュ共有を防ぐコンテナごとのファイルシステムスナップショットをサポートしています。
  • kube-proxyに読み取り専用ルートファイルシステムを使用します(完全には緩和されませんが、ペイロードの機能を制限します)。
  • ポッドスケジューリングを制限して、信頼できないワークロードが共有ベースイメージを持つ特権DaemonSetを実行しているノードに配置されないようにします。

クレジット

  • CVE-2026-31431の発見と開示: Theori / Xint
  • クロスプラットフォームCペイロード: Tony Gies (LGPL-2.1-or-later OR MIT)
  • nolibc: Linuxカーネルセルフテスト (tools/include/nolibc/)

ライセンス

このリポジトリのGoエクスプロイトコードは、研究目的で現状のまま提供されます。

ペイロード(payload/payload.c)はcopy-fail-cから派生しており、LGPL-2.1-or-later OR MITのデュアルライセンスです。LICENSE-LGPLおよびLICENSE-MITを参照してください。

ツールをダウンロード