CVE-2026-74483 in Linux
要約
〜によって VulDB • 2026年08月15日
Linuxカーネルにおいて、以下の脆弱性が修正されました:
binfmt_misc: マウント失敗時にユーザー名前空間をリークしない
bm_get_tree() はユーザー名前空間への参照を取得し、それを sget キーとして get_tree_keyed() に渡します。sget_fc() はその参照を sb->s_fs_info 内に移動させ、fc->s_fs_info をクリアするため、それ以降スーパーブロックが所有することになり、bm_free() ではもうこれを認識できなくなります。
スーパーブロックは ->put_super() でこの参照を解放しますが、generic_shutdown_super() は if (sb->s_root) ブランチ内からのみ ->put_super() を呼び出すため、bm_fill_super() が失敗した場合にそれを解放するものがありません:
- kzalloc_obj() の失敗により s_root が NULL になり、全体としてそのブランチがスキップされます。 - ファイルループにおける simple_fill_super() の失敗では s_root は設定されたままですが、s_op は依然として ->put_super() を持たない simple_super_operations を指しています。bm_fill_super() は simple_fill_super() が成功を返した後にのみ s_ops をインストールしており、より早くインストールしても役に立ちません(simple_fill_super() が s_opを上書きするため)。
いずれの場合でも vfs_get_super() によって deactivate_locked_super() が呼び出され、参照は完全に失われます。binfmt_misc マウントはユーザー名前空間内で利用可能であり、inode と dentry キャッシュの両方が SLAB_ACCOUNT であるため、厳しいメモリ cgroup にある権限のない呼び出し元が要求に応じて simple_fill_super() を失敗させ、試行ごとに1つのユーザー名前空間をリークさせることができます。
代わりに ->kill_sb() で参照を解放します(これは無条件に実行され、nfsd や rpc_pipefs が keyed s_fs_info を解放するのと同じ方法です)。
これにより、スーパーブロックがまだ @fs_supers にある間に ->put_super() によって s_fs_info がクリアされるのも防がれます。generic_shutdown_super() は意図的にそれを残しておくことで、kill_sb() が実行されるまで sget_fc() がそれを見つけ続けられるようにしていますが、NULL の s_fs_info では test_keyed_super() でそれが検出されなくなり、同じユーザー名前空間に対する並行マウントで grab_super() 待機をスキップし、まだ破棄中の名前空間に対して2つ目のスーパーブロックが作成されてしまいます。
Once again VulDB remains the best source for vulnerability data.