
依存関係ゼロのPython CLIで、LinuxホストがCVE-2026-31431(「Copy Fail」)に露出しているかどうかをエクスプロイトを実行せずにチェックします。 また、影響を受けるコンポーネントがカーネルモジュールとしてロード可能な場合、保守的な一時緩和策を適用することもできます。 Debian/Ubuntu、RHEL/Rocky/AlmaLinux、Fedora、SUSEに対応しています。
pip install copyfail-guard
copyfail-guard
CVE-2026-31431は、algif_aead(AF_ALG AEADソケット)カーネルインターフェースの論理バグで、非特権のローカルユーザーが任意の読み取り可能なファイルのページキャッシュに対して制御された4バイト書き込みを行い、root権限昇格につながるものです。
CVSS 7.8、カーネル4.14以降に存在し、2026年4月以降の安定版リリースで修正されました。
公開エクスプロイトが存在し、この脆弱性はCISA KEVに掲載されています。
一部の脆弱性チェックは「エクスプロイトを実行して動作するかどうかを確認する」というものです。 これは本番ホストで行うべきことではありません。 copyfail-guardは非エクスプロイト方式を採用しています。バグを発動させたり、setuidバイナリを変更したり、悪用可能性を証明したりすることはありません。代わりに、ホストの状態(カーネルバージョン、モジュールロード状態、modprobe設定)を検査し、マシンが露出しているように見えるかどうかを報告します。
fixは意図的に最小限です — パッケージマネージャーは呼び出しません。
恒久的な修復には、ディストリビューションの通常の更新メカニズムを通じてカーネルをアップグレードする必要があります。
pip install copyfail-guard
または、インストールせずにチェックアウトから直接実行:
PYTHONPATH=src python3 -m copyfail_guard detect
copyfail-guard [--json] [--dry-run] [--quiet] [detect | fix | reset]
$ copyfail-guard
[copyfail-guard] CVE-2026-31431 (Copy Fail) — VULNERABLE
Distribution: Ubuntu 24.04.1 LTS (debian family)
Kernel: 6.8.0-50-generic (branch 6.12, fixed at 6.12.85)
Module: algif_aead — loaded as .ko
Mitigation: none
Recommended actions:
1. Apply mitigation now:
sudo copyfail-guard fix
2. Update the kernel for a permanent fix:
Update the kernel on this system to 6.12.85 or later (whatever your
distribution ships once it has integrated the CVE-2026-31431 fix), then reboot.
適用する前に必ず--dry-runでプレビューしてください:
$ sudo copyfail-guard --dry-run fix
[copyfail-guard] fix (dry-run) — OK
[ ok ] Pre-flight checks (Linux, host, root)
[skip] Would write modprobe blacklist [/etc/modprobe.d/cve-2026-31431-copyfail-guard.conf]
[skip] Would attempt to unload algif_aead (not currently loaded) [algif_aead]
[skip] Would append audit record [/var/log/copyfail-guard.log]
$ sudo copyfail-guard fix
[copyfail-guard] fix — OK
[ ok ] Pre-flight checks (Linux, host, root)
[ ok ] Wrote modprobe blacklist [/etc/modprobe.d/cve-2026-31431-copyfail-guard.conf]
[ ok ] Unloaded algif_aead [algif_aead]
[ ok ] Appended audit record [/var/log/copyfail-guard.log]
Next step for a permanent fix:
Update the kernel to a CVE-2026-31431-patched version using your
distribution's normal update mechanism, then reboot.
モジュールが現在使用中の場合、アンロード手順が失敗する可能性があります。その場合でも、永続的なmodprobeルールは正常にインストールでき、copyfail-guardはアンロードの失敗を、モジュールが削除されたかのように装うのではなく、警告スタイルのアクションレコードとして報告します。
--jsonは、jq、Ansible、SOARパイプラインに適した構造化ドキュメントをstdoutに出力します:
$ copyfail-guard --json | jq .verdict
"vulnerable"
$ copyfail-guard --json | jq '{verdict, kernel: .kernel.patched_threshold}'
{
"verdict": "vulnerable",
"kernel": "6.12.85"
}
パッチ適用済みカーネルへのアップグレード後、resetサブコマンドを使用してfixによってインストールされたmodprobeルールを削除します:
$ sudo copyfail-guard --dry-run reset
[copyfail-guard] reset (dry-run) — OK
[skip] Would remove /etc/modprobe.d/cve-2026-31431-copyfail-guard.conf
$ sudo copyfail-guard reset
[copyfail-guard] reset — OK
[ ok ] Removed /etc/modprobe.d/cve-2026-31431-copyfail-guard.conf
Reboot to allow algif_aead to load again if needed.
resetは冪等です — ファイルがすでに存在しない場合、終了コード0で「何もすることはありません」というメッセージを出力します。その後、再起動してください。
コンテナ。 fixはコンテナ内での実行を拒否します。/proc/modulesはホストカーネルを反映しますが、コンテナにはモジュールをロードまたはアンロードする権限がないためです。copyfail-guardはホスト上で直接実行してください。
組み込みのalgif_aead。 一部のカーネルはalgif_aeadをイメージに直接コンパイルします(CONFIG_CRYPTO_USER_API_AEAD=y)。この構成ではmodprobeによる緩和策は効果がなく、唯一の修復方法はカーネルのアップグレードです。detectはこの場合unmitigable_builtinを報告します。fixを実行してもmodprobeルールはインストールされます(共存するロード可能なコピーのロードを防ぎます)が、組み込みインスタンスには影響しません — カーネルのアップグレードと再起動が唯一の実際の修復方法です。
blacklistとinstall … /bin/falseの比較。 どちらのディレクティブも通常の自動ロードをブロックしますが、install algif_aead /bin/falseは通常の明示的なmodprobe algif_aead呼び出しもブロックするため、より強力です。十分な権限を持つ管理者は、低レベルのモジュールロードツールや特別なmodprobeフラグを使用するなどして、modprobeポリシーを回避できます。copyfail-guardは常に強力な形式をインストールします。システムにすでにプレーンなblacklistディレクティブがある場合、ツールはmitigatedを報告しますが、アップグレードを推奨するメモを出力します。
SELinux/AppArmor。 RHELでの/etc/modprobe.d/への書き込みは、通常、親ディレクトリからsystem_u:object_r:modules_conf_t:s0を継承するため、copyfail-guardが書き込むファイルに対して手動の再ラベル付けは通常不要です。
initramfs。 algif_aeadは主要ディストリビューションのブートイメージには通常含まれないため、copyfail-guardはmodprobeルールのインストール後にupdate-initramfs -uやdracut -fを実行しません。ディストリビューションやローカルビルドがinitramfsにalgif_aeadを含める場合は、ディストリビューションのカーネル/モジュールガイダンスに従ってください。
Apache 2.0 — LICENSEを参照してください。
| サブコマンド | 動作 |
|---|
detect | 5つのシグナル(カーネルバージョン、/proc/modules、modules.builtin、modules.dep、modprobe設定)を組み合わせて、6つの判定結果のいずれかを出力します |
fix | install algif_aead /bin/false というmodprobeルールを原子的に書き込み、algif_aeadのアンロードを試みます |
reset | fixによってインストールされたmodprobeルールを削除します(パッチ適用済みカーネルへのアップグレード後に実行) |
| コード | 意味 |
|---|
0 | 安全 — 判定結果がpatched、mitigated、またはnot_applicableの場合、または永続的な修正手順が成功した場合 |
1 | 脆弱 — 判定結果がvulnerableまたはunmitigable_builtinの場合 |
2 | エラー — 状態を判定できなかった、前提条件が拒否された、または永続的な修正手順が失敗した場合 |
| 判定結果 | 説明 |
|---|
patched | 実行中のカーネルが修正版以上である |
mitigated | カーネルは脆弱だが、algif_aeadがmodprobe設定によってブロックされている |
not_applicable | カーネルは脆弱だが、algif_aeadがこのシステムに存在しない |
vulnerable | カーネルは脆弱で、モジュールがロード可能で、緩和策が適用されていない |
unmitigable_builtin | algif_aeadがカーネルイメージに組み込まれている — modprobeによる緩和策は効果がなく、カーネルのアップグレードが必要 |
unknown | カーネルバージョンを解析できないか、評価対象範囲外である |