Skip to content

Commit 0b1eeaf

Browse files
committed
efivarfs: Fix slab-out-of-bounds in efivarfs_d_compare
jira VULN-155159 jira VULN-155158 cve CVE-2025-39817 commit-author Li Nan <[email protected]> commit a6358f8 Observed on kernel 6.6 (present on master as well): BUG: KASAN: slab-out-of-bounds in memcmp+0x98/0xd0 Call trace: kasan_check_range+0xe8/0x190 __asan_loadN+0x1c/0x28 memcmp+0x98/0xd0 efivarfs_d_compare+0x68/0xd8 __d_lookup_rcu_op_compare+0x178/0x218 __d_lookup_rcu+0x1f8/0x228 d_alloc_parallel+0x150/0x648 lookup_open.isra.0+0x5f0/0x8d0 open_last_lookups+0x264/0x828 path_openat+0x130/0x3f8 do_filp_open+0x114/0x248 do_sys_openat2+0x340/0x3c0 __arm64_sys_openat+0x120/0x1a0 If dentry->d_name.len < EFI_VARIABLE_GUID_LEN , 'guid' can become negative, leadings to oob. The issue can be triggered by parallel lookups using invalid filename: T1 T2 lookup_open ->lookup simple_lookup d_add // invalid dentry is added to hash list lookup_open d_alloc_parallel __d_lookup_rcu __d_lookup_rcu_op_compare hlist_bl_for_each_entry_rcu // invalid dentry can be retrieved ->d_compare efivarfs_d_compare // oob Fix it by checking 'guid' before cmp. Fixes: da27a24 ("efivarfs: guid part of filenames are case-insensitive") Signed-off-by: Li Nan <[email protected]> Signed-off-by: Wu Guanghao <[email protected]> Signed-off-by: Ard Biesheuvel <[email protected]> (cherry picked from commit a6358f8) Signed-off-by: Jonathan Maple <[email protected]>
1 parent c8c2886 commit 0b1eeaf

File tree

1 file changed

+4
-0
lines changed

1 file changed

+4
-0
lines changed

fs/efivarfs/super.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,10 @@ static int efivarfs_d_compare(const struct dentry *dentry,
5151
{
5252
int guid = len - EFI_VARIABLE_GUID_LEN;
5353

54+
/* Parallel lookups may produce a temporary invalid filename */
55+
if (guid <= 0)
56+
return 1;
57+
5458
if (name->len != len)
5559
return 1;
5660

0 commit comments

Comments
 (0)