依存関係が少なく軽量な Bash スクリプトで、Linux システムが Copy Fail ローカル権限昇格脆弱性(CVE-2026-31431)にさらされているかどうかを確認します。
このスクリプトは 読み取り専用 です。脆弱性を悪用することはなく、カーネルモジュールをロードすることも、システムを変更することもありません。
Copy Fail は、Linux カーネルの authencesn AEAD 暗号テンプレートにおける論理バグであり、ユーザー空間から AF_ALG(algif_aead)ソケットインターフェース経由で到達可能です。
| フィールド | 値 |
|---|---|
| CVE | CVE-2026-31431 |
| 開示日 | 2026-04-29 |
| CVSS v3.1 | 7.8 (High) |
| クラス | ローカル権限昇格 |
| 影響を受けるコンポーネント | crypto/authencesn + crypto/algif_aead |
| 導入時期 | 2017年(algif_aead.c におけるインプレースAEAD最適化) |
| メインライン修正 | コミット a664bf3d603d、2026-04-01 マージ |
権限のないローカルユーザーは、自分が読み取り可能な任意のファイルの ページキャッシュへの、決定論的で制御された 4 バイト書き込み を引き起こすことができます。公開されている概念実証(732 バイトの Python)は、このプリミティブを使用して setuid バイナリを上書きし、2017 年以降にリリースされたほぼすべての主流ディストリビューションで root を取得します。
2017 年以降に構築され algif_aead が有効なカーネルを搭載するすべての Linux ディストリビューションが影響を受けます。影響が確認されているファミリーは以下のとおりです。
# スクリプトをダウンロード
curl -fsSLO https://raw.githubusercontent.com/samanzamani/copy-fail-checker/main/check-copy-fail.sh
# 実行可能にする
chmod +x check-copy-fail.sh
# 実行する
./check-copy-fail.sh
またはリポジトリをクローン:
git clone https://github.com/samanzamani/copy-fail-checker.git
cd copy-fail-checker
./check-copy-fail.sh
スクリプトは root を必要としません。通常のユーザーとして実行すると、攻撃者が持つまさにそのコンテキストで攻撃対象領域を最も現実的に把握できます。
スクリプトは3つの独立したチェックを実行し、それらを統合して単一の判定を下します。
/etc/os-release と uname -r を読み取り、実行中のカーネルをディストリビューションのセキュリティチームが公開した公式の修正バージョンと比較します。現在のバージョンテーブルは以下をカバーしています:
ディストリビューションがテーブルにない場合、スクリプトは以下のランタイムチェックにフォールバックします。
algif_aead モジュールの状態スクリプトは何も変更せずに4つの項目を検査します:
lsmod)modinfo)/etc/modprobe.d、/usr/lib/modprobe.d、/run/modprobe.d で ブラックリストに登録されているか/boot/config-<uname> または /proc/config.gz で ビルトインされているかブラックリストに登録され、ロードされておらず、ビルトインでもない場合、パッチ未適用のカーネルでも攻撃対象領域は閉じられます。
AF_ALG ソケットの到達可能性最も信頼性の高いシグナルは、攻撃者が実際に確認するものです。スクリプトは小さな Python プローブ(socket.socket(AF_ALG, SOCK_SEQPACKET, 0) に続いて bind() で authencesn(hmac(sha256),cbc(aes)) AEAD テンプレートにバインド)を使用して、権限のないコンテキストから AF_ALG ソケットを作成およびバインドできるかどうかを確認します。プローブはソケットを作成、バインドし、すぐに閉じるため、悪用可能なものは残しません。
python3 がインストールされていない場合、プローブはスキップされ、判定はチェック1と2に依存します。
パイプライン、構成管理、またはフリートスキャンの場合は --json を渡します:
./check-copy-fail.sh --json
出力例:
{
"verdict": "vulnerable",
"distro_id": "ubuntu",
"distro_version_id": "24.04",
"kernel": "6.8.0-31-generic",
"patched_version": "",
"kernel_status": "unknown",
"module_loaded": 0,
"module_builtin": 0,
"module_available": 1,
"module_blacklisted": 0,
"af_alg_status": "reachable"
}
これが唯一の完全な修正です。更新後、新しいカーネルが実際に実行されるように 再起動 してください。
# Debian / Ubuntu
sudo apt update && sudo apt full-upgrade && sudo reboot
# RHEL / AlmaLinux / Rocky / CentOS Stream
sudo dnf clean metadata && sudo dnf upgrade && sudo reboot
# openSUSE / SLES
sudo zypper refresh && sudo zypper update && sudo reboot
# Amazon Linux 2023
sudo dnf upgrade --releasever=latest && sudo reboot
algif_aead を無効化すぐにパッチ適用済みカーネルに再起動できない場合は、脆弱なモジュールをブラックリストに登録します。これにより、合法的に AF_ALG AEAD 暗号を使用するアプリケーション(ほとんどのサーバーでは稀。ステージング環境で事前に確認)が壊れます。
# 再起動後もブラックリストを永続化
echo "install algif_aead /bin/false" | sudo tee /etc/modprobe.d/disable-algif-aead.conf
# 実行中のカーネルから即座にアンロード
sudo rmmod algif_aead 2>/dev/null || true
モジュールがビルトインの場合、ブラックリストは機能しませんが、initcall を無効にすることが可能です。再起動が必要です。
sudo grubby --update-kernel=ALL --args="initcall_blacklist=algif_aead_init"
sudo reboot
コンテナ化されたワークロードの場合は、seccomp プロファイルから AF_ALG ソケットファミリもブロックし、侵害されたコンテナがカーネル面に到達できないようにします。
== システム情報 ==
[INFO] ディストリビューション : Ubuntu 24.04.2 LTS (ubuntu 24.04)
[INFO] カーネル : 6.8.0-31-generic
== チェック 1/3 — カーネルバージョン ==
[WARN] ubuntu 24.04 のベンダー修正カーネルバージョンは記録されていません。
[WARN] 以下のランタイム緩和チェックにフォールバックします。
== チェック 2/3 — algif_aead カーネルモジュール ==
[WARN] algif_aead はロードされていませんが、オンデマンドで自動ロード可能です(ブラックリストが見つかりません)。
== チェック 3/3 — AF_ALG ソケットの到達可能性 ==
[VULN] AF_ALG ソケットはこの非特権コンテキストから到達可能です。
== 判定 ==
[VULN] このシステムは CVE-2026-31431 に対して脆弱である可能性があります。
[VULN] ベンダーカーネルアップデートを適用するか、一時的な緩和策として algif_aead をブラックリストに登録してください。
uname -r を信頼します。アウトオブツリーまたは再構築されたカーネルを実行している場合、バージョン比較は修正が実際にバックポートされたかどうかを反映しない可能性があります。AF_ALG に対して blocked_permission が報告されることがあります。ホストカーネル自体は依然として脆弱である可能性があります。MIT — 自由に使用、変更、配布してください。無保証です。
| ディストリビューション | 修正済みカーネル (≥) |
|---|
| AlmaLinux / RHEL / Rocky / CentOS 8 | 4.18.0-553.121.1.el8_10 |
| AlmaLinux / RHEL / Rocky / CentOS 9 | 5.14.0-611.49.2.el9_7 |
| AlmaLinux / RHEL / Rocky / CentOS 10 | 6.12.0-124.52.2.el10_1 |
| Ubuntu 26.04+ ("Resolute") | 影響なし |
| Ubuntu 18.04 – 25.10 | ローリングリリース、apt を参照 |
| Debian (全スイート) | ローリングリリース、DSA を参照 |
| 判定 | 終了コード | 意味 |
|---|
patched | 0 | 実行中のカーネルがベンダー修正バージョン以上です。 |
mitigated | 0 | AF_ALG がブロックされ、モジュールがロードされていません。 |
likely_mitigated | 0 | モジュールがブラックリストに登録されロードされていません。ライブプローブは不可能でした。 |
vulnerable | 1 | カーネルがパッチ未適用で、algif_aead / AF_ALG に到達可能です。 |
unknown | 2 | 判定に十分なシグナルがありません。潜在的に脆弱として扱ってください。 |
not_applicable | 3 | Linux 上で実行されていません。 |