
Ansibleプレイブックで、Linuxカーネルの`algif_aead`モジュールにおけるローカル権限昇格の脆弱性CVE-2026-31431(「Copy Fail」)を監査・緩和します。この脆弱性は2017年以降、主要なすべてのディストリビューションに影響します。
Linuxカーネル
algif_aead権限昇格 / メモリ破壊
Ansibleベースの監査・緩和プレイブック — 本番環境ですぐに実行可能
Copy Fail(CVE-2026-31431)は、Linuxカーネルの
algif_aead モジュール — AF_ALG暗号ソケットファミリーのユーザー空間向けAEADインターフェース — における脆弱性です。
AEADリクエストハンドラー内のカーネルの copy_*user パスに存在する欠陥により、
ローカルの非特権ユーザーが不正なソケットリクエストを細工することで、カーネルメモリを破壊したり権限を昇格したりすることが可能になります。
| フィールド | 詳細 |
|---|---|
| CVE ID | CVE-2026-31431 |
| ニックネーム | Copy Fail |
| コンポーネント | Linuxカーネル — algif_aead(net/socket.c、crypto/algif_aead.c) |
| 攻撃ベクトル | ローカル |
| 必要な権限 | 低(非特権ユーザー) |
| 影響 | カーネルメモリ破壊 / ローカル権限昇格 |
| パッチ適用状況 | アップストリームカーネルパッチ進行中 — 各ディストリビューションベンダーに確認してください |
algif_aeadがロードされておらず、オンデマンドでロードするユーザー空間ツールもない場合、 システムは即時のリスクはありません(監査ステップ1を参照)。
.
├── audit_algif_aead.yml # ステップ1 — 監査: ホストごとの露出を検出
├── mitigate_copyfail.yml # ステップ2 — 緩和: モジュールのアンロード + ブラックリスト登録
└── README.md # このドキュメント
community.general コレクション(ansible-galaxy collection install community.general)become: true(sudo)lsof がインストールされていること(通常はデフォルトで存在)inventory.ini はgitignore対象です — ローカルに留まり、リポジトリには決して到達しません。
inventory.ini.example は、全員が開始時に使用するコミット済みテンプレートです。
# クローンと準備
git clone https://github.com/your-org/copy-fail-CVE-2026-31431.git
cd copy-fail-CVE-2026-31431
cp inventory.ini.example inventory.ini
# inventory.ini を実際のホストで編集してから実行:
ansible-playbook -i inventory.ini audit_algif_aead.yml
インフラストラクチャデータの漏洩を防ぐため、以下のパスはgitignore対象です:
何かに触れる前に監査プレイブックを実行してください。ホストごとの証拠を収集し、 ローカルと各ターゲットの両方にレポートを書き込みます。
ansible-playbook -i inventory.ini audit_algif_aead.yml
レポートは ./copyfail_reports/<hostname>_audit.txt に取得されます。
| 条件 | 推奨アクション |
|---|---|
| モジュールがロードされていない | 即時のリスクは低い — カーネルパッチを監視 |
| モジュールがロード済み、AF_ALGソケットユーザーなし | 緩和策の適用は安全 |
| モジュールがロード済みかつAF_ALGユーザーがアクティブ | 緩和策を適用する前にプロセスを確認 |
| 緩和ファイルがすでに存在する | 緩和策は以前に適用済み — 検証 |
最初に監査を実行してください。 緩和プレイブックは冪等に実行しても安全ですが、 監査によって証跡が得られます。
ansible-playbook -i inventory.ini mitigate_copyfail.yml
ansible-playbook -i inventory.ini mitigate_copyfail.yml \
-e '{"skip_hosts": ["db-prod-01", "hsm-node-02"]}'
install algif_aead /bin/false を含む /etc/modprobe.d/disable-algif.conf を作成algif_aead モジュールをアンロード(初期保護に再起動は不要)update-initramfs、RHELでは dracut --force)/var/backup/copyfail_mitigation/mitigation.log に書き込むメモリからモジュールを削除するために再起動は不要です。
ブラックリストが有効になることを確認し、緩和後のクリーンな状態を確立するために 再起動を推奨します。
プレイブック完了後、任意のターゲットホストで検証します:
# モジュールが表示されないこと
lsmod | grep algif_aead
# ブラックリストファイルが存在し、install行が含まれていること
cat /etc/modprobe.d/disable-algif.conf
# 手動ロードが拒否されること
sudo modprobe algif_aead # 期待: FATAL: Module algif_aead not found or refused
ベンダーがパッチ適用済みカーネルをリリースし、それを適用したら:
# 各ホストで — ブラックリストを削除
sudo rm /etc/modprobe.d/disable-algif.conf
# initramfsを再構築
sudo update-initramfs -u # Debian / Ubuntu
sudo dracut --force # RHEL / CentOS / Amazon Linux
# パッチ適用済みカーネルで再起動
sudo reboot
algif_aead ソースMIT License の下で公開されています。
自己責任で使用してください。本番システムに適用する前に、必ずステージング環境で検証してください。
コミュニティによって保守されています。PRと問題報告を歓迎します。
| ディストリビューション | 影響を受けるバージョン | ステータス |
|---|
| Ubuntu 22.04 / 24.04 | パッチ適用済みリリース未満のカーネル | パッチ保留中 — Ubuntu USNを確認 |
| Debian 12(Bookworm) | パッチ適用済みリリース未満のカーネル | パッチ保留中 |
| RHEL / AlmaLinux / Rocky 8 & 9 | パッチ適用済みリリース未満のカーネル | パッチ保留中 |
| Amazon Linux 2 / 2023 | パッチ適用済みリリース未満のカーネル | パッチ保留中 |
| 汎用アップストリーム | algif_aead が組み込まれている、または自動ロードされる | モジュールが存在する場合は脆弱 |
| サブシステム | このCVEの影響を受けるか? | 緩和策の影響を受けるか? |
|---|
| dm-crypt / LUKS | いいえ | いいえ |
| kTLS | いいえ | いいえ |
| IPsec / StrongSwan | いいえ | いいえ |
| OpenSSL(デフォルトビルド) | いいえ | いいえ |
| GnuTLS / NSS | いいえ | いいえ |
| OpenSSH | いいえ | いいえ |
| OpenSSL afalgエンジン | 可能性あり | はい — 適用前に確認が必要 |
kcapi-enc / kcapi-dgst ツール | はい | はい |
| Gitignore対象パス | 理由 |
|---|
inventory.ini | 実際のホスト名 / IP |
inventories/ | ローカルのインベントリディレクトリ |
copyfail_reports/ | 監査出力にカーネルバージョン、プロセスリストが含まれる |
.vault_pass | Ansible Vaultパスワードファイル |
*.retry | Ansibleリトライアーティファクト |
| チェック | コマンド | 判定 |
|---|
| カーネルバージョン | uname -r | 情報提供用 |
| モジュールがロードされているか? | lsmod | grep algif_aead | ロード済み = 露出リスク |
| アクティブなAF_ALGソケット | lsof | grep AF_ALG | ユーザーが見つかった = 確認必須 |
| OpenSSL afalgエンジン | openssl engine | grep afalg | アクティブ = 影響を確認 |
| kcapiツールの存在 | which kcapi-* | 存在する = 潜在的なユーザー |
| 緩和策がすでに適用されているか | stat /etc/modprobe.d/disable-algif.conf | 存在する = すでに緩和済み |