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

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

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

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

ツールディレクトリ

カテゴリ

すべてのカテゴリを見る
Loading categories
Copy-Fail-CVE-2026-31431-Kubernetes-PoC — PoC: CVE-2026-31431のページキャッシュ破損と共有イメージレイヤーにより、完全に非特権な状態からコンテナエスケープを達成し、ノードレベルのコード実行へ至ります。Alibaba Cloud ACK、Amazon EKS、Google GKEで検証済み。 | Kitploit
ツール/GitHubGitHub/percivalll/copy-fail-cve-2026-31431-kubernetes-poc
特権昇格脆弱性分析エクスプロイトクラウドセキュリティ論文と研究学習と教育コンテナエスケープ
GitHubpercivalll/copy-fail-cve-2026-31431-kubernetes-poc

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

人気

すべて見る →

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

すべてのツールを探索

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

すべてのツールを見る →
共有

PoC: CVE-2026-31431のページキャッシュ破損と共有イメージレイヤーにより、完全に非特権な状態からコンテナエスケープを達成し、ノードレベルのコード実行へ至ります。Alibaba Cloud ACK、Amazon EKS、Google GKEで検証済み。

リポジトリを見る
184283ヶ月前Kitploit レビュー済み

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

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

中核となる攻撃プリミティブは次のとおりです:攻撃者が制御するコンテナとイメージレイヤーを共有する特権 DaemonSet は、コンテナエスケープのために武器化され得る。この PoC は具体例として kube-proxy を使用していますが、この手法はクラスター上の任意の特権ワークロードに一般化できます。

Alibaba Cloud ACK、Amazon EKS、Google GKE で検証済み — 非特権 Pod が特権 kube-proxy DaemonSet を介してホストファイルシステムに [*] success を書き込みます:

Alibaba Cloud ACK(カーネル 6.6.88)Amazon EKS(カーネル 6.12.79)Google GKE(カーネル 6.12.68)
ACKEKSGKE

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

Background

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

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

Attack Principle

この攻撃は、Kubernetes クラスターで一般的に共存する3つの特性を悪用します:

  1. カーネルページキャッシュの破損(CVE-2026-31431) — 非特権プロセスは、読み取り専用で開ける任意のファイルのメモリ内キャッシュページを上書きできます。
  2. イメージレイヤーの共有 — コンテナランタイム(containerd、CRI-O)は overlay ファイルシステムを使用しており、同一のイメージレイヤーはコンテナ間で同じページキャッシュページにマッピングされます。
  3. 特権 DaemonSet — 多くのクラスターは、昇格した権限(privileged: true、hostNetwork: true、広範なケーパビリティなど)を持つ DaemonSet を実行し、それらは定期的にイメージからバイナリを実行します。

これらの条件が揃うと、非特権 Pod は共有イメージレイヤー内のバイナリを破損させ、同じノード上の特権 DaemonSet がその破損したバイナリを昇格した権限で知らずに実行することになり、完全なノードレベルのコード実行が達成されます。

脆弱性の標的は kube-proxy に限定されません。 コンテナイメージが攻撃者制御のイメージとレイヤーを共有する任意の特権 DaemonSet(監視エージェント、CNI プラグイン、ログコレクター、セキュリティエージェントなど)が実行可能な標的です。

How It Works

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

1. Page-Cache Corruption via AF_ALG Splice Race

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

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

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

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

2. Cross-Container Propagation via Image Layer Sharing

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

攻撃者は、ターゲットの特権 DaemonSet と同じベースイメージを FROM として PoC イメージを構築します。両方のコンテナが同じ overlay lower-dir を共有するため、共有レイヤー内のバイナリは同一のページキャッシュページにマッピングされます。

非特権の PoC コンテナがバイナリのページキャッシュを破損すると、その破損は同じノード上の特権コンテナから即座に見えるようになります — コンテナ間通信は一切必要ありません。

3. Privileged Execution by the Target DaemonSet

特権 DaemonSet が次に(通常の動作サイクルを通じて)破損したバイナリを実行すると、カーネルは破損したページキャッシュページを読み込みます。攻撃者のペイロードは DaemonSet の完全な権限で実行されます — 以下を含む可能性があります:

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

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

Attack Flow Diagram

root@kitploit:~
┌──────────────────────────┐     ┌──────────────────────────┐
│   PoC Container          │     │   Privileged DaemonSet   │
│   (unprivileged)         │     │   (e.g. kube-proxy,      │
│                          │     │    monitoring agent, etc.)│
│  1. Open target binary   │     │                          │
│     (read-only)          │     │                          │
│                          │     │                          │
│  2. AF_ALG splice race   │     │                          │
│     corrupts page cache  │     │                          │
│          │               │     │                          │
└──────────┼───────────────┘     └──────────────────────────┘
           │                                  │
           ▼                                  │
  ┌─────────────────────┐                     │
  │  Kernel Page Cache   │                     │
  │                      │◄────────────────────┘
  │  Shared-layer binary │     3. DaemonSet executes the
  │  (CORRUPTED)         │        corrupted binary
  │  contains attacker's │        → loads corrupted pages
  │  payload bytes       │        → payload runs with
  └─────────────────────┘           DaemonSet's privileges

Validated Cloud Environments

この PoC は以下のマネージド Kubernetes プラットフォームで正常に検証されています:

Alibaba Cloud ACK

ACK PoC の結果

Amazon EKS

EKS PoC の結果

Google GKE

GKE PoC の結果

3つのケースすべてにおいて、非特権の PoC Pod が [*] success マーカーファイルをホストファイルシステムに正常に書き込み、特権 kube-proxy DaemonSet を通じたノードレベルのコード実行を証明しました。

完全なウォークスルー(イメージレイヤー分析、ビルド手順、デプロイ)については:

  • EKS: docs/eks-poc.md
  • GKE: docs/gke-poc.md

kube-proxy as a Concrete Example

この PoC は、Kubernetes クラスターで最も一般的な特権 DaemonSet の1つであるため、kube-proxy をターゲットとして使用します。3つのバリアントが用意されています:

  • デフォルト(ACK / アップストリーム): registry.k8s.io/kube-proxy:v1.35.2 を FROM としてビルド(Dockerfile を参照)
  • EKS: public.ecr.aws/eks-distro-build-tooling/eks-distro-minimal-base-iptables:2026-03-11-1773190710.2023 を FROM としてビルド(Dockerfile.eks を参照)
  • GKE: us-central1-artifactregistry.gcr.io/gke-release/gke-release/kube-proxy:v1.35.3-gke.1234000 を FROM としてビルド(Dockerfile.gke を参照)

すべてのバリアントは、/usr/sbin/ipset、/usr/sbin/nft、/usr/sbin/xtables-legacy-multi、/usr/sbin/xtables-nft-multi などのバイナリを破損させます。

重要な注意事項:

  • kube-proxy は ipvs モードで設定されている場合にのみ ipset を呼び出します。デフォルトモード(iptables)は ipset を使用しません。ipvs 廃止計画については kubernetes/enhancements#5495 を参照してください。
  • 一部のマネージド Kubernetes ディストリビューション(例: 特定のクラウドプロバイダー)は kube-proxy を非特権コンテナとして実行するため、エスケープの影響が制限されます。
  • PoC はさまざまなプロキシモードをカバーするために複数のバイナリ(ipset、nft、xtables-legacy-multi、xtables-nft-multi)をターゲットにしていますが、それらが呼び出されるかどうかはクラスター構成に依存します。

クラスター内で kube-proxy が特権を持っていない場合でも、攻撃の原理は依然として有効です — ビルド元にできるベースイメージとイメージレイヤーを共有する別の特権 DaemonSet を特定するだけで済みます。

Generalizing to Other Targets

この PoC を別の特権 DaemonSet に適合させるには:

  1. クラスター上で実行されている特権 DaemonSet を特定します(監視エージェント、CNI プラグイン、ログコレクターなど)。
  2. その DaemonSet が使用している同じベースイメージを FROM として PoC イメージをビルドします。
  3. 通常の動作中に DaemonSet が実行する共有レイヤー内のバイナリを特定します。
  4. エクスプロイトを使用してそれらのバイナリのページキャッシュを破損させます。

Repository Structure

root@kitploit:~
.
├── cmd/copyfail/main.go          # Entry point; embeds compiled payload
├── internal/
│   ├── exploit/
│   │   ├── exploit.go            # Core exploit: AF_ALG splice race loop
│   │   └── patch.go              # Splits payload into 4-byte patch windows
│   └── alg/
│       └── alg.go                # AF_ALG AEAD socket abstraction
├── payload/
│   ├── payload.c                 # ACK/upstream payload (mount /dev/vda3 ext4)
│   ├── payload-eks.c             # EKS payload (NVMe/Xen device auto-detection)
│   ├── payload-gke.c             # GKE payload (COS/Ubuntu device auto-detection)
│   └── nolibc/                   # Kernel's tiny libc for static, no-dependency payloads
├── deploy/
│   ├── poc.yaml                  # Kubernetes Deployment manifest (ACK/upstream)
│   ├── poc-eks.yaml              # EKS Deployment manifest
│   └── poc-gke.yaml              # GKE Deployment manifest
├── Dockerfile                    # ACK/upstream: FROM registry.k8s.io/kube-proxy
├── Dockerfile.eks                # EKS: FROM eks-distro-minimal-base-iptables
├── Dockerfile.gke                # GKE: FROM gke-release/kube-proxy
├── Makefile                      # Build orchestration (includes *-eks and *-gke targets)
└── docs/
    ├── eks-poc.md                # EKS PoC full walkthrough
    ├── gke-poc.md                # GKE PoC full walkthrough
    ├── ack-poc-res.png           # ACK validation screenshot
    ├── eks-poc-res.png           # EKS validation screenshot
    └── gke-poc-res.png           # GKE validation screenshot

Prerequisites

  • Go 1.25+
  • nolibc ペイロード用のクロスコンパイラ(デフォルト: x86_64-linux-gnu-gcc)
  • Docker / Buildx
  • PoC イメージとイメージレイヤーを共有する特権 DaemonSet を持つ Kubernetes クラスター(デフォルトの例は kube-proxy をターゲットにしています)
  • ターゲット DaemonSet の imagePullPolicy: IfNotPresent(Kubernetes のデフォルト)
  • CVE-2026-31431 の修正前の Linux カーネル

Building

ACK / アップストリーム Kubernetes

root@kitploit:~
# Build payload + Go binary
make build

# Build Docker image
make docker-build

# Build and push to GHCR
make docker-push IMAGE=ghcr.io/<you>/copy-fail-poc TAG=latest

Amazon EKS

root@kitploit:~
# Build EKS payload + Go binary + Docker image
make docker-build-eks

# Build and push to GHCR
make docker-push-eks IMAGE=ghcr.io/<you>/copy-fail-poc

arm64 ターゲット(Graviton)の場合:

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

Google GKE

root@kitploit:~
# Build GKE payload + Go binary + Docker image
make docker-build-gke

# Build and push to GHCR
make docker-push-gke IMAGE=ghcr.io/<you>/copy-fail-poc

arm64 ノードの場合:

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

Usage

Deploy the PoC

root@kitploit:~
# ACK / upstream Kubernetes
kubectl apply -f deploy/poc.yaml

# Amazon EKS
kubectl apply -f deploy/poc-eks.yaml

# Google GKE
kubectl apply -f deploy/poc-gke.yaml

この Deployment は単一の非特権 Pod を作成します。この Pod は:

  1. /bin/copyfail を実行して、共有イメージレイヤー内のターゲットバイナリのページキャッシュを破損させます。
  2. 観測のために Pod が実行され続けるよう、無期限にスリープします。

Verify the Escape

ターゲットの特権 DaemonSet が次に破損したバイナリを実行した後(kube-proxy の場合、通常は reconcile ループにより数秒以内に発生します)、ノードを確認します:

root@kitploit:~
# SSH into the node, or use a privileged debug pod

# ACK / EKS (writable root filesystem)
cat /root/res
# Expected output: [*] success

# GKE COS nodes (read-only root, writable stateful partition)
cat /mnt/stateful_partition/copyfail-res
# Expected output: [*] success

ホストファイルシステム上のマーカーファイルの存在は、攻撃者が用意したコードがノードレベルの権限で実行されたことを証明します — 特権 DaemonSet のコンテナコンテキスト内からです。

Clean Up

root@kitploit:~
kubectl delete -f deploy/poc.yaml      # or poc-eks.yaml / poc-gke.yaml

# On the affected node(s), remove the marker and restart the target DaemonSet:
rm -f /root/res                                     # ACK / EKS
rm -f /copyfail-res /mnt/stateful_partition/copyfail-res  # GKE COS nodes
# For kube-proxy: delete the pod to force image layer re-read
kubectl delete pod -n kube-system -l k8s-app=kube-proxy --field-selector spec.nodeName=<node>

Customizing the Payload

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

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

Affected Versions

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

Mitigation

  • カーネルにパッチを適用します。 これが決定的な修正です。
  • イメージレイヤーの分離を有効にします。 一部のランタイムは、ページキャッシュの共有を防ぐコンテナごとのファイルシステムスナップショットをサポートしています。
  • 特権 DaemonSet を最小限にします。 昇格した権限で実行されるワークロードの数を減らし、最小権限の原則を使用します。
  • privileged: true を厳密に必要としない DaemonSet から不要なケーパビリティを削除します。
  • Pod のスケジューリングを制限して、信頼できないワークロードが共有ベースイメージを持つ特権 DaemonSet を実行しているノードに配置されないようにします。
  • 特権ワークロードには異なるベースイメージを使用して、信頼できないコンテナとのレイヤー共有の可能性を減らします。

Mitigation Examples

  • vArmor 組み込みの緩和ルール: copy-fail-mitigation は、コンテナが AF_ALG ソケットを作成するのを防ぐことでエクスプロイトベクターをブロックします。このルールは AppArmor および BPF エンフォーサーで利用できます。
  • Kubernetes eBPF 緩和: iwanhae/copyfail-ebpf-k8s は、CVE-2026-31431 向けの eBPF ベースの Kubernetes 緩和例を提供します。

Credits

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

License

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

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

ツールをダウンロード
PropertyValue
プラットフォームAlibaba Cloud Container Service for Kubernetes (ACK)
Kubernetesv1.35.2
ノードカーネル6.6.88-4.2.alnx4.x86_64
kube-proxyregistry-cn-*.ack.aliyuncs.com/acs/kube-proxy:v1.35.2-aliyun.1
ベースイメージregistry.k8s.io/kube-proxy:v1.35.2(アップストリーム)
ルートデバイス/dev/vda3 (ext4)
PropertyValue
プラットフォームAmazon Elastic Kubernetes Service (EKS)
Kubernetesv1.35.4
ノードカーネル6.12.79-101.147.amzn2023.x86_64
kube-proxy***.dkr.ecr.***.amazonaws.com.cn/eks/kube-proxy:v1.35.3-eksbuild.2
ベースイメージpublic.ecr.aws/eks-distro-build-tooling/eks-distro-minimal-base-iptables:2026-03-11-1773190710.2023
ルートデバイス/dev/nvme0n1p1 (xfs)
PropertyValue
プラットフォームGoogle Kubernetes Engine (GKE)
Kubernetesv1.35.3-gke.1234000
ノード OSContainer-Optimized OS (COS) 125, BUILD_ID 19216.220.72
ノードカーネル6.12.68+ x86_64
kube-proxyus-central1-artifactregistry.gcr.io/gke-release/gke-release/kube-proxy:v1.35.3-gke.1234000
ベースイメージkube-proxy と同じ(GKE プロバイダー管理の Artifact Registry イメージ)
ルートデバイス/dev/dm-0(ext2、読み取り専用); /dev/sda1(ext4、書き込み可能なステートフルパーティション)
マーカーパス/mnt/stateful_partition/copyfail-res