]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
fs/ntfs3: Fix slab-out-of-bounds read in DeleteIndexEntryRoot
authorJiasheng Jiang <jiashengjiangcool@gmail.com>
Sat, 17 Jan 2026 16:50:24 +0000 (16:50 +0000)
committerKonstantin Komarov <almaz.alexandrovich@paragon-software.com>
Tue, 27 Jan 2026 18:57:57 +0000 (19:57 +0100)
In the 'DeleteIndexEntryRoot' case of the 'do_action' function, the
entry size ('esize') is retrieved from the log record without adequate
bounds checking.

Specifically, the code calculates the end of the entry ('e2') using:
    e2 = Add2Ptr(e1, esize);

It then calculates the size for memmove using 'PtrOffset(e2, ...)',
which subtracts the end pointer from the buffer limit. If 'esize' is
maliciously large, 'e2' exceeds the used buffer size. This results in
a negative offset which, when cast to size_t for memmove, interprets
as a massive unsigned integer, leading to a heap buffer overflow.

This commit adds a check to ensure that the entry size ('esize') strictly
fits within the remaining used space of the index header before performing
memory operations.

Fixes: b46acd6a6a62 ("fs/ntfs3: Add NTFS journal")
Signed-off-by: Jiasheng Jiang <jiashengjiangcool@gmail.com>
Signed-off-by: Konstantin Komarov <almaz.alexandrovich@paragon-software.com>
fs/ntfs3/fslog.c

index 4ea94d53a8190742ea396e0216b1f9cf89182518..10863c83c3159803ad619a2559dd0254d82a328c 100644 (file)
@@ -3431,6 +3431,9 @@ move_data:
 
                e1 = Add2Ptr(attr, le16_to_cpu(lrh->attr_off));
                esize = le16_to_cpu(e1->size);
+               if (PtrOffset(e1, Add2Ptr(hdr, used)) < esize)
+                       goto dirty_vol;
+
                e2 = Add2Ptr(e1, esize);
 
                memmove(e1, e2, PtrOffset(e2, Add2Ptr(hdr, used)));