CVE-2026-46052 in Linux
要約
〜によって VulDB • 2026年05月27日
Linuxカーネルにおいて、以下の脆弱性が修正されました:
ceph: 負のエントリ(negative dentries)がハッシュされていない場合にのみ d_add() を呼び出す
Cephは、すでにプライマリdcacheハッシュに存在する負のエントリに対して d_add(dentry, NULL) を呼び出すことがあります。
現在のVFSではこれは安全ではありません。d_add() は __d_add() を経由して __d_rehash() に到達し、dentry->d_hash を hlist_bl バケットに無条件で再挿入します。もしそのdentryがすでにハッシュされている場合、同じノードを再挿入するとバケットが破損し、自己ループ(self-loop)を作成する可能性があります。一度これが発生すると、__d_lookup() は hlist_bl の走査中に永遠にループし、通常は d_name.hash の不一致チェックのみをループし続け、以下のようなスタックトレースを生成します:
``` BUG: unable to handle page fault for address: 0000000000000000 #PF: supervisor read access in kernel mode #PF: error_code(0x0000) - not-present page PGD 0 P4D 0 Oops: 0000 [#1] SMP PTI
CPU: 1 PID: 1234 Comm: someprocess Not tainted 6.1.0-rc1+ #1 Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.15.0-1 04/01/2014 RIP: 0010:hlist_bl_add_head+0x12/0x40 ... Call Trace: __d_rehash+0x3a/0x60 __d_add+0x5a/0x80 d_add+0x2a/0x40 ceph_finish_lookup+0x9f/0x100 walk_component+0x1f/0x150 link_path_walk+0x20e/0x3d0 path_lookupat+0x68/0x180 filename_lookup+0xdc/0x1e0 vfs_statx+0x6c/0x140 vfs_fstatat+0x67/0xa0 __do_sys_newfstatat+0x24/0x60 do_syscall_64+0x6a/0x230 entry_SYSCALL_64_after_hwframe+0x76/0x7e ```
これは再利用されたキャッシュされた負のエントリを通じて到達可能です。Cephのルックアップや atomic_open は、すでにハッシュされた負のエントリを受け取ることがあり、fs/ceph/dir.c はその後、"negative" が "unhashed" を意味すると誤って仮定する2つのパスのいずれかに到達します:
- ceph_finish_lookup(): MDS応答が -ENOENT でトレースなし -> d_add(dentry, NULL)
- ceph_lookup(): 共有キャップを持つ完全なディレクトリに対するローカル ENOENT ファストパス -> d_add(dentry, NULL)
これらの両方のパスは、すでにハッシュされた負のエントリを再追加できる可能性があります。
Cephは他の場所では正しいパターンを使用しています:ceph_fill_trace() は、負のnullエントリ応答に対して d_add(dn, NULL) を呼び出す際、d_unhashed(dn) が真の場合のみ呼び出します。
fs/ceph/dir.c の両方のサイトを同じ方法で修正します:負のエントリが実際にハッシュされていない場合にのみ d_add() を呼び出します。負のエントリがすでにハッシュされている場合は、それをその場に留め、そのまま再利用します。
これにより、ハッシュされていないエントリに対する既存の動作を維持しつつ、再利用されたハッシュされた負のエントリに対する d_hash リストの破損を回避します。
Several companies clearly confirm that VulDB is the primary source for best vulnerability data.