Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
AccessGain local unprivileged file access on XFS
-
DeliveryClone block via FICLONERANGE to share
-
ExploitEXCHANGE_RANGE TO_EOF corrupts file size
-
ExecutionSecond EXCHANGE_RANGE wrongly clears reflink flag
-
ImpactExtending pwrite rewrites shared cross-file block
Vulnerability Assessment
| Exploitation Conditions | Requires local access as an ordinary (unprivileged) user who can create and manipulate files on an XFS filesystem that has the reflink and exchange-range (XFS_IOC_EXCHANGE_RANGE) features enabled - these are on by default with mkfs.xfs 7.x. The attacker must perform a specific deterministic sequence: FICLONERANGE to create a shared block, then an XFS_IOC_EXCHANGE_RANGE call with the TO_EOF flag and a nonzero offset (which incorrectly swaps the on-disk/incore i_disk_size), then a second XFS_IOC_EXCHANGE_RANGE that is tricked into treating the file as a full-contents swap and clears the reflink flag, followed by an extending pwrite. LIMITING FACTORS: no network vector (local only); only affects XFS and only when reflink/exchange-range are enabled; affected kernels start at 6.10 up to the fixed stable releases; no authentication bypass - a normal local account suffices but local access is mandatory. |
| Impact | Signals point to a genuine but non-emergency local issue. The CVSS 3.1 vector is AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H (base 7.8 HIGH): exploitation is local, low-complexity, and needs only low (ordinary user) privileges with no user interaction - there is no network vector, so this is not remotely exploitable. The commit message itself contains a detailed, step-by-step reproduction authored by the reporter (Norbert Szetei, 'refluxfs'), so the mechanism is fully public even though the input provides no CISA KEV listing and no explicit 'POC confirmed' field. EPSS is low at 0.21% (11th percentile), consistent with a local-only filesystem bug that is not mass-exploitable over the network. The vuln.today Decision label is 'this_week', which aligns with the picture: a credible, well-documented local data-corruption/cross-file-overwrite flaw that should be patched on a normal expedited cycle rather than as an out-of-band emergency. No full SSVC decision tree (automatable/technical-impact) is supplied, and CWE is N/A in the input, so the class is inferred from the description (incorrect i_disk_size handling leading to improper block sharing past EOF). Net: a real priority for hosts running XFS with reflink, but the low EPSS, absence of KEV, and local-only attack vector argue against treating it as an internet-facing crisis. |
| Exploit ScenarioDerived | A local unprivileged user on a host whose XFS filesystem has reflink and exchange-range enabled (the mkfs.xfs 7.x default) creates a file that shares a block with a victim file via FICLONERANGE, then issues two XFS_IOC_EXCHANGE_RANGE calls - one using TO_EOF with a nonzero offset - to corrupt the on-disk/incore file size so the kernel wrongly clears the reflink flag. A subsequent extending write then rewrites the still-shared block, corrupting or altering the victim file's data. A working reproduction ('refluxfs') is described in detail in the fix commit message; it is not verified in the input as packaged, confirmed exploit code. |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAIv1 – Oct 24, 2026
Local users on XFS filesystems can break reflink copy-on-write isolation so that an extending write lands in a block still shared with another file, corrupting that other file's contents and leaving filesystem metadata inconsistent. The bug is in the XFS_IOC_EXCHANGE_RANGE ioctl when the TO_EOF flag is combined with a nonzero offset: the code swaps the on-disk and in-core file sizes incorrectly, and a follow-up exchange then wrongly clears the reflink flag on what it believes is a single-block file. Kernels from 6.10 up to the fixed stable releases 6.12.114, 6.18.57, 7.2.11 and 7.3 are affected; exploitation is local only, requires reflink and exchange-range (both mkfs.xfs 7.x defaults), and follows a deterministic FICLONERANGE-plus-two-exchange sequence. EPSS is 0.21% (11th percentile) with no CISA KEV entry, and a public PoC reference exists but is not verified as working exploit code.
RemediationAI
Vendor-released patch: update to Linux 6.12.114, 6.18.57, 7.2.11 or 7.3 (or later), each of which contains the corresponding upstream fix commit listed at https://git.kernel.org/stable/c/952b5c99a840c2bff1f6645fd5e06e1db6ec2623, https://git.kernel.org/stable/c/b361d32b884f8ddcb9bad5d99b69eece648f8e43, https://git.kernel.org/stable/c/7dfb218c829c1acb626e0fe92c5fddb9a26a03e9 and https://git.kernel.org/stable/c/cf32eb20dfacfd2e92ce86ba1fece9ae5f98a7d8; applying the upstream stable update is the complete fix, and the NVD entry at https://nvd.nist.gov/vuln/detail/CVE-2026-98974 mirrors the CVE record. Because the corrupted state is created by the TO_EOF exchange path itself, systems that cannot be patched immediately should note that the flaw is not reachable on XFS filesystems formatted without the reflink and exchange-range features, since the trigger depends on mkfs.xfs 7.x defaults that enable both; restricting untrusted local users from writing to reflink-capable XFS mounts removes the required primitive at the cost of the deduplication and snapshot functionality those features provide. Affected kernels begin at 6.10, so hosts still on 6.10 through the pre-fix stable releases on each branch should be prioritized; per current signals this is a this-week remediation item rather than an emergency.
Affected VersionsENISA
Affected Packages
Source: OSV (Open Source Vulnerabilities)
Affects your stack
Affects 1 package in euvd
Checking this CVE against your own stacks and servers is part of the Basic plan and up.
Technical ContextAI · show details
XFS reflink maintains shared extents between files through reference-counted blocks; when one owner writes to a shared block, copy-on-write must allocate a private copy, and a per-inode reflink flag tells the write path that CoW is required. XFS_IOC_EXCHANGE_RANGE swaps data ranges between two files, and its XFS_EXCHANGE_RANGE_TO_EOF mode is documented to ignore the length parameter and swap from the given offset to end-of-file, adjusting each file's size to offset plus the other file's remaining length. The kernel implementation instead swapped the on-disk (i_disk_size) and in-core i_size values wholesale, which is wrong whenever the caller passes a nonzero offset; after the first exchange the file's reported size no longer matches the extents it actually owns, leaving shared blocks beyond EOF. A second exchange on that file is then evaluated by xmi_can_exchange_reflink_flags() as a full-contents swap of two one-block files, so it clears the reflink flag even though block ownership is still shared. The subsequent extending pwrite sees xfs_is_cow_inode() as false, skips CoW, and rewrites the still-shared block, so the peer file's data changes underneath it and on-disk size/ownership state is left inconsistent. No CWE identifier was supplied with the CVE data, so the root cause is best characterized from the commit message itself: incorrect size bookkeeping in the exchange-range TO_EOF path rather than a memory-safety defect. Per the assessed vector (AV:L/AC:L/PR:L/UI:N/S:U/C:N/I:H/A:H) the issue is local, needs an ordinary unprivileged account able to create and manipulate files on an affected XFS filesystem, and yields high integrity and availability impact without a confidentiality component.
Know when the next one hits your stack
- Watch products and get an email when something new is published
- Check this CVE against your own stack and servers
- Exploit and PoC references, threat intelligence from 22 sources
No credit card · 7-day full trial
Severity by source
AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H
Local unprivileged user (AV:L/PR:L) runs a deterministic ioctl sequence (AC:L) to corrupt/overwrite blocks shared with other files (I:H) and risk filesystem inconsistency (A:H); no direct data-read primitive (C:N).
Primary rating from Vendor (Linux).
CVSS VectorVendor: Linux
Lifecycle Timeline
4DescriptionCVE.org
In the Linux kernel, the following vulnerability has been resolved:
xfs: fix exchange-range-to-eof file size exchange
Norbert Szetei posted a patch containing an incomplete description of a bug in XFS_IOC_EXCHANGE_RANGE's TO_EOF flag. The bug tricks exchange-range into modifying a file so that it has shared blocks starting beyond EOF, which is never allowed because files never have written data beyond EOF, and you can only share written data blocks. This is key to all the incorrect behavior that follows.
Eventually I got from Norbert a description of what's going wrong:
> Fair. Here it is with physical block numbers, 4k blocks. peer is the file > that gets rewritten and file1 is the one that ends up with the flag > cleared. > > Start, nothing shared: > > peer size 4096 -> [100] > file1 size 12288 -> [200] [201] [202] > donor1 size 4096 -> [300] > donor2 size 4096 -> [400] > > 1. FICLONERANGE peer's block into file1's middle slot: > > peer size 4096 -> [100] > file1 size 12288 -> [200] [100] [202] reflink flag set > ^^^^^ both files own block 100 > > 2. XFS_IOC_EXCHANGE_RANGE file1 against donor1, file1_offset 0, > file2_offset 8192, length 0, TO_EOF. One block is exchanged, and the sizes > are exchanged with it: > > file1 size 4096 -> [200] [100] [300] reflink flag set > ^^^^^^^^^^^ still owned, now past the size > donor1 size 12288 -> [202] > > file1 says it is one block long while it still owns three. Nothing was > unmapped. file2_offset is block 2, so this exchange cannot clear a flag. > > 3. XFS_IOC_EXCHANGE_RANGE file1 against donor2, both offsets 0, length 4096. > By i_disk_size this is two one-block files exchanging everything, so > xmi_can_exchange_reflink_flags() agrees and the flag is cleared: > > file1 size 4096 -> [400] [100] [300] reflink flag CLEARED > donor2 size 4096 -> [200] > > Block 100 is still shared with peer. > > 4. pwrite(file1, 4096, 4096), which is file1's second slot, block 100. > xfs_is_cow_inode(file1) is false, so no CoW: > > peer size 4096 -> [100] same block, new contents > > Block 100 is the only one that matters here. PoC below, it reads a file > called peer in the current directory. The filesystem needs reflink and > exchange-range, which mkfs.xfs 7.x turns on by default.
So yes, TO_EOF is screwing up the file size even if it's actually exchanging the data block correctly. The following is the intended behavior of XFS_EXCHANGE_RANGE_TO_EOF, as described by its manpage:
"Ignore the length parameter. All bytes in file1_fd from file1_offset to EOF are moved to file2_fd, and file2's size is set to (file2_offset+(file1_length-file1_offset)). Meanwhile, all bytes in file2 from file2_offset to EOF are moved to file1 and file1's size is set to (file1_offset+(file2_length-file2_offset))."
In other words, if we only exchange a portion of the file data, then we should only exchange the portion of the file size that relates to the exchanged data. Unfortunately, the code swaps the ondisk file size and the incore file sizes, which is incorrect if the caller passes in a nonzero offset.
Having confused the file sizes, the PoC uses a second exchange-range call on what looks like a non-reflinked single-block file. Because the file size is set incorrectly, exchange-range thinks it's exchanging the full contents of two files and clears the reflink flag on the broken file. That enables an extending write of the broken file to rewrite the shared block that's just past EOF. This has become known colloquially as refluxfs.
Once the file sizes are set correctly, the second exchange-range no longer thinks that it's doing a full-contents swap, so it won't clear the reflink flag on either of its file arguments.
Norbert followed up to an earlier version of this patch with a second complaint about us not handling the i_disk_size state correctly:
> The offsets are bounded against the incore i_size but subtracted from > ---truncated---
Executive ViewAI
A vulnerability in the XFS filesystem (CVE-2026-98974) allows local users to corrupt other files and filesystem metadata, potentially causing data integrity issues and system instability. Affected systems include those running Linux kernels 6.10 through 6.12.113, 6.18.56, and 7.0-7.2.10 with reflink-enabled XFS. While exploitation requires local access, the deterministic nature and impact on shared files could disrupt business operations.
Apply vendor patch.
Threat Intelligence Overview
How this decision was reached
The engine reads each signal below and applies a fixed list of rules from top to bottom. The first rule that matches sets the recommended action – like a statement, every line is shown.
What every action level means
SSVC AssessmentENISA
Priority Score
Attack Technique
Information disclosure occurs when an application unintentionally exposes sensitive data that aids attackers in reconnaissance or directly compromises security.
EUVD-2026-108768
GHSA-2g9r-fc27-29gx
NVD
CVE.org
EPSS
Exploit-DB