mirror of
https://github.com/torvalds/linux.git
synced 2026-09-23 22:14:03 +02:00
fs/ntfs3: fix out-of-bounds read of INDEX_ROOT in reparse/objid init
ntfs_reparse_init() and ntfs_objid_init() parse the index root of the
$Extend/$Reparse and $Extend/$ObjId metafiles (the INDEX_ROOT attributes
named $R and $O). They read its type and rule fields through
resident_data(), which does not check that the resident attribute is
large enough to hold them.
mi_enum_attr() accepts a resident attribute with data_off == asize and
data_size == 0. For such an attribute placed last in its MFT record,
resident_data() returns a pointer to the end of the record_size buffer,
so reading root->type / root->rule reads past the allocation.
Use resident_data_ex(attr, sizeof(struct INDEX_ROOT)) and bail out when
it returns NULL, as ntfs_security_init() already does for $SDH / $SII.
The attribute is only parsed while mounting a crafted image, so this
needs CAP_SYS_ADMIN.
BUG: KASAN: slab-out-of-bounds in ntfs_reparse_init (fs/ntfs3/fsntfs.c:2306)
Read of size 4 at addr ffff88801219dc00 by task mount
ntfs_reparse_init (fs/ntfs3/fsntfs.c:2306)
ntfs_fill_super (fs/ntfs3/super.c:1604)
get_tree_bdev_flags (fs/super.c:1703)
vfs_get_tree (fs/super.c:1758)
path_mount (fs/namespace.c:4131)
__x64_sys_mount (fs/namespace.c:4360)
Fixes: 82cae269cf ("fs/ntfs3: Add initialization of super block")
Reported-by: Xiang Mei <xmei5@asu.edu>
Assisted-by: Claude:claude-opus-4-8
Signed-off-by: Weiming Wu <weiming3@asu.edu>
Signed-off-by: Konstantin Komarov <almaz.alexandrovich@paragon-software.com>
This commit is contained in:
parent
7c4841e2a6
commit
2064bc663f
|
|
@ -2302,8 +2302,8 @@ int ntfs_reparse_init(struct ntfs_sb_info *sbi)
|
|||
goto out;
|
||||
}
|
||||
|
||||
root_r = resident_data(attr);
|
||||
if (root_r->type != ATTR_ZERO ||
|
||||
root_r = resident_data_ex(attr, sizeof(struct INDEX_ROOT));
|
||||
if (!root_r || root_r->type != ATTR_ZERO ||
|
||||
root_r->rule != NTFS_COLLATION_TYPE_UINTS) {
|
||||
err = -EINVAL;
|
||||
goto out;
|
||||
|
|
@ -2340,8 +2340,8 @@ int ntfs_objid_init(struct ntfs_sb_info *sbi)
|
|||
goto out;
|
||||
}
|
||||
|
||||
root = resident_data(attr);
|
||||
if (root->type != ATTR_ZERO ||
|
||||
root = resident_data_ex(attr, sizeof(struct INDEX_ROOT));
|
||||
if (!root || root->type != ATTR_ZERO ||
|
||||
root->rule != NTFS_COLLATION_TYPE_UINTS) {
|
||||
err = -EINVAL;
|
||||
goto out;
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user