{"dataType":"CVE_RECORD","dataVersion":"5.2","cveMetadata":{"cveId":"CVE-2026-89836","assignerOrgId":"416baaa9-dc9f-4396-8d5f-8c081fb06d67","state":"PUBLISHED","assignerShortName":"Linux","dateReserved":"2026-09-11T19:38:34.769Z","datePublished":"2026-09-16T10:31:10.233Z","dateUpdated":"2026-09-16T14:39:08.158Z"},"containers":{"cna":{"providerMetadata":{"orgId":"416baaa9-dc9f-4396-8d5f-8c081fb06d67","shortName":"Linux","dateUpdated":"2026-09-16T14:39:08.158Z"},"descriptions":[{"lang":"en","value":"In the Linux kernel, the following vulnerability has been resolved:\n\nf2fs: fix folio_nr_pages() race after put in large folio invalidate\n\nOur v6.18 based Android system is continuely suffering livelock and bad\npage stat as shown in[1] which related to broken xarray slot status. By\ninvestigating big folio operations within f2fs, we find below races and\nfix it by get the nr_pages before drop the refcount and folio_lock.\n\nf2fs_get_read_data_folio() calls f2fs_folio_put() before\nfolio_nr_pages() when invalidating a large folio from the page cache.\nThat unlocks the folio and drops the caller reference, leaving a window\nwhere a concurrent truncate or folio split can shrink the compound folio\nor free it before the invalidate range is computed. An undersized range\nthen leaves split sub-folios in mapping->i_pages, which can later\ninteract badly with truncate and reclaim (stale xarray entries and bad\npage state when folio->mapping no longer matches the mapping being\ntruncated).\n\n[1]\nPID: 2594     TASK: ffffff8169b81580  CPU: 7    COMMAND: \"Thread-3\"\n #0 [ffffffc08ef2b8a0] xas_load at ffffffe52d1f42a4\n #1 [ffffffc08ef2b900] find_get_entries at ffffffe52c185798\n #2 [ffffffc08ef2bb60] truncate_inode_pages_range at ffffffe52c19e83c\n #3 [ffffffc08ef2bbc0] truncate_inode_pages_final at ffffffe52c19ec2c\n #4 [ffffffc08ef2bc20] f2fs_evict_inode at ffffffe52c4c8400\n #5 [ffffffc08ef2bcc0] evict at ffffffe52c2de9f4\n #6 [ffffffc08ef2bd00] iput at ffffffe52c2db1b4\n #7 [ffffffc08ef2bd30] dentry_unlink_inode at ffffffe52c2d7204\n #8 [ffffffc08ef2bd50] __dentry_kill at ffffffe52c2d3dcc\n #9 [ffffffc08ef2bd80] dput at ffffffe52c2d3c3c\n #10 [ffffffc08ef2bda0] __fput at ffffffe52c2b0a7c\n #11 [ffffffc08ef2bde0] ____fput at ffffffe52c2b1034\n #12 [ffffffc08ef2bdf0] task_work_run at ffffffe52beea200\n #13 [ffffffc08ef2be20] exit_to_user_mode_loop at ffffffe52bfbc17c\n #14 [ffffffc08ef2be80] el0_svc at ffffffe52d1f8e54\n #15 [ffffffc08ef2beb0] el0t_64_sync_handler at ffffffe52d1f8d10"}],"metrics":[{"cvssV3_1":{"version":"3.1","vectorString":"CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H","baseScore":7.8,"baseSeverity":"HIGH"},"scenarios":[{"lang":"en","value":"AV:L - The bug is in f2fs_get_read_data_folio() on a locally mounted f2fs volume, reached when GC or other f2fs helpers grab a single-page folio while a large folio is cached. f2fs is the Android/embedded userdata filesystem; the path is local syscalls, not a network protocol.\nAC:L - The attacker drives both sides of the race: one thread keeps large folios cached and forces GC via writes into f2fs_balance_fs, while concurrent threads split or reclaim those folios with posix_fadvise(DONTNEED), madvise, or memory pressure in the window after f2fs_folio_put() and before folio_nr_pages().\nPR:L - CAP_LINUX_IMMUTABLE is needed only to set the flag, but Android f2fs /data already has immutable/fsverity files with large folios. An unprivileged app can read them, write its own data to trigger GC without CAP_SYS_ADMIN, and race reclaim; the GC ioctl is optional.\nUI:N - The attacker can populate large folios, force GC, and race folio split or reclaim with their own processes; no separate victim action is required.\nS:U - Page-cache xarray corruption and folio use-after-free stay inside the host kernel; this is local privilege escalation, not a VM, IOMMU, or sandbox boundary crossing.\nC:H - After the put, folio_nr_pages() may run on a split or already-freed folio, and an undersized invalidate leaves stale i_pages xarray entries. That page-cache UAF allows a reused folio to be read as another mapping's pages, enabling kernel memory disclosure.\nI:H - Stale mapping->i_pages slots and UAF of compound-folio metadata are heap and page-cache corruption. Reused folios and later truncate or reclaim against the wrong mapping yield write primitives and control-flow hijacking, not only a crash.\nA:H - The reported failure is livelock and bad page state in truncate_inode_pages_range (xas_load/find_get_entries) during inode eviction, i.e. a kernel oops, BUG, or hang with complete loss of availability."}]}],"affected":[{"product":"Linux","vendor":"Linux","defaultStatus":"unaffected","repo":"https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git","programFiles":["fs/f2fs/data.c"],"versions":[{"version":"05e65c14ea59a401cec4284e9d612f9d5dc1b3f8","lessThan":"cc34df18da92f68f9b384c3ae95ad64be46cb5ee","status":"affected","versionType":"git"},{"version":"05e65c14ea59a401cec4284e9d612f9d5dc1b3f8","lessThan":"0dab71381f1b4d12dc2056f8bd5aaa9d93ce9082","status":"affected","versionType":"git"}]},{"product":"Linux","vendor":"Linux","defaultStatus":"affected","repo":"https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git","programFiles":["fs/f2fs/data.c"],"versions":[{"version":"7.0","status":"affected"},{"version":"0","lessThan":"7.0","status":"unaffected","versionType":"semver"},{"version":"7.2.5","lessThanOrEqual":"7.2.*","status":"unaffected","versionType":"semver"},{"version":"7.3-rc1","lessThanOrEqual":"*","status":"unaffected","versionType":"original_commit_for_fix"}]}],"cpeApplicability":[{"nodes":[{"operator":"OR","negate":false,"cpeMatch":[{"vulnerable":true,"criteria":"cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*","versionStartIncluding":"7.0","versionEndExcluding":"7.2.5"},{"vulnerable":true,"criteria":"cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*","versionStartIncluding":"7.0","versionEndExcluding":"7.3-rc1"}]}]}],"references":[{"url":"https://git.kernel.org/stable/c/cc34df18da92f68f9b384c3ae95ad64be46cb5ee"},{"url":"https://git.kernel.org/stable/c/0dab71381f1b4d12dc2056f8bd5aaa9d93ce9082"}],"title":"f2fs: fix folio_nr_pages() race after put in large folio invalidate","x_generator":{"engine":"bippy-1.2.0"}}}}