Skip to main content
← All vulnerabilities
CVE-2026-90199

fs/ntfs3: reject out-of-range evcn in mi_enum_attr()

Published
Last modified
published
Not listed in CISA KEV
Fix
Fixed in 5.16, 6.2, 6.6, 6.6.157, 6.12.110, and 2 more
None on Exploit-DB, Metasploit or GitHub

Summary

In the Linux kernel, the following vulnerability has been resolved: fs/ntfs3: reject out-of-range evcn in mi_enum_attr() In mi_enum_attr(), the start/end VCN validation for non-resident attributes is: if (svcn > evcn + 1) goto out; When evcn is U64_MAX the "evcn + 1" expression wraps to 0 and any svcn passes the check. For evcn values close to U64_MAX (but not equal to it) the right-hand side is still a meaningless near-wrap upper bound, so a malformed on-disk attribute with svcn == 0 and evcn near U64_MAX can pass mi_enum_attr() unrejected. VCN (virtual cluster number) is a cluster index, so any valid evcn is bounded by the volume's total cluster count, which ntfs3 holds in sbi->used.bitmap.nbits (set up in ntfs_init_from_boot() before any caller of mi_enum_attr() runs). Reject evcn values that fall outside this range. However, an empty non-resident attribute (no allocated clusters) is legitimately encoded with svcn == 0 and evcn == -1 (U64_MAX), e.g. via attr->nres.evcn = cpu_to_le64((u64)vcn - 1) with vcn == 0. That sentinel must keep passing, so exclude evcn == U64_MAX from the range check. The existing "svcn > evcn + 1" test still tolerates the sentinel ("0 > 0" is false) and continues to require svcn == 0 for it, while the range check rejects every other out-of-range evcn and thereby also defuses the "evcn + 1" wraparound. svcn does not need its own bound: once evcn < nbits, "svcn > evcn + 1" implies svcn <= nbits. [almaz.alexandrovich@paragon-software.com: fixed evcn check]

Timeline

  1. CVE published
  2. Record last updated

Affected versions

  • Linux Linux

    From 013ff63b649475f0ee134e2c8d0c8e65284ede50 · fixed in 0441e34ce098c19185a7b52c5b8b89a8a5b26888; From 013ff63b649475f0ee134e2c8d0c8e65284ede50 · fixed in 7ab69cef49ebdfee288287d62641b24ab1445ecc; From 013ff63b649475f0ee134e2c8d0c8e65284ede50 · fixed in ce9a619c432b9a4044fee115c5483fbed946c131; From 013ff63b649475f0ee134e2c8d0c8e65284ede50 · fixed in 2b9a0e57bfd365e2096706b19ae34dce3b4a884b; From 013ff63b649475f0ee134e2c8d0c8e65284ede50 · fixed in 20fd9f64c0050658f2031e6bd5d552c6f0c8f7e3; From 5.15.209 · fixed in 5.16; From 6.1.115 · fixed in 6.2; From 6.5.11 · fixed in 6.6

  • Linux Linux

    6.6

  • KernelLinux

    From 6.6.0 · fixed in 6.6.157; From 6.7.0 · fixed in 6.12.110; From 6.13.0 · fixed in 6.18.52; From 6.19.0 · fixed in 7.2.6

References 5

git.kernel.org