
Ansibleプレイブックで、Debian/Ubuntu/RHELフリート全体にわたってCVE-2026-31431(Copy Fail)のカーネルコマンドライン緩和策を検出・適用します。読み取り専用の検出と冪等な適用に対応しています。
CVE-2026-31431(「Copy Fail」)に対するカーネルコマンドラインの緩和策を、Ansible を使用して Debian / Ubuntu / RHEL 系のフリート全体で検出・適用します。
この CVE は、Linux カーネルの algif_aead AF_ALG インターフェースにおけるローカル権限昇格の脆弱性です。www-data、mysql などのサービスアカウントや、RCE された Web アプリ内のプロセスを含む、権限のないローカルユーザーは、わずか数回の syscall で root に昇格できます。このバグは、2017 年以降に出荷されたすべての主要ディストリビューションに影響します。
-e apply_mitigation=true を指定して実行すると、汎用の緩和策(カーネルコマンドラインに initcall_blacklist=algif_aead_init を追加)を適用します。カーネルコマンドラインのブラックリストは、組み込み構成(RHEL 系)とモジュール構成(Debian/Ubuntu)の両方で機能します。これは、よく引用される modprobe blacklist algif_aead 回避策では対応できません。
algif_aead_init() は、起動時に暗号ソケットサブシステムへ aead AF_ALG アルゴリズムを登録するカーネル関数です。コマンドラインパラメータ initcall_blacklist=algif_aead_init は、カーネルにその initcall をスキップするよう指示します。脆弱なコードは依然としてカーネルバイナリ内に存在しますが、socket(AF_ALG, ..., "aead") は ENOENT を返すため、エクスプロイトの最初の syscall が失敗します。到達可能なサーフェスがなければ、権限昇格は発生しません。
ベンダーがパッチ適用済みカーネルを出荷し、そのカーネルで再起動した後は、緩和策は不要になり、削除できます。
# 1. 検出(読み取り専用)— ホストごとのステータスレポートを生成
ansible-playbook -i inventory check_cve_2026_31431.yml
# 2. まず単一ホストに緩和策をステージング(自動再起動なし)
ansible-playbook -i inventory --limit <ip-or-host> \
-e apply_mitigation=true check_cve_2026_31431.yml
# 3. 通常の仕組みでそのホストを再起動
# 4. 再検出し、「Mitigation active: yes」を確認
# 5. バッチ単位で残りのフリートに展開
脆弱なホストのレポートは次のようになります:
═══════════════════════════════════════════
Host: 192.168.1.42
Distro: Ubuntu 24.04
Kernel: 6.8.0-60-generic
Mitigation active: no
Mitigation staged: no
═══════════════════════════════════════════
⚠️ 192.168.1.42: CVE-2026-31431 mitigation is NOT active.
このレシピの対象外です。手動のワンライナー:
# Debian / Ubuntu
sudo sed -i 's/ initcall_blacklist=algif_aead_init//' /etc/default/grub
sudo update-grub
sudo reboot
# RHEL 系
sudo grubby --update-kernel=ALL --remove-args="initcall_blacklist=algif_aead_init"
sudo reboot
検出パスは厳密に読み取り専用です(uname、/proc/cmdline の読み込み、/etc/default/grub の読み込み、grubby --info=ALL)。プローブには failed_when: false を使用しているため、予期しない出力でもプレイが中断されることはありません。ignore_unreachable: true により、到達できないホストは実行を失敗させる代わりに、明確な「UNREACHABLE — treat as VULNERABLE」警告が表示されます。
適用パスは block/rescue でラップされているため、単一の不良ホストが残りの処理を止めることはありません。grub 編集は冪等であり、mitigation_staged でゲートされているため、再実行は no-op になります。
bash tests/run-checks.sh all
ステージ:lint(yamllint + ansible-lint)→ syntax(ansible-playbook --syntax-check)→ dry-run(-c local で localhost に対して --check モードでプレイブックを実行。検出パスと適用パスの両方)。同じスクリプトが、GitHub Actions マトリックスで debian:12、ubuntu:22.04、ubuntu:24.04、almalinux:9 コンテナに対して、すべての push と pull request で呼び出されます。
dry-run が検証しないこと:
update-grub を実行したり、再起動をトリガーしたりしません。/proc/cmdline は、コンテナではなくランナーホストの cmdline を表示するため、CI 出力の mitigation_active は意味がありません。CI はプレイブックがクリーンに実行されることを証明するだけで、ホストが緩和されていることを証明するものではありません。詳細は tests/README.md を参照してください。
脆弱性は Taeyang Lee(Theori) によって発見され、Xint Code Research Team によって完全なエクスプロイトチェーンに武器化されました。セキュリティコミュニティの注目を集めた功績は彼らにあります。このレシピは、彼らが推奨した緩和策を自動化するだけです。
Beerware。LICENSE を参照してください。要約:これは自由に使って構いません。もし会うことがあれば、ビールを一杯おごってください。
AESTECHNO — Hugues Orgitello — エレクトロニクス設計ハウス、フランス、モンペリエ。