Skip to main content

Linux Kernel XFS EUVDEUVD-2026-108768

| CVE-2026-98974 HIGH
2026-10-23 Linux GHSA-2g9r-fc27-29gx
7.8
CVSS 3.1 · Vendor: Linux
View

Attack ChainAIDerived

Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain

  1. Access
    Gain local unprivileged file access on XFS
  2. Delivery
    Clone block via FICLONERANGE to share
  3. Exploit
    EXCHANGE_RANGE TO_EOF corrupts file size
  4. Execution
    Second EXCHANGE_RANGE wrongly clears reflink flag
  5. Impact
    Extending 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.

This Week Schedule remediation this week. Why: HIGH severity (CVSS 7.0-8.9).
Patch available 0.2% exploitation probability (EPSS)

Get an e-mail when this CVE is exploited, patched or re-scored. Free account.

Alert me

AnalysisAIv1 – 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

Linux 966ceafc7a437105ecfe1cadb3747b2965a260ca <952b5c99a840c2bff1f6645fd5e06e1db6ec2623
Linux 6.10
Linux 966ceafc7a437105ecfe1cadb3747b2965a260ca <b361d32b884f8ddcb9bad5d99b69eece648f8e43
Linux patch: 0
Linux 966ceafc7a437105ecfe1cadb3747b2965a260ca <7dfb218c829c1acb626e0fe92c5fddb9a26a03e9
Linux patch: 7.2.11
Linux 966ceafc7a437105ecfe1cadb3747b2965a260ca <cf32eb20dfacfd2e92ce86ba1fece9ae5f98a7d8
Linux patch: 6.12.114
Linux patch: 6.18.57
Linux patch: 7.3

Affected Packages

euvd linux no fix

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

Vendor (Linux) PRIMARY 7.8 HIGH
AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H
vuln.today AI 7.1 HIGH

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).

3.1 AV:L/AC:L/PR:L/UI:N/S:U/C:N/I:H/A:H
4.0 AV:L/AC:L/AT:N/PR:L/UI:N/VC:N/VI:H/VA:H/SC:N/SI:N/SA:N

Primary rating from Vendor (Linux).

CVSS VectorVendor: Linux

Attack Vector
Local
Attack Complexity
Low
Privileges Required
Low
User Interaction
None
Scope
Unchanged
Confidentiality
High
Integrity
High
Availability
High

Lifecycle Timeline

4
CVSS changed
Oct 24, 2026 - 14:22 NVD
7.8 (HIGH)
Patch available
Oct 23, 2026 - 13:17 EUVD
CVE Published
Oct 23, 2026 - 12:19 cve.org
HIGH 7.8
CVE Published
Oct 23, 2026 - 12:19 cve.org
UNKNOWN (no severity yet)

DescriptionCVE.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

Why It Matters

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.

Business Impact: Medium
Compensating Controls

Apply vendor patch.

Threat Intelligence Overview

EPSS Score
0.2%
Top 89% exploitable
Prevalence
High
Linux kernel XFS; reflink/exchange-range default on modern mkfs.xfs, common on RHEL/Fedora
Data Quality
4 sources
Confidence: Medium

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.

SignalValue
Severity HIGH
CISA KEV No
Public POC No
EPSS 0.2%
Patch available Yes
Active threat No
Deciding rule
HIGH severity (CVSS 7.0-8.9)
What every action level means
Emergency Immediate action required. Criteria: CRITICAL + in CISA KEV (actively exploited) without patch, OR CRITICAL + EPSS > 30% without patch, OR CRITICAL + active threat signals without patch.
Act Now Prioritize within 24-48h. Criteria: in KEV with patch available, OR CRITICAL + public POC, OR HIGH + EPSS > 10%, OR CRITICAL + active threat, OR any CRITICAL severity.
This Week Schedule remediation this week. Criteria: HIGH severity (CVSS 7.0-8.9). Patch within normal change window.
This Month Plan within 30 days. Criteria: MEDIUM severity (CVSS 4.0-6.9), lower exploitation probability. Include in regular patch cycle.
Monitor Track and reassess. Criteria: LOW severity (CVSS 0.1-3.9), minimal exploitation risk. No immediate action needed.

SSVC AssessmentENISA

SSVC Decision· derived
Defer
Exploitation· derived
None
System Exposure· derived
Small
Automatable· derived
No
Human Impact
Medium

Priority Score

39
Low Medium High Critical
KEV: 0
EPSS: 0
CVSS: +39
PoC: 0
Weaponized: 0
Threat intel: 0
Gov advisory: 0

Attack Technique

Information disclosure occurs when an application unintentionally exposes sensitive data that aids attackers in reconnaissance or directly compromises security.

This site uses cookies essential for authentication and security. No tracking or analytics cookies are used. Privacy Policy