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

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

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

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

ツールディレクトリ

カテゴリ

すべてのカテゴリを見る
Loading categories
copy_fail — Rust製のLinuxカーネルLPE CVE-2026-31431(AF_ALGページキャッシュ書き込み)向けエクスプロイトPoC。さらに、再起動不要でLSMまたはkprobeを介してAF_ALGソケット作成をブロックするeBPFランタイム防御も含む。 | Kitploit
ツール/GitHubGitHub/spensercai/copy_fail
防御ツール特権昇格エクスプロイトフレームワーク脆弱性分析エクスプロイトセキュリティ仮想化バイナリエクスプロイト
GitHubspensercai/copy_fail

copy_fail

Rust製のLinuxカーネルLPE CVE-2026-31431(AF_ALGページキャッシュ書き込み)向けエクスプロイトPoC。さらに、再起動不要でLSMまたはkprobeを介してAF_ALGソケット作成をブロックするeBPFランタイム防御も含む。

リポジトリを見る
33ヶ月前未レビュー

人気

すべて見る →

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

すべてのツールを探索

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

すべてのツールを見る →
共有
ウェブサイト

Copy Fail — CVE-2026-31431

CVE-2026-31431(Copy Fail)は、Linuxカーネルのalgif_aeadモジュール(AF_ALGサブシステム)におけるローカル権限昇格の脆弱性です。2017年8月に導入されたロジックの欠陥により、権限のないローカルユーザーがAF_ALGとsplice()を介して、読み取り可能な任意のファイルのページキャッシュに4バイトの制御データを書き込むことができ、その後、破損したsetuidバイナリを実行してroot権限を取得できます。このエクスプロイトは決定的です — レースコンディションなし、カーネルオフセット不要、システムクラッシュなし。カーネル4.14から7.0-rcまでを搭載する主要なLinuxディストリビューションすべてに影響します。

CVSS: 7.8 | 修正バージョン: カーネル7.0、6.19.12、6.18.22 | メインライン修正: コミットa664bf3d603d

ソース: copy.fail、The Hacker News、CloudLinuxアドバイザリ

プロジェクト構造

root@kitploit:~
crates/
├── exp/                            # エクスプロイトPoC(Rustによる再実装)
├── copy_fail_guard/                # ユーザースペースeBPFローダー — LSMモード
├── copy_fail_guard-ebpf/           # eBPF LSMプログラム(ワークスペース外)
├── copy_fail_guard_kprobe/         # ユーザースペースeBPFローダー — kprobeモード
└── copy_fail_guard_kprobe-ebpf/    # eBPF kprobeプログラム(ワークスペース外)
scripts/
└── build_guard.sh                  # ワンクリックビルド → dist/に出力

脆弱性の概要

根本原因は、3つの独立したカーネル機能が安全でない形で連鎖的に相互作用することです:

  1. AF_ALGソケット — カーネルの暗号APIを権限のないユーザースペースに公開
  2. splice() — ファイルデータをコピーではなくページキャッシュ参照として暗号scatterlistにゼロコピー転送
  3. authencesn AEADテンプレート — 呼び出し元の出力バッファをスクラッチ領域として使用し、dst[assoclen + cryptlen]に4バイトを書き込む

2017年、algif_aead.c(72548b093ee3)のインプレース最適化によりreq->src == req->dstとなり、ページキャッシュページが書き込み可能な宛先scatterlistに連結されました。authencesnがスクラッチバイトを書き込む際、出力バッファを越えて連結されたページキャッシュページにまで到達します。攻撃者は以下を制御できます:

  • 対象ファイル: 現在のユーザーが読み取り可能な任意のファイル
  • 対象オフセット: spliceオフセット、splice長、assoclenによって決定
  • 4バイトの内容: sendmsg()で設定されるAADバイト4〜7(seqno_lo)から取得

破損したページはダーティとしてマークされません — ディスク上のファイルは変更されませんが、execve()はページキャッシュから読み取ります。setuidバイナリを破損 → root権限取得。

crates/exp — エクスプロイトPoC

公開されている732バイトのPython PoCのRustによる再実装です。/usr/bin/suをターゲットにし、そのページキャッシュページをAF_ALG AEADソケットにスプライスし、圧縮されたシェルペイロードで上書きします。

ビルド

Rust 1.85+(edition 2024)が必要です。

root@kitploit:~
cargo build --release -p copy_fail

このバイナリはLinux専用です。他のプラットフォームではUnsupportedエラーで終了します。

実行

警告: これは実際のカーネル欠陥を悪用します。自分が所有・管理するシステムでのみ実行してください。理想的には使い捨てのVMが推奨されます。

  1. 脆弱なカーネル(カーネル< 7.0 / < 6.19.12 / < 6.18.22の一般的なディストリビューション)を実行するVMを起動します。

  2. ビルドしたバイナリをVMにコピーし、非rootユーザーとして実行します:

    root@kitploit:~
    ./target/release/copy_fail
    
  3. 脆弱な場合: rootシェル(#)が表示されます。whoamiを実行してrootを確認します。

  4. 脆弱でない場合(パッチ適用済みカーネル): AF_ALG操作が失敗するか、suバイナリが正常に動作します。エラーまたは通常のsuパスワードプロンプトが表示されます。

防御ツール — copy_fail_guard

カーネルのアップグレードや再起動なしでCVE-2026-31431をブロックするランタイムカーネル防御です。eBPFを使用してAF_ALGソケットの作成をインターセプトし、エクスプロイトの最初のステップを遮断します。

2つのモードが提供されています。ワンクリックローダーが利用可能な最適なモードを自動選択します:

動作原理

root@kitploit:~
┌──────────────────────────────────────────────────┐
│  run_guard.sh                                    │
│  • BPF LSMサポートを検出                         │
│  • LSM利用可能  → copy_fail_guard (EPERM)        │
│  • LSM利用不可 → copy_fail_guard_kprobe (KILL)   │
└──────────────┬───────────────────────────────────┘
               │
┌──────────────▼───────────────────────────────────┐
│  eBPFプログラム                                  │
│  if socket family == 38 (AF_ALG)                 │
│     → ブロック (EPERM または SIGKILL)            │
│  else                                            │
│     → 許可                                      │
└──────────────────────────────────────────────────┘

システムへの影響

AF_ALGのブロックは、一般的なシステムにほぼゼロの影響しか与えません:

  • 影響なし: dm-crypt/LUKS、kTLS、IPsec/XFRM、OpenSSL/GnuTLS/NSS(デフォルトビルド)、SSH、カーネルキーリング暗号 — これらはAF_ALGを介さず、カーネル内暗号APIを直接使用します
  • 影響の可能性あり: AF_ALGを使用するように明示的に設定されたアプリケーション(例: afalgエンジンが有効なOpenSSL、一部の組み込み暗号オフロードパス)
  • パフォーマンス: socket(AF_ALG, ...)を呼び出さないものにはゼロオーバーヘッド

ビルド

ワンクリックビルド(推奨):

root@kitploit:~
./scripts/build_guard.sh

これにより、不足しているツールチェーン(nightly、bpf-linker)が自動的にインストールされ、すべてのeBPFプログラムとユーザースペースローダーがコンパイルされ、すべてがdist/に出力されます:

root@kitploit:~
dist/
├── copy_fail_guard.bpf.o          # eBPF LSMプログラム
├── copy_fail_guard_kprobe.bpf.o   # eBPF kprobeプログラム
├── copy_fail_guard                 # ユーザースペースローダー(LSM)
├── copy_fail_guard_kprobe          # ユーザースペースローダー(kprobe)
└── run_guard.sh                    # 自動選択: sudo ./run_guard.sh

dist/ディレクトリを任意のターゲットマシンにコピーし、sudo ./run_guard.shを実行して保護を有効化します。

手動ビルド(ステップバイステップ):

ステップ1: eBPFプログラムをコンパイル(Linux上で実行する必要があります):

root@kitploit:~
# LSMバリアント
cd crates/copy_fail_guard-ebpf
cargo +nightly build --target bpfel-unknown-none -Z build-std=core --release

# kprobeバリアント
cd crates/copy_fail_guard_kprobe-ebpf
cargo +nightly build --target bpfel-unknown-none -Z build-std=core --release

ステップ2: ユーザースペースローダーをビルド:

root@kitploit:~
cargo build --release -p copy_fail_guard -p copy_fail_guard_kprobe

実行

推奨 — 最適なモードを自動選択:

root@kitploit:~
sudo ./dist/run_guard.sh

手動 — 特定のモードを実行:

root@kitploit:~
# LSMモード(lsm=bpfが必要)
sudo GUARD_BPF_OBJ=path/to/copy_fail_guard.bpf.o RUST_LOG=info ./copy_fail_guard

# kprobeモード(どこでも動作)
sudo GUARD_BPF_OBJ=path/to/copy_fail_guard_kprobe.bpf.o RUST_LOG=info ./copy_fail_guard_kprobe

Ctrl-Cを押すとeBPFプログラムがデタッチされ、通常の動作に戻ります。

防御の検証

一方のターミナルでガードを実行中に:

root@kitploit:~
# 別のターミナルでエクスプロイトを試行:
./target/release/copy_fail
# LSMモード:   "error: Operation not permitted"
# kprobeモード: "已杀死" / "Killed"

# またはPythonで直接テスト:
python3 -c "import socket; socket.socket(38, 5, 0)"
# LSMモード:   PermissionError: [Errno 1] Operation not permitted
# kprobeモード: Killed

現在の制限事項

  • ホワイトリスト未対応 — 現在のバージョンは、すべてのユーザースペースAF_ALGソケット作成を無条件にブロックします。PID、cgroup、コマンド名による特定プロセスの除外メカニズムはありません。これは将来のバージョンで計画されています(eBPF HashMapマップ経由)。ほとんどのシステムではAF_ALGを使用するものはほとんどないため、問題ありません。
  • eBPFクレートはLinux上でbpf-linkerを使用して個別にコンパイルする必要があります(bpfel-unknown-noneをターゲットとするため、通常のワークスペースメンバーにはできません)。
  • 保護はローダープロセスが実行されている間のみ有効です。永続的な保護の場合は、systemdサービスとして実行してください。

BPF LSMの有効化(オプション、LSMモード用)

ほとんどのディストリビューションではBPF LSMはデフォルトで有効になっていません。よりクリーンなLSMモード(SIGKILLではなくEPERM)が必要な場合:

root@kitploit:~
# 現在のLSMを確認:
cat /sys/kernel/security/lsm

# "bpf"がない場合は追加:
sudo sed -i 's/^GRUB_CMDLINE_LINUX="\(.*\)"/GRUB_CMDLINE_LINUX="\1 lsm=lockdown,capability,yama,apparmor,bpf"/' /etc/default/grub
sudo update-grub && sudo reboot

kprobeモードはこの手順なしで動作します。

カーネル修正の検証

カーネルを≥ 7.0 / ≥ 6.19.12 / ≥ 6.18.22にパッチ適用後:

root@kitploit:~
# カーネルバージョンを確認
uname -r

# エクスプロイトを再実行 — rootシェルが生成されなくなります
./target/release/copy_fail

または、脆弱なモジュールが無効化されていることを確認:

root@kitploit:~
modinfo algif_aead | grep filename

# 組み込みの場合はinitcallをブラックリスト化(再起動が必要)
sudo grubby --update-kernel=ALL --args="initcall_blacklist=algif_aead_init"
sudo reboot
ツールをダウンロード
LSMモードkprobeモード
ブロック方法-EPERMを返す(ソケット作成拒否)SIGKILL(プロセス強制終了)
カーネル要件≥ 5.7、lsm=bpfブートパラメータ付き≥ 5.3、特別なパラメータ不要
有効化に再起動が必要場合による(lsm=bpfが未設定の場合)不要
フックポイントsocket_create LSMフック__sys_socket kprobe