{"id":14890,"date":"2026-09-04T19:02:16","date_gmt":"2026-09-04T11:02:16","guid":{"rendered":"https:\/\/www.54iter.cn\/?vuln=cve-2026-63815"},"modified":"2026-09-04T19:02:16","modified_gmt":"2026-09-04T11:02:16","slug":"cve-2026-63815","status":"publish","type":"vuln","link":"https:\/\/www.54iter.cn\/?vuln=cve-2026-63815","title":{"rendered":"CVE-2026-63815 [HIGH] &#8211; In the Linux kernel, the following vulnerability has been resolved:\n\nf2fs: bound i_inline_"},"content":{"rendered":"<p>In the Linux kernel, the following vulnerability has been resolved:<\/p>\n<p>f2fs: bound i_inline_xattr_size for non-inline-xattr inodes<\/p>\n<p>When the flexible_inline_xattr feature is enabled, do_read_inode() loads<br \/>\nthe on-disk i_inline_xattr_size unconditionally:<\/p>\n<p>\tif (f2fs_sb_has_flexible_inline_xattr(sbi))<br \/>\n\t\tfi-&gt;i_inline_xattr_size = le16_to_cpu(ri-&gt;i_inline_xattr_size);<\/p>\n<p>but sanity_check_inode() only range-checks it when the inode also has the<br \/>\nFI_INLINE_XATTR flag set.  An inode that carries an inline dentry or inline<br \/>\ndata but not FI_INLINE_XATTR &#8212; the normal layout for an inline<br \/>\ndirectory &#8212; therefore keeps a fully attacker-controlled<br \/>\ni_inline_xattr_size from a crafted image.<\/p>\n<p>get_inline_xattr_addrs() returns that value with no flag gating, so it<br \/>\nfeeds the inode geometry:<\/p>\n<p>\tMAX_INLINE_DATA()  = 4 * (CUR_ADDRS_PER_INODE &#8211; i_inline_xattr_size &#8211; 1)<br \/>\n\tNR_INLINE_DENTRY() = MAX_INLINE_DATA() * BITS_PER_BYTE \/ (&#8230;)<br \/>\n\taddrs_per_page()   = CUR_ADDRS_PER_INODE &#8211; i_inline_xattr_size<\/p>\n<p>A large i_inline_xattr_size drives MAX_INLINE_DATA() and NR_INLINE_DENTRY()<br \/>\nnegative, so make_dentry_ptr_inline() sets d-&gt;max (int) to a negative<br \/>\nvalue.  The inline directory walk then compares an unsigned long bit_pos<br \/>\nagainst that negative d-&gt;max, which is promoted to a huge unsigned bound,<br \/>\nand reads far past the inline area:<\/p>\n<p>\twhile (bit_pos max)\t\t\/* fs\/f2fs\/dir.c *\/<br \/>\n\t\t&#8230; test_bit_le(bit_pos, d-&gt;bitmap) \/ d-&gt;dentry[bit_pos] &#8230;<\/p>\n<p>Mounting a crafted image and reading such a directory triggers an<br \/>\nout-of-bounds read in f2fs_fill_dentries(); the same underflow also<br \/>\ncorrupts ADDRS_PER_INODE for regular files.<\/p>\n<p>Validate i_inline_xattr_size against MAX_INLINE_XATTR_SIZE whenever the<br \/>\nflexible_inline_xattr feature is enabled &#8212; i.e. whenever the value is<br \/>\nloaded from disk and consumed &#8212; and keep the lower MIN_INLINE_XATTR_SIZE<br \/>\nbound gated on inodes that actually carry an inline xattr, so legitimate<br \/>\ninodes with i_inline_xattr_size == 0 are still accepted.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>In the Linux kernel, the following vulnerability has been resolved:<\/p>\n<p>f2fs: bound i_inline_xattr_size for non-inline-xattr inodes<\/p>\n<p>When the flexible_inline_xattr feature is enabled, do_read_inode() loa<\/p>\n","protected":false},"template":"","meta":[],"categories":[],"tags":[],"class_list":["post-14890","vuln","type-vuln","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/www.54iter.cn\/index.php?rest_route=\/wp\/v2\/vuln\/14890","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=14890"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.54iter.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=14890"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.54iter.cn\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=14890"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}