Skip to content

Commit 859d777

Browse files
0xkatoaalexandrovich
authored andcommitted
ntfs3: fix OOB write in attr_wof_frame_info()
In attr_wof_frame_info(), the offset-table read range for a nonresident WofCompressedData stream is: u64 from = vbo[i] & ~(u64)(PAGE_SIZE - 1); u64 to = min(from + PAGE_SIZE, wof_size); ... ntfs_read_run(sbi, run, addr, from, to - from); A crafted image sets WofCompressedData.nres.data_size to 0xfff while the file is large enough to request frame 1024 (offset 0x400000). This gives from=0x1000, to=0xfff. The unsigned (to - from) wraps to 0xffffffffffffffff and ntfs_read_write_run() overflows the single-page offs_folio via memcpy. Triggered by pread() on a mounted NTFS image. Depending on adjacent memory layout at the time of the overflow, KASAN reports this as slab-out-of-bounds, use-after-free, or slab-use-after-free all at ntfs_read_write_run(). Secondary corruption/panic paths were also observed. Reject the read when the offset-table page is outside the stream. Signed-off-by: 0xkato <0xkkato@gmail.com> Signed-off-by: Konstantin Komarov <almaz.alexandrovich@paragon-software.com>
1 parent 87ac077 commit 859d777

1 file changed

Lines changed: 6 additions & 0 deletions

File tree

fs/ntfs3/attrib.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1591,6 +1591,12 @@ int attr_wof_frame_info(struct ntfs_inode *ni, struct ATTRIB *attr,
15911591
u64 from = vbo[i] & ~(u64)(PAGE_SIZE - 1);
15921592
u64 to = min(from + PAGE_SIZE, wof_size);
15931593

1594+
if (from >= wof_size) {
1595+
_ntfs_bad_inode(&ni->vfs_inode);
1596+
err = -EINVAL;
1597+
goto out1;
1598+
}
1599+
15941600
err = attr_load_runs_range(ni, ATTR_DATA, WOF_NAME,
15951601
ARRAY_SIZE(WOF_NAME), run,
15961602
from, to);

0 commit comments

Comments
 (0)