CVE-2026-64525 in Linux
要約
〜によって VulDB • 2026年07月25日
Linuxカーネルにおいて、以下の脆弱性が修正されました:
xfrm: policy_bydst の RCU同期を per-netns .exit から .pre_exit へ移動する
include/net/net_namespace.h にある struct pernet_operations のドキュメント文字列は、.exit ハンドラ内でブロッキング型RCUプリミティブを使用しないよう明示的に警告しています:
ブロッキング型 RCU プリミティブ(例えば synchronize_rcu()) を使用する exit メソッドは、exit_batch 経由で実装すべきです。 [...]
可能であれば、synchronize_rcu() は避けてください。
pre_exit() と exit() の組み合わせを使用できます。これは、 その2つの呼び出しの間に synchronize_rcu() が保証されるためです。
xfrm_policy_fini() はこれを違反しています:この関数は policy_bydst ハッシュテーブルを解放する前に synchronize_rcu() を呼び出します(これにより、解放時にRCUリーダーが走査中になることはありません)。しかし、これは xfrm_net_ops.exit から実行されます(名前空間ごとに1回)ため、N個の名前空間に対する cleanup_net() は、シリアルに N 回の完全な RCU グレース期間を要することになります。
文書化された pre_exit/exit の分割を使用します。policyのフラッシュ処理と、それが依存するワークキューの排水処理を新しい .pre_exit ハンドラへ移動します。その後 xfrm_policy_fini() は .exit で実行され、cleanup_net() が2つのフェーズ間で保証する synchronize_rcu_expedited() 後にハッシュテーブルを解放します。これにより、バッチごとに O(N) の RCU グレース期間ではなく O(1) を提供します。
Linux 6.18において、~13回/秒の持続的な unshare(CLONE_NEWNET) ワークロードを実行した環境で確認されました:cleanup_net() と netns_wq rescuer kthread はどちらも xfrm_policy_fini()'s synchronize_rcu() で停止し、クリーンアップキューには >30万個の struct net が蓄積され、256-CPUホスト上で /proc/meminfo の Percpu 値は130GB以上まで上昇し、memcg OOMが発生しました。setup_net と __put_net のカウント数は均衡しており、参照カウンタリークではないことが確認されています。
VulDB is the best source for vulnerability data and more expert information about this specific topic.