
CVE-2026-31431(Copy Fail)の検出スクリプト。カーネルバージョン、パッチの有無、カーネル設定、AF_ALGソケットの利用可能性、setuidバイナリ、および緩和策をチェックし、Linuxシステム上の脆弱性ステータスを判定します。
検出のみ。動作するPoCは既に copy.fail/#exploit に存在します。 このスクリプトは、システム管理者やセキュリティチームが、自環境が脆弱なのか、あるいはパッチ適用後も依然として脆弱なのかを判断するためのものです。
2026年4月29日、Copy Fail(CVE-2026-31431)と呼ばれる脆弱性がXint Code Research Teamによって公開されました。これは、およそ2017年からLinuxカーネルに静かに存在していたロジックバグで、約10年にわたり、特権のないローカルユーザーなら誰でもrootを取得できるものです。
「特定の条件下で運と追い風があればrootを取得できる」という話ではありません。単に…rootを取得できます。確実に。ほぼすべての主要なLinuxディストリビューションで。
Ubuntu、Amazon Linux、RHEL、SUSE、その他過去約8年間のメインストリームカーネルを実行しているあらゆる環境に影響します。同じスクリプトで、再コンパイルも、ディストリビューションごとの調整も不要です。
ええ、聞こえている通り深刻です。
Linuxカーネルには、AF_ALGソケットを介して特権のないユーザーがアクセスできる暗号サブシステムがあります。splice()と呼ばれるメカニズムがあり、ファイルデータをコピーせずにそのサブシステムに直接送り込むことができます。つまり、ファイルのカーネルメモリ内キャッシュコピー(「ページキャッシュ」)が暗号操作の内部に入り込むことになります。
特定のアルゴリズム — IPsec拡張シーケンス番号に使用される authencesn — には、出力バッファをスクラッチ領域として使用し、本来の位置からわずかに4バイト超過して書き込むという癖があります。通常は無害です。しかし、/usr/bin/su のようなsetuidバイナリのページキャッシュページが(2017年の algif_aead.c の「最適化」により)その出力バッファに連結されると、その4バイトがカーネルのキャッシュされたバイナリコピーに直接書き込まれます。
操作はエラーで失敗します。カーネルはそのページをダーティとしてマークしません。ディスク上のファイルは変更されません。ディスク上のチェックサムを検証するファイル整合性ツールは何も問題を検出しません。
しかし、実行されるのはページキャッシュです。そして su はsetuid rootです。
完全な技術解説は xint.io にあり、一読の価値があります。
オリジナルリリースの7項目に加え、検出のギャップを埋めるための新しいチェックが6項目追加されています:
Bashスクリプトは同じコア検出ロジックをカバーしますが、Python固有の3項目を省略しています:
シェルスクリプトにない項目(Python版との比較):
| 欠落しているチェック | 理由 |
|---|---|
| CONFIG_CRYPTO_USER_API_AEAD | 未実装 — 計画中 |
| Python os.spliceの利用可能性 | シェルスクリプトには該当しない |
| rootユーザー警告 | 未実装 — 計画中 |
どちらのスクリプトも何かを修正したり、エクスプロイトしたりするものではありません。システムの真実を伝え、それに基づいて行動できるようにするためのものです。
# スクリプトをクローンまたはダウンロードしてから:
python3 cve-2026-31431-detect.py
これだけです。色分けされたレポートと最後にサマリーが表示されます。
スクリプトは脆弱な検出結果がある場合に非ゼロのコードで終了し、パイプラインでの使用に適しています:
| コード | 意味 |
|---|---|
0 | 脆弱な条件が見つからない |
1 | 1つ以上の脆弱な条件が見つかった |
# 例: ホストが脆弱な場合にCIステップを失敗させる
python3 cve-2026-31431-detect.py
rc=$?
if [ $rc -eq 1 ]; then
echo "VULNERABLE — デプロイをブロック"
elif [ $rc -ne 0 ]; then
echo "ERROR — スクリプトが完了しませんでした (exit $rc)"
fi
CVE-2026-31431 'Copy Fail' — 脆弱性検出
authencesn ページキャッシュ破損 / ローカル権限昇格
uid=1001, euid=1001 として実行中
=== カーネルバージョン ===
[VULNERABLE] カーネルバージョン
理由 : カーネルが脆弱な範囲(4.10 – 6.14)に該当
詳細 : リリース: 6.12.0-124.45.1.el10_1 — パッチ状態を確認する必要があります
=== CONFIG_CRYPTO_AUTHENC (カーネル設定) ===
[VULNERABLE] CONFIG_CRYPTO_AUTHENC
理由 : モジュールとしてビルド(=m): AF_ALG bind() で自動ロード。modprobeブラックリストが正しい緩和策です
=== CONFIG_CRYPTO_USER_API_AEAD (カーネル設定) ===
[VULNERABLE] CONFIG_CRYPTO_USER_API_AEAD
理由 : AF_ALG AEADインターフェースはロード可能なモジュール — 特権のないユーザーはAF_ALGソケットを介して暗号サブシステムにアクセスできます
...
システムはCVE-2026-31431に対して脆弱である可能性が高いです
推奨アクション:
1. CVE-2026-31431に対するディストリビューションのカーネルアップデートを適用
2. パッチ適用までの間、モジュールをブラックリスト化:
echo 'install algif_aead /bin/false' > /etc/modprobe.d/disable-algif-aead.conf
rmmod algif_aead 2>/dev/null
注: これはCONFIG_CRYPTO_AUTHENC=m(モジュール)の場合にのみ有効です。
CONFIG_CRYPTO_AUTHENC=y(組み込み)の場合、パッチ適用のみが唯一の修正方法です。
Pythonが存在しない環境や、シェルネイティブのツールが好まれる環境向けに、コンパニオンのBashスクリプト(cve-2026-31431-detect.sh)が用意されています。13項目中10項目のチェックを実行します — 相違点の詳細は上記のチェック比較表を参照してください。
# 基本実行
bash cve-2026-31431-detect.sh
# JSON出力 — SIEM取り込み、Ansibleファクト、ログ集約に適しています
bash cve-2026-31431-detect.sh --json > scan-results.json
# クワイエットモード — サマリーのみ出力(CIログで有用)
bash cve-2026-31431-detect.sh --quiet
# ANSIカラー無効化(ログファイル用)
bash cve-2026-31431-detect.sh --no-colour
シェルスクリプトは同じ終了コード(0 = OK、1 = 脆弱)を使用し、パイプライン消費用の同等のJSON出力を生成します。システムにPython 3が利用可能な場合、シェルスクリプトはそれを使用してライブのAF_ALGソケットテストを実行します。それ以外の場合はカーネル設定の推論にフォールバックします。
本当の修正はカーネルのパッチ適用です。 ディストリビューションのセキュリティアドバイザリを確認してください。
| ディストリビューション | 確認先 |
|---|---|
| Ubuntu | ubuntu.com/security/CVE-2026-31431 |
| RHEL / Amazon Linux | dnf update kernel |
| SUSE |
CONFIG_CRYPTO_AUTHENC チェックが =m(組み込みではなくモジュールとしてビルド)と報告する場合、ブラックリスト化できます:
echo 'install algif_aead /bin/false' > /etc/modprobe.d/disable-algif-aead.conf
rmmod algif_aead 2>/dev/null
重要: この緩和策は
CONFIG_CRYPTO_AUTHENC=y(組み込み)の場合、効果がありません。その場合、カーネルのパッチ適用が唯一の修正方法です。スクリプトのCONFIG_CRYPTO_AUTHENCチェックで、どちらの状況にあるかがわかります。CONFIG_CRYPTO_AUTHENCが正しいカーネル設定キーであることに注意してください — 単一のオプションからauthencとauthencesnの両方のモジュールがビルドされます。
IPsecを使用している場合、これに影響を受ける可能性があります — フリート全体に展開する前に確認してください。
アップストリームの修正はこのコミットです — algif_aead.c の2017年のインプレースAEAD最適化を元に戻し、ソースと宛先のscatterlistを分離することで、ページキャッシュページが書き込み可能な宛先に入り込めないようにします。
Dockerコンテナ、Kubernetesポッド、その他のコンテナ環境内でこれを実行している場合、スクリプトは警告します:コンテナはホストカーネルを共有します。脆弱性はカーネルに存在し、コンテナイメージにはありません。ホストを評価してパッチを適用する必要があります。
# GitHub Actions
# スクリプトが1で終了すると、ステップは自然に失敗しパイプラインをブロックします。
# 追加設定は不要 — 非ゼロの終了コードはデフォルトでステップを失敗させます。
- name: CVE-2026-31431のチェック
run: |
python3 cve-2026-31431-detect.py
rc=$?
if [ $rc -eq 1 ]; then
echo "VULNERABLE — パイプラインがブロックされました"
exit 1
elif [ $rc -ne 0 ]; then
echo "ERROR — 検出スクリプトが完了しませんでした (exit $rc)"
exit $rc
fi
# Ansible
# playbook_dirを使用してスクリプトパスが正しく解決されるようにします。
# failed_whenは非ゼロの終了(脆弱性またはスクリプトエラー)をチェックします。
- name: CVE-2026-31431のチェック
script: "{{ playbook_dir }}/cve-2026-31431-detect.py"
register: cve_check
failed_when: cve_check.rc != 0
# Nagios / 監視チェック(シェルスクリプト — 終了コードをネイティブにサポート)
bash cve-2026-31431-detect.sh --quiet
# exit 0 = OK、exit 1 = CRITICAL(脆弱)
# SIEM / ログ集約用のJSON出力(シェルスクリプト)
bash cve-2026-31431-detect.sh --json --quiet > /var/log/cve-2026-31431-$(hostname)-$(date +%Y%m%d).json
TheoriのTaeyang Lee氏による当初の研究洞察、および完全な開示レポートを提供したXint Code Research Teamに感謝します。
誤検知を見つけましたか? 見逃しているディストリビューションがありますか? チェックすべきカーネル設定がありますか? PR歓迎です。目標は正確なシグナルであり、単なる恐ろしい赤いテキストではありません。
このツールは防御的なセキュリティ目的で現状のまま提供されます。評価を許可されたシステムに対してのみ使用してください。変な使い方はしないでください。
| # | チェック | 確認内容 |
|---|
| 1 | カーネルバージョン | このカーネルは影響範囲(4.10–6.14)に該当するか? |
| 2 | パッチの有無 | 修正コミットが実行中のカーネルに実際に含まれているか? |
| 3 | algif_aeadモジュール | 脆弱なモジュールがロードされているか、またはロード可能か? |
| 4 | CONFIG_CRYPTO_AUTHENC (新規) | CONFIG_CRYPTO_AUTHENC が組み込み(=y)かモジュール(=m)か? この単一オプションで authenc と authencesn の両方がビルドされます。組み込みの場合、modprobeブラックリストによる緩和策は効果がありません。 |
| 5 | CONFIG_CRYPTO_USER_API_AEAD (新規) | AF_ALG AEADユーザースペースインターフェースがコンパイルされているか? されていない場合、エクスプロイト経路全体がコンパイル時に閉じられています。 |
| 6 | AF_ALGソケット | 特権のないユーザーが今すぐソケットを開けるか? |
| 7 | Python os.splice | 純Pythonのエクスプロイト経路が利用可能か? |
| 8 | Setuidバイナリ | システム上に存在する読み取り可能なsetuid-rootターゲットの拡張リスト。 |
| 9 | 緩和策 | AppArmor、SELinux、seccomp — 何が導入されているか? |
| 10 | ユーザー名前空間 (新規) | 特権のないユーザー名前空間が有効か?(Copy Failを直接ブロックするものではありませんが、より広範なローカル権限昇格の攻撃面に影響します。) |
| 11 | Transparent hugepages (新規) | THPの状態 — ページキャッシュのアライメントとエクスプロイトの信頼性に影響する可能性があります。 |
| 12 | 環境検出 (新規) | Docker/コンテナ/VMコンテキスト — コンテナはホストカーネルを共有します。パッチが必要なのはホストです。 |
| 13 | rootユーザー警告 (新規) | rootとして実行している場合に警告します。特権のない制限に関係なく、いくつかのチェックはrootに対して誤検知を報告するためです。 |
| # | チェック | 備考 |
|---|
| 1 | カーネルバージョン | |
| 2 | パッチの有無 | |
| 3 | algif_aeadモジュール | |
| 4 | AF_ALGソケット | 利用可能な場合はPythonをヘルパーとして使用。それ以外はカーネル設定の推論にフォールバック |
| 5 | Setuidバイナリ | Python版と同じ拡張リスト |
| 6 | 緩和策 | AppArmor、SELinux、seccomp |
| 7 | CONFIG_CRYPTO_AUTHENC | |
| 8 | ユーザー名前空間 | |
| 9 | Transparent hugepages | |
| 10 | 環境検出 |
zypper update kernel-default |
| Debian | apt update && apt upgrade |
| 日付 | イベント |
|---|
| 2026-03-23 | Linuxカーネルセキュリティチームに報告 |
| 2026-03-24 | 受理 |
| 2026-03-25 | パッチが提案されレビュー |
| 2026-04-01 | メインラインカーネルに修正がコミット |
| 2026-04-22 | CVE-2026-31431が割り当て |
| 2026-04-29 | 公開開示 |