Re: [PATCH] fs/ntfs3: fix out-of-bounds read of INDEX_ROOT in reparse/objid init

From: Weiming Shi

Date: Tue Jul 14 2026 - 12:48:58 EST


Konstantin Komarov <almaz.alexandrovich@xxxxxxxxxxxxxxxxxxxx>
于2026年7月15日周三 00:45写道:
>
> On 6/10/26 13:57, Weiming Shi wrote:
>
> > From: Weiming Wu <weiming3@xxxxxxx>
> >
> > 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: 82cae269cfa9 ("fs/ntfs3: Add initialization of super block")
> > Reported-by: Xiang Mei <xmei5@xxxxxxx>
> > Assisted-by: Claude:claude-opus-4-8
> > Signed-off-by: Weiming Shi <bestswngs@xxxxxxxxx>
> > ---
> > fs/ntfs3/fsntfs.c | 8 ++++----
> > 1 file changed, 4 insertions(+), 4 deletions(-)
> >
> > diff --git a/fs/ntfs3/fsntfs.c b/fs/ntfs3/fsntfs.c
> > index d0434756029b6..42493a2da24ef 100644
> > --- a/fs/ntfs3/fsntfs.c
> > +++ b/fs/ntfs3/fsntfs.c
> > @@ -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;
> > --
> > 2.43.0
> >
> Hello,
>
> Very sorry for the delay.
> Your patch was applied, thank you.
>
> Regards,
> Konstantin
>

Hi Konstantin,

Thank you for the update and for applying the patch.

Best regards,
Weiming Shi