
非破壊型検出器。XCP-ng 8.3 Dom0 における CVE-2026-31431(Copy Fail)のローカル権限昇格を検出し、ページキャッシュ破損テストを通じてカーネルの脆弱性を検証します。
CVE-2026-31431(「Copy Fail」)向けの安全で非破壊的な検出スクリプトです。XCP-ng 8.3 LTS(2026年5月5日のセキュリティ更新前)で検証済みです。
⚠️ 許可された用途のみ。 このスクリプトは、所有しているシステム、または明示的にテストを許可されたシステムでのみ実行してください。
CVE-2026-31431(通称「Copy Fail」)は、Linuxカーネルのalgif_aead暗号化インターフェースにおけるローカル権限昇格(LPE)の脆弱性です。2017年に導入されたauthencesnテンプレートの論理的な欠陥により、権限のないローカルユーザーが、読み取り可能な任意のファイルのカーネルページキャッシュに対して制御された4バイト書き込みを実行でき、rootへの権限昇格が可能になります。
a664bf3d603dXCP-ngのDom0制御ドメインはLinuxカーネル上で動作し、ハイパーバイザーの管理層です。Dom0へのシェルアクセスを持つ権限のないユーザー(CI/CDパイプライン、監視エージェント、バックアップツール、自動化のために作成されたサービスアカウントを含む)は、この脆弱性を悪用してrootを取得できます。Dom0でrootを取得すると、そのホスト上のすべてのゲストVMが侵害されます。
デフォルトのXCP-ngインストールでは、非rootユーザーとして実行されるプロセスが非常に少ないため、露出は最小限です。実際のリスクは、オペレーターがシェルアクセスを制限せずに正当な目的でサービスアカウントを追加するにつれて、時間とともに蓄積されます。
Dom0のサービスアカウントを監査します:
awk -F: '$7 ~ /bash|sh/' /etc/passwd
これはラボラトリ検出器であり、権限昇格ツールではありません。以下のことを行います:
algif_aead / authencesnページキャッシュスクラッチ書き込みプリミティブのトリガーを試みますシステムバイナリ、/etc/passwd、その他のシステムファイルには一切触れません。 ページキャッシュの破損はメモリ内のみで発生し、ディスクへの書き戻しは行われません。
os.spliceに必要)python3 xcp_ng_cve_2026_31431_tester.py
| コード | 意味 |
|---|---|
0 | 破損は観察されませんでした — システムはパッチ適用済み、またはalgif_aeadが無効化されている可能性があります |
1 | トリガーエラー — algif_aeadが利用できないか、ブロックされている可能性があります |
2 | 脆弱 — ページキャッシュの破損が確認されました |
注記: パッチ適用済みシステムでの終了コード
1は、スクリプトエラーではなく期待される動作です。authencesnがカーネルレベルで無効化されている場合(XCP-ng 5月5日の修正のように)、ソケットバインドは失敗し、スクリプトはコード1で終了します。
| 日付 | イベント |
|---|---|
| 2026年4月29日 | CVE-2026-31431が公開開示 |
| 2026年5月4日 | VATESがVSA-2026-013を公開 |
| 2026年5月5日 | XCP-ng 8.3 LTS 5月セキュリティ更新リリース — カーネル修正が利用可能 |
XCP-ngホストを更新して再起動します:
yum update
reboot
再起動後、更新されたカーネルが実行されていることを確認します:
uname -r
パッチ適用後にこの検出スクリプトを再実行します。パッチ適用済みシステムでは、脆弱なauthencesnテンプレートが利用できなくなるため、終了コード1(トリガーエラー)が返されます。
注記: XCP-ngの修正では、脆弱な
authencesnコンポーネントの削除に伴い、IPSec ESNサポートが無効化されます。ほとんどの環境では実質的な影響はありません。VATESは、適切な修正によりこの機能を将来のパッチで復元する可能性があると示しています。
緩和策を適用する前に、algif_aeadがモジュール(=m)としてコンパイルされているか、カーネルに組み込まれているか(=y)を確認します:
grep CONFIG_CRYPTO_USER_API_AEAD /boot/config-$(uname -r)
=m — モジュールベース。modprobeブラックリストが機能します=y — カーネルに組み込み。modprobeブラックリストは静かに失敗し、保護を提供しません=yのRHEL系カーネルの場合は、代わりにgrubbyブートパラメータを使用します:
grubby --update-kernel=ALL --args="initcall_blacklist=algif_aead_init"
reboot
このスクリプトは、rootsecdevの元の作品の修正派生版です。再配布前に上流リポジトリのライセンスを確認し、その条件に準拠して使用してください。
このスクリプトは、2026年5月5日時点でパッチ未適用のカーネルを実行しているXCP-ng 8.3 LTSで検証されました。まだ適用していない場合は、公式のVATESセキュリティ更新を直ちに適用してください。