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.
5 steps from start to impact.
Obtain local shell on target host
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.- Valid local account or code execution on the target host
- Requires prior foothold — cannot be exploited remotely without an initial access vector
Identify XFS reflink-enabled volume
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.- Root filesystem is XFS with reflink=1 (default on RHEL-family)
- Debian/Ubuntu default to ext4 — not affected unless admin explicitly chose XFS with reflink
Create reflink clone of target file
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.- Read access to target file (world-readable files like /etc/passwd qualify)
- Write access to any directory on the same XFS volume
- Target file must be on the same XFS filesystem as the attacker's scratch space
Trigger race condition with concurrent O_DIRECT writes
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.- Kernel version in affected range (4.11 – 7.1.3)
- XFS reflink=1 active
- None — the race is reliable on stock kernels under normal I/O load
Overwrite /etc/passwd or SUID binary to gain root
/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.- Successful race in step 4
getent passwd root showing empty password field, unexpected SUID binary checksums. File integrity monitoring is the primary detection vector.-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./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./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.- 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, andioctl— 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.
The supporting signals.
| In-the-Wild | No 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 Availability | Public 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. |
| EPSS | 0.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 Status | Not listed as of 2026-10-07. No CISA remediation deadline. |
| CVSS Vector | CVSS: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 Versions | Linux 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 Versions | Upstream 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 Estimate | Qualys 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 Timeline | 2026-07-22: Qualys coordinated disclosure via oss-security mailing list. 2026-07-24: NVD published. Upstream kernel patches merged into stable branches concurrently. |
| Researcher | Saeed 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.
- Qualys TRU Blog — RefluXFS Full Analysis
- NVD — CVE-2026-64600 Detail
- Red Hat — CVE-2026-64600 Advisory & SystemTap Mitigation
- GitHub PoC — 0xBlackash/CVE-2026-64600
- GitHub PoC — Debajyoti0-0/CVE-2026-64600
- Corgea Research — RefluXFS Technical Breakdown
- CloudLinux — KernelCare Live Patching Status
- SOC Prime — RefluXFS Detection Content
Why this verdict
- Default exposure eliminates configuration friction: XFS with
reflink=1is 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.
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.
#!/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