← Back to Feed CACHED · 2026-10-07 00:11:43 · CACHE_KEY CVE-2026-64600
CVE-2026-64600 · CWE-362 · Disclosed 2026-07-23

Linux Kernel XFS Reflink Stale Data-Fork Mapping Local Privilege Escalation (RefluXFS)

ASSESSED — NOISGATE
Vendor
—
—
—
Reassessed
—
—
—
Verdict: —
Do you agree?
01 · The Real Story

A filesystem race condition that lets any user rewrite /etc/passwd like editing a shared Google Doc with no version history

CVE-2026-64600 (RefluXFS) is a race condition in the Linux kernel's XFS copy-on-write (reflink) direct-I/O path, present since kernel 4.11 (2017). When two concurrent O_DIRECT writes target the same reflinked file, the kernel drops the inode lock (ILOCK) to allocate a transaction. A second writer can complete its CoW cycle during this window, remapping the shared extent. The first writer then uses a stale data-fork mapping pointing to the original block — now exclusively owned by the target file — and writes directly to it. An unprivileged local user can overwrite the on-disk contents of any world-readable file, including /etc/passwd or SUID-root binaries like /usr/bin/su, achieving instant root. Affected versions span Linux 4.11 through 5.15.211, 5.16 through 6.1.177, 6.2 through 6.6.144, 6.7 through 6.12.95, 6.13 through 6.18.38, and 6.19 through 7.1.3. Fixed in upstream stable 5.15.212, 6.1.178, 6.6.145, 6.12.96, 6.18.39, and 7.1.4.

The vendor severity of HIGH 7.8 is a significant understatement. While CVSS correctly captures the local attack vector and low privileges required, it fails to account for several compounding real-world factors: XFS with reflink=1 is the default filesystem on RHEL 8/9/10, CentOS Stream, Rocky Linux, AlmaLinux, Amazon Linux 2023, and Fedora Server 31+ — covering the majority of enterprise Linux servers. The Qualys PoC is highly reliable (32-thread barrier-synchronized write pattern), the exploit leaves no kernel log output, survives reboots, and every standard compensating control fails — SELinux, seccomp, KASLR, SMEP, SMAP, container isolation, and kernel lockdown are all bypassed because the attack operates at the filesystem block-allocation layer. Qualys estimates 16.4 million affected systems worldwide.

"Reliable root from any local account on default RHEL. Patch now or disable reflink."
02 · The Attack Path

5 steps from start to impact.

STEP 01

Obtain local shell on target host

The attacker needs any unprivileged local account on a Linux host with an XFS filesystem mounted with reflink=1. This can come from SSH credential stuffing, a compromised web application providing command execution, a container escape, or legitimate multi-user access on shared systems. On CI/CD runners, this prerequisite is met by design — the runner executes submitted code.
Conditions required:
  • Valid local account or code execution on the target host
Where this breaks in practice:
  • Requires prior foothold — cannot be exploited remotely without an initial access vector
Detection/coverage: SSH brute-force detection, EDR process telemetry, container runtime audit logs
STEP 02

Identify XFS reflink-enabled volume

The attacker runs findmnt -no FSTYPE / and xfs_info / | grep reflink to confirm the root filesystem is XFS with reflink enabled. On RHEL 8+, CentOS Stream, Rocky, AlmaLinux, and Amazon Linux 2023, this is the default — no special configuration required. The check is instantaneous and generates no alerts.
Conditions required:
  • Root filesystem is XFS with reflink=1 (default on RHEL-family)
Where this breaks in practice:
  • Debian/Ubuntu default to ext4 — not affected unless admin explicitly chose XFS with reflink
STEP 03

Create reflink clone of target file

Using cp --reflink=always, the attacker creates a copy-on-write clone of the target file (e.g., /etc/passwd). This operation requires only read access to the target — no write permission needed on the original. The clone shares the same on-disk extents. This is a normal filesystem operation that generates no security events.
Conditions required:
  • Read access to target file (world-readable files like /etc/passwd qualify)
  • Write access to any directory on the same XFS volume
Where this breaks in practice:
  • Target file must be on the same XFS filesystem as the attacker's scratch space
STEP 04

Trigger race condition with concurrent O_DIRECT writes

The attacker launches the RefluXFS exploit — a multi-threaded C program using 32 barrier-synchronized O_DIRECT writers with background truncation and sync churn. One thread completes a legitimate CoW remap to a new block, while another thread lands an in-place write using the stale data-fork mapping that still points to the original block. The race window is widened by forcing transaction-log allocation delays. Weaponized tool: RefluXFS PoC (Qualys TRU), also reproduced by 0xBlackash/CVE-2026-64600 and Debajyoti0-0/CVE-2026-64600 on GitHub.
Conditions required:
  • Kernel version in affected range (4.11 – 7.1.3)
  • XFS reflink=1 active
Where this breaks in practice:
  • None — the race is reliable on stock kernels under normal I/O load
Detection/coverage: No kernel log output. No audit trail. File integrity monitoring (AIDE, OSSEC, Tripwire) would detect the change only if running periodic checks — not in real time.
STEP 05

Overwrite /etc/passwd or SUID binary to gain root

The exploit writes attacker-controlled content directly to the original file's on-disk blocks, bypassing all VFS permission checks. The Qualys demo strips the root password hash from /etc/passwd, granting immediate passwordless su to root. Alternatively, the attacker can overwrite a SUID-root binary with a custom payload. The modification is persistent — it survives reboots and filesystem remounts because the corruption is at the block layer.
Conditions required:
  • Successful race in step 4
Detection/coverage: Post-exploitation: getent passwd root showing empty password field, unexpected SUID binary checksums. File integrity monitoring is the primary detection vector.
03 · Compensating Control

1
CRITICAL 9.0→IGNORE 0.0
SEVERITY REDUCED
Apply vendor kernel patch and reboot immediately — Install the patched kernel from your distribution's errata (RHEL, Rocky, AlmaLinux, Amazon Linux, etc.) and perform a full system reboot. KernelCare/KSplice live patching is available from CloudLinux and Oracle for zero-downtime environments. Per the noisgate mitigation SLA for CRITICAL, deploy within 3 days. This is the only control that fully eliminates the vulnerability.
2
CRITICAL 9.0→LOW 3.0
SEVERITY REDUCED
Deploy Red Hat SystemTap reflink-disable script — Red Hat provides a SystemTap script that intercepts reflink operations and returns -EOPNOTSUPP, preventing the creation of new reflink clones. This breaks the attacker's ability to create the shared-extent clone needed for the race. Limitations: non-persistent across reboots (must be re-applied via init script), requires SystemTap packages installed, may break applications relying on reflink (e.g., Podman overlay storage, cp --reflink), and requires Secure Boot key management on UEFI-locked systems. Deploy within 3 days as a bridge to full patching.
3
CRITICAL 9.0→HIGH 7.5
SEVERITY REDUCED
Deploy file integrity monitoring on critical files with sub-minute polling — Configure AIDE, OSSEC, Samhain, or Tripwire to monitor /etc/passwd, /etc/shadow, all SUID/SGID binaries, and PAM configuration with polling intervals under 60 seconds. This does not prevent exploitation but enables rapid detection of successful attacks and limits attacker dwell time. Deploy within 3 days. Residual severity remains HIGH because this is detective, not preventive — the attacker still achieves root before the alert fires.
4
CRITICAL 9.0→HIGH 7.0
SEVERITY REDUCED
Restrict and audit local access to production servers — Audit and minimize accounts with shell access to production Linux hosts. Disable interactive logins for service accounts (/sbin/nologin). Enforce MFA for SSH access. Remove unnecessary user accounts. This narrows the attack surface by reducing who can trigger the exploit. Deploy within 3 days. Residual severity remains HIGH because compromised applications and container breakouts still provide the local access needed.
What doesn't work
  • SELinux (even in enforcing mode): The reflink clone and O_DIRECT write operations are normal filesystem I/O that SELinux policies permit. The attack does not violate any MAC boundary — the corruption happens at the block allocator level below SELinux enforcement.
  • seccomp profiles: The exploit uses only open, read, write, clone, mmap, and ioctl — all permitted by even restrictive seccomp profiles including Docker's default.
  • Container isolation (namespaces/cgroups): The race condition operates within the kernel's XFS code path. A containerized process with access to an XFS reflink-enabled mount can trigger the bug from within its namespace.
  • KASLR/SMEP/SMAP: These are memory corruption mitigations. RefluXFS is a logic bug in filesystem block mapping — no memory corruption or code injection is involved.
  • Kernel lockdown mode: Lockdown restricts userspace access to kernel memory and certain syscalls. The reflink/O_DIRECT path is not restricted by lockdown because it is a legitimate filesystem operation.
  • Read-only root filesystem: Mitigates impact only on the root filesystem itself, but the attacker can target any writable XFS reflink-enabled mount. Many systems have separate writable XFS volumes for /home, /var, or application data containing exploitable targets.
04 · Intelligence Metadata

The supporting signals.

In-the-WildNo confirmed active exploitation as of 2026-10-07. Not listed in CISA KEV. However, the reliable public PoC and trivial exploitation chain make weaponization by post-access operators (ransomware affiliates, APT lateral movement kits) highly probable.
PoC AvailabilityPublic and reliable. Qualys TRU published a full technical writeup and demonstrated root on RHEL 10.2 (video). GitHub repos: 0xBlackash/CVE-2026-64600 (21 stars, bash-based), Debajyoti0-0/CVE-2026-64600 (C-based detection/verification/PoC utility). Indexed on pocindex.io and asvorg/CVE-2026-PoCs.
EPSS0.00158 (0.158%), approximately 27th percentile. Low, but EPSS systematically underweights local privilege escalation bugs that require a prior foothold. Expect this score to spike as PoC adoption by post-exploitation frameworks increases.
KEV StatusNot listed as of 2026-10-07. No CISA remediation deadline.
CVSS VectorCVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H = 7.8 HIGH. Local vector, low complexity, low privileges, no user interaction. All three CIA impacts high. Scope is Unchanged — CVSS does not capture the cross-container or cross-tenant blast radius when the host kernel is rooted.
Affected VersionsLinux kernel 4.11 – 5.15.211, 5.16 – 6.1.177, 6.2 – 6.6.144, 6.7 – 6.12.95, 6.13 – 6.18.38, 6.19 – 7.1.3. Only systems with XFS reflink=1 are exploitable. RHEL 7 and earlier are not affected (reflink feature not available). Debian/Ubuntu are not affected in default installs (ext4 default).
Fixed VersionsUpstream stable: 5.15.212, 6.1.178, 6.6.145, 6.12.96, 6.18.39, 7.1.4. Distro backports: RHEL 8/9/10 errata (multiple RHSA-2026 advisories including RHSA-2026:7003, RHSA-2026:6632, RHSA-2026:4012), Rocky/AlmaLinux tracking upstream, Amazon Linux 2023 kernel update, CloudLinux via KernelCare live patch.
Exposure EstimateQualys CSAM estimates 16.4 million potentially affected systems globally. Primary exposure: any RHEL-family server with default XFS. Shodan/Censys/GreyNoise not directly relevant (local-only vuln), but any externally-reachable service on an unpatched RHEL-family host is an indirect entry point to the LPE chain.
Disclosure Timeline2026-07-22: Qualys coordinated disclosure via oss-security mailing list. 2026-07-24: NVD published. Upstream kernel patches merged into stable branches concurrently.
ResearcherSaeed Abbasi, Head of Threat Research Unit, Qualys. Qualys TRU has a strong track record of high-impact Linux LPE disclosures including Sequoia (CVE-2021-33909), PwnKit (CVE-2021-4034), and Looney Tunables (CVE-2023-4911).

Sources.

  1. Qualys TRU Blog — RefluXFS Full Analysis
  2. NVD — CVE-2026-64600 Detail
  3. Red Hat — CVE-2026-64600 Advisory & SystemTap Mitigation
  4. GitHub PoC — 0xBlackash/CVE-2026-64600
  5. GitHub PoC — Debajyoti0-0/CVE-2026-64600
  6. Corgea Research — RefluXFS Technical Breakdown
  7. CloudLinux — KernelCare Live Patching Status
  8. SOC Prime — RefluXFS Detection Content
05 · The Call

Final Verdict
↑ UPGRADED to CRITICAL (9.0/10)

Why this verdict

  • Default exposure eliminates configuration friction: XFS with reflink=1 is the default filesystem on RHEL 8/9/10, CentOS Stream, Rocky, AlmaLinux, Amazon Linux 2023, and Fedora Server 31+. No misconfiguration, no feature flag, no opt-in required. The vast majority of enterprise Linux servers ship vulnerable out of the box. 16.4 million systems affected per Qualys CSAM.
  • Exploit reliability is exceptional: The Qualys PoC uses a 32-thread barrier-synchronized write pattern that reliably wins the race within seconds on stock kernels under normal load. Multiple independent reproductions exist on GitHub. This is not a theoretical bug — it is a point-and-shoot root escalation.
  • All standard compensating controls are bypassed: SELinux, seccomp, KASLR, SMEP, SMAP, container namespaces, and kernel lockdown provide zero protection. The attack operates at the filesystem block-allocation layer, below the enforcement points of every major Linux hardening mechanism. This is exceptionally rare and eliminates the defense-in-depth argument for derating.
  • Stealth and persistence compound the impact: The exploit generates no kernel log output, no audit events, and no SELinux denials. The resulting file corruption persists across reboots. An attacker can gain root and establish persistence with no detectable forensic signal unless file integrity monitoring is actively running with sub-minute polling.
  • Role multiplier: The Linux kernel on RHEL-family servers is the canonical infrastructure substrate. Well over 10% of RHEL-family deployments serve high-value roles: (1) CI/CD runners — local access is met by design since runners execute submitted code; root = supply-chain pivot; blast radius: supply chain. (2) Container/Kubernetes hosts — container breakout + this LPE = host root = lateral to all pods; blast radius: fleet. (3) Production database servers (Oracle, PostgreSQL on RHEL) — root = full data exfiltration of regulated data; blast radius: mass data egress. (4) KVM hypervisors on RHEL — root on hypervisor host = VM compromise; blast radius: tenant/fleet. The CRITICAL floor applies because the affected component (Linux kernel with default XFS reflink) is canonically high-value infrastructure, and the chain succeeds with fleet/supply-chain outcomes on a significant fraction of the installed base.
  • Local-access friction is real but insufficient to break the CRITICAL floor: The attacker must have a local shell — a genuine prerequisite. However, per the floor rules, a generic 'requires local access' statement is not sufficient to break the CRITICAL floor when high-value-role outcomes are fleet-scale. On CI/CD runners, local access is architecturally provided. On container hosts, container escape + this = root. On multi-user servers, any compromised service provides the foothold. The friction is a single step that is routinely cleared in real intrusion chains.

Why not higher?

A 10.0 would require unauthenticated remote exploitation with no prerequisites, or a wormable condition. This vulnerability requires local access (AV:L) and at minimum a low-privilege account (PR:L). The 9.0 score reflects that while the blast radius post-exploitation is devastating and compensating controls fail, the attacker must first establish a foothold on the target host through a separate vector.

Why not lower?

HIGH (7.8) — the vendor rating — underweights the real-world severity. The vendor CVSS captures the technical characteristics (local, low complexity, low privs) but does not account for: (1) default-on exposure across the entire RHEL ecosystem with no configuration required, (2) exceptional exploit reliability with multiple public PoCs, (3) total bypass of SELinux/seccomp/containers/KASLR/lockdown — eliminating the defense-in-depth cushion that normally justifies treating LPEs as HIGH, (4) zero forensic footprint making detection nearly impossible, and (5) the high-value-role multiplier where the chain produces fleet-scale or supply-chain-scale outcomes on CI/CD runners, container hosts, database servers, and hypervisors.

06 · Verification

Crowdsourced verification payload.

Run this script on each target host as any user (no root required). Invoke with: bash check_cve_2026_64600.sh. It checks the running kernel version against known-fixed upstream versions, queries RPM/dpkg changelogs for backported patches, and verifies whether any mounted XFS filesystem has reflink enabled. Exit code 1 = VULNERABLE, 0 = PATCHED, 2 = UNKNOWN.

noisgate-verify.sh
BASHREAD-ONLYSAFE
#!/usr/bin/env bash
# check_cve_2026_64600.sh — Detect CVE-2026-64600 (RefluXFS) exposure
# Run on target host as any user. No root required.
# Exit codes: 1=VULNERABLE, 0=PATCHED, 2=UNKNOWN

set -euo pipefail

RET_VULNERABLE=1
RET_PATCHED=0
RET_UNKNOWN=2

KERNEL=$(uname -r)
echo "[*] Running kernel: $KERNEL"

# --- Check for XFS with reflink=1 ---
REFLINK_ENABLED=false
XFS_MOUNTS=$(findmnt -t xfs -no TARGET 2>/dev/null || true)

if [[ -z "$XFS_MOUNTS" ]]; then
    echo "[*] No XFS filesystems mounted."
    echo "PATCHED — No XFS filesystems found. CVE-2026-64600 is not exploitable on this host."
    exit $RET_PATCHED
fi

for mp in $XFS_MOUNTS; do
    rl=$(xfs_info "$mp" 2>/dev/null | grep -o 'reflink=[0-9]' || echo "reflink=unknown")
    echo "[*] $mp: $rl"
    if [[ "$rl" == "reflink=1" ]]; then
        REFLINK_ENABLED=true
    fi
done

if [[ "$REFLINK_ENABLED" == "false" ]]; then
    echo "PATCHED — XFS mounted but reflink is not enabled. Not exploitable."
    exit $RET_PATCHED
fi

echo "[!] XFS with reflink=1 detected. Checking kernel version..."

# --- Check distro backport via package changelogs ---
if command -v rpm &>/dev/null; then
    for pkg in kernel-"$KERNEL" kernel-core-"$KERNEL"; do
        if rpm -q --changelog "$pkg" 2>/dev/null | grep -qi 'CVE-2026-64600'; then
            echo "PATCHED — $pkg changelog references CVE-2026-64600 fix."
            exit $RET_PATCHED
        fi
    done
fi

if command -v dpkg &>/dev/null; then
    cl="/usr/share/doc/linux-image-${KERNEL}/changelog.Debian.gz"
    if [[ -f "$cl" ]] && zgrep -qi 'CVE-2026-64600' "$cl" 2>/dev/null; then
        echo "PATCHED — Debian changelog references CVE-2026-64600 fix."
        exit $RET_PATCHED
    fi
fi

# --- Parse upstream kernel version ---
KVER=$(echo "$KERNEL" | grep -oP '^[0-9]+\.[0-9]+\.[0-9]+')
if [[ -z "$KVER" ]]; then
    echo "UNKNOWN — Cannot parse kernel version from: $KERNEL"
    exit $RET_UNKNOWN
fi

MAJOR=$(echo "$KVER" | cut -d. -f1)
MINOR=$(echo "$KVER" | cut -d. -f2)
PATCH=$(echo "$KVER" | cut -d. -f3)
echo "[*] Parsed upstream version: $MAJOR.$MINOR.$PATCH"

# --- Version range check ---
# Fixed: 5.15.212, 6.1.178, 6.6.145, 6.12.96, 6.18.39, 7.1.4
# Affected: 4.11 through each branch's fix
vuln=false

if (( MAJOR < 4 )) || { (( MAJOR == 4 )) && (( MINOR < 11 )); }; then
    vuln=false
elif (( MAJOR == 4 )) && (( MINOR >= 11 )); then
    vuln=true
elif (( MAJOR == 5 )) && (( MINOR <= 14 )); then
    vuln=true
elif (( MAJOR == 5 )) && (( MINOR == 15 )); then
    (( PATCH < 212 )) && vuln=true
elif (( MAJOR == 5 )) && (( MINOR >= 16 )); then
    vuln=true
elif (( MAJOR == 6 )) && (( MINOR == 0 )); then
    vuln=true
elif (( MAJOR == 6 )) && (( MINOR == 1 )); then
    (( PATCH < 178 )) && vuln=true
elif (( MAJOR == 6 )) && (( MINOR >= 2 )) && (( MINOR <= 5 )); then
    vuln=true
elif (( MAJOR == 6 )) && (( MINOR == 6 )); then
    (( PATCH < 145 )) && vuln=true
elif (( MAJOR == 6 )) && (( MINOR >= 7 )) && (( MINOR <= 11 )); then
    vuln=true
elif (( MAJOR == 6 )) && (( MINOR == 12 )); then
    (( PATCH < 96 )) && vuln=true
elif (( MAJOR == 6 )) && (( MINOR >= 13 )) && (( MINOR <= 17 )); then
    vuln=true
elif (( MAJOR == 6 )) && (( MINOR == 18 )); then
    (( PATCH < 39 )) && vuln=true
elif (( MAJOR == 6 )) && (( MINOR >= 19 )); then
    vuln=true
elif (( MAJOR == 7 )) && (( MINOR == 0 )); then
    vuln=true
elif (( MAJOR == 7 )) && (( MINOR == 1 )); then
    (( PATCH < 4 )) && vuln=true
fi

if [[ "$vuln" == "true" ]]; then
    echo ""
    echo "==> VULNERABLE — Kernel $KERNEL is in the affected range and XFS reflink=1 is active."
    echo "    Apply vendor kernel update and reboot immediately."
    exit $RET_VULNERABLE
else
    echo ""
    echo "==> PATCHED — Kernel $KERNEL appears at or above the fixed version."
    echo "    (Distro backports may not match upstream versions. Cross-check vendor errata.)"
    exit $RET_PATCHED
fi