{"id":6987,"date":"2026-09-04T18:49:23","date_gmt":"2026-09-04T10:49:23","guid":{"rendered":"https:\/\/www.54iter.cn\/?vuln=cve-2026-72353"},"modified":"2026-09-04T18:49:23","modified_gmt":"2026-09-04T10:49:23","slug":"cve-2026-72353","status":"publish","type":"vuln","link":"https:\/\/www.54iter.cn\/?vuln=cve-2026-72353","title":{"rendered":"CVE-2026-72353 [HIGH] &#8211; In the Linux kernel, the following vulnerability has been resolved:\n\nntfs: avoid stale run"},"content":{"rendered":"<p>In the Linux kernel, the following vulnerability has been resolved:<\/p>\n<p>ntfs: avoid stale runlist element dereference in fallocate<\/p>\n<p>ntfs_attr_fallocate() allocates holes and delayed allocations inside<br \/>\ninitialized size by looking up the current runlist element under<br \/>\nni-&gt;runlist.lock. The returned struct runlist_element is only a borrowed<br \/>\npointer into ni-&gt;runlist.rl. A writer can replace and free that array<br \/>\nafter the read lock is dropped, so later reads of rl-&gt;lcn, rl-&gt;length and<br \/>\nrl-&gt;vcn can touch freed memory.<\/p>\n<p>The buggy scenario involves two paths, with each column showing the order<br \/>\nwithin that path:<\/p>\n<p>ntfs_attr_fallocate():<br \/>\n  1. Take ni-&gt;runlist.lock for read.<br \/>\n  2. Get rl from ntfs_attr_find_vcn_nolock().<br \/>\n  3. Drop ni-&gt;runlist.lock.<br \/>\n  4. Read rl-&gt;lcn, rl-&gt;length and rl-&gt;vcn.<\/p>\n<p>mmap page_mkwrite:<br \/>\n  1. Enter ntfs_filemap_page_mkwrite().<br \/>\n  2. Reach __ntfs_write_iomap_begin() and ntfs_attr_map_cluster().<br \/>\n  3. Merge allocation state with ntfs_runlists_merge().<br \/>\n  4. Reallocate ni-&gt;runlist.rl in ntfs_rl_realloc(), freeing the old array.<\/p>\n<p>Validation reproduced this kernel report:<br \/>\nBUG: KASAN: slab-use-after-free in ntfs_attr_fallocate+0xbb8\/0xd00<\/p>\n<p>Call Trace:<\/p>\n<p> dump_stack_lvl+0x66\/0xa0<br \/>\n print_report+0xce\/0x630<br \/>\n ? ntfs_attr_fallocate+0xbb8\/0xd00<br \/>\n ? srso_alias_return_thunk+0x5\/0xfbef5<br \/>\n ? __virt_addr_valid+0x20d\/0x410<br \/>\n ? ntfs_attr_fallocate+0xbb8\/0xd00<br \/>\n kasan_report+0xe0\/0x110<br \/>\n ? ntfs_attr_fallocate+0xbb8\/0xd00<br \/>\n ntfs_attr_fallocate+0xbb8\/0xd00<br \/>\n ? lock_acquire+0x2b8\/0x2f0<br \/>\n ? __pfx_ntfs_attr_fallocate+0x10\/0x10<br \/>\n ? 0xffffffffc0000095<br \/>\n ? down_write+0x10d\/0x1e0<br \/>\n ntfs_fallocate+0x5c9\/0x1d00<br \/>\n ? __pfx_ntfs_fallocate+0x10\/0x10<br \/>\n ? srso_alias_return_thunk+0x5\/0xfbef5<br \/>\n ? lock_acquire+0x2b8\/0x2f0<br \/>\n ? srso_alias_return_thunk+0x5\/0xfbef5<br \/>\n ? selinux_file_permission+0x3a7\/0x510<br \/>\n vfs_fallocate+0x29d\/0xd30<br \/>\n __x64_sys_fallocate+0xc7\/0x150<br \/>\n ? do_syscall_64+0x81\/0x6a0<br \/>\n do_syscall_64+0x115\/0x6a0<br \/>\n entry_SYSCALL_64_after_hwframe+0x77\/0x7f<\/p>\n<p>Allocated by task 410:<br \/>\n kasan_save_stack+0x33\/0x60<br \/>\n kasan_save_track+0x14\/0x30<br \/>\n __kasan_kmalloc+0xaa\/0xb0<br \/>\n __kvmalloc_node_noprof+0x353\/0x920<br \/>\n ntfs_rl_realloc+0x3f\/0x110<br \/>\n ntfs_runlists_merge+0xaa3\/0x3010<br \/>\n ntfs_attr_map_cluster+0x4e5\/0xf80<br \/>\n ntfs_attr_fallocate+0x53f\/0xd00<br \/>\n ntfs_fallocate+0x5c9\/0x1d00<br \/>\n vfs_fallocate+0x29d\/0xd30<br \/>\n __x64_sys_fallocate+0xc7\/0x150<br \/>\n do_syscall_64+0x115\/0x6a0<br \/>\n entry_SYSCALL_64_after_hwframe+0x77\/0x7f<\/p>\n<p>Freed by task 424:<br \/>\n kasan_save_stack+0x33\/0x60<br \/>\n kasan_save_track+0x14\/0x30<br \/>\n kasan_save_free_info+0x3b\/0x60<br \/>\n __kasan_slab_free+0x5f\/0x80<br \/>\n kfree+0x307\/0x580<br \/>\n ntfs_rl_realloc+0x6f\/0x110<br \/>\n ntfs_runlists_merge+0x7b1\/0x3010<br \/>\n ntfs_attr_map_cluster+0x4e5\/0xf80<br \/>\n __ntfs_write_iomap_begin+0x8cd\/0x2280<br \/>\n iomap_iter+0x6de\/0x11e0<br \/>\n iomap_page_mkwrite+0x391\/0x650<br \/>\n ntfs_filemap_page_mkwrite+0x1ac\/0x400<br \/>\n do_page_mkwrite+0x15c\/0x280<br \/>\n __handle_mm_fault+0xd6d\/0x1ca0<br \/>\n handle_mm_fault+0x19c\/0x470<br \/>\n do_user_addr_fault+0x23b\/0x9c0<br \/>\n exc_page_fault+0x5c\/0xc0<br \/>\n asm_exc_page_fault+0x26\/0x30<\/p>\n<p>Fix this by copying the needed runlist fields while the read lock is still<br \/>\nheld and using only those scalar snapshots after unlocking.<\/p>\n<p>After the snapshot, ntfs_attr_map_cluster() can also find that the range<br \/>\nis already mapped and return balloc=false. Only call ntfs_dio_zero_range()<br \/>\nwhen new clusters were allocated, matching the write iomap path and<br \/>\npreserving the zero-newly-allocated-holes behavior.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>In the Linux kernel, the following vulnerability has been resolved:<\/p>\n<p>ntfs: avoid stale runlist element dereference in fallocate<\/p>\n<p>ntfs_attr_fallocate() allocates holes and delayed allocations inside<br \/>\nin<\/p>\n","protected":false},"template":"","meta":[],"categories":[],"tags":[],"class_list":["post-6987","vuln","type-vuln","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/www.54iter.cn\/index.php?rest_route=\/wp\/v2\/vuln\/6987","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.54iter.cn\/index.php?rest_route=\/wp\/v2\/vuln"}],"about":[{"href":"https:\/\/www.54iter.cn\/index.php?rest_route=\/wp\/v2\/types\/vuln"}],"wp:attachment":[{"href":"https:\/\/www.54iter.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=6987"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.54iter.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=6987"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.54iter.cn\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=6987"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}