Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

fs/ntfs3: Fix slab-out-of-bounds read in DeleteIndexEntryRoot

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>

authored by

Jiasheng Jiang and committed by
Konstantin Komarov
b2bc7c44 ca1ceddf

+3
+3
fs/ntfs3/fslog.c
··· 3431 3431 3432 3432 e1 = Add2Ptr(attr, le16_to_cpu(lrh->attr_off)); 3433 3433 esize = le16_to_cpu(e1->size); 3434 + if (PtrOffset(e1, Add2Ptr(hdr, used)) < esize) 3435 + goto dirty_vol; 3436 + 3434 3437 e2 = Add2Ptr(e1, esize); 3435 3438 3436 3439 memmove(e1, e2, PtrOffset(e2, Add2Ptr(hdr, used)));