← Back to Feed CACHED · 2026-09-08 13:28:00 · CACHE_KEY CVE-2026-43502
CVE-2026-43502 · CWE-416 · Disclosed 2026-05-21

In the Linux kernel

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

A janitor who throws away the wrong set of keys, letting anyone who finds them walk into the vault

CVE-2026-43502 is a use-after-free in the Linux kernel's net/rds (Reliable Datagram Sockets) subsystem. When a zerocopy send fails after user pages have been pinned but *before* the message is attached to the sending socket, the purge path misidentifies the page ownership. It cleans up pinned zerocopy pages as if they were normal payload pages, freeing memory the kernel still references. An unprivileged local user can trigger this race to corrupt kernel memory and escalate to root. The bug was introduced in Linux 4.17 (February 2018) and affects every kernel up through pre-7.1-rc3 — an eight-year window. Fixed versions include mainline 7.1-rc3, Ubuntu 6.8.0-136.136 (noble), 5.15.0-186.196 (jammy), and 7.0.0-28.28 (plucky).

The vendor score of HIGH / 7.8 is accurate and needs no adjustment. The attack is local-only (AV:L) which caps remote risk, but three factors keep it firmly HIGH: (1) a polished public PoC ('ZcopyReaper' by NebuSec) removes the exploit-development barrier, (2) the RDS kernel module can be auto-loaded by an unprivileged user via socket(AF_RDS, ...) on default configurations of many distros unless kernel.modules_disabled or module blocklisting is in effect, and (3) the affected version range spans virtually every production kernel shipped in the last eight years. The vendor got this one right.

"Kernel LPE with public PoC; RDS auto-load widens reach on unhardened hosts."
02 · The Attack Path

5 steps from start to impact.

STEP 01

Local unprivileged shell obtained

The attacker has an unprivileged shell on the target Linux host. This could be via SSH with stolen creds, a compromised web application, or a container escape into the host namespace. No elevated capabilities are required.
Conditions required:
  • Local user account on the target host
  • Shell or code execution ability
Where this breaks in practice:
  • Requires prior initial access — this is a post-compromise chain
  • Container runtimes with seccomp profiles may block socket(AF_RDS, ...) syscall
Detection/coverage: EDR agents (CrowdStrike Falcon, SentinelOne) detect anomalous shell spawns from web services.
STEP 02

Trigger RDS module auto-load

The attacker calls socket(AF_RDS, SOCK_SEQPACKET, 0) which triggers the kernel's module auto-loader to load rds.ko if not already present. On default installs of RHEL, Ubuntu, SUSE, and Debian the module ships in the kernel package and auto-load is permitted for unprivileged users.
Conditions required:
  • RDS module available in /lib/modules/
  • Module auto-loading not disabled (kernel.modules_disabled=0)
  • No module blocklist entry for rds
Where this breaks in practice:
  • Hardened hosts with install rds /bin/true in modprobe.d block this
  • Container runtimes sharing the host kernel typically restrict module loading
  • Cloud VMs (AWS, GCP, Azure) on custom kernels may not ship rds.ko
Detection/coverage: Auditd rule on init_module / finit_module syscalls; Falco rule for unexpected module loads.
STEP 03

Race the zerocopy send path

Using the ZcopyReaper PoC, the attacker opens an RDS socket and initiates a zerocopy sendmsg() with pinned user pages, then forces a failure *after* page pinning but *before* the message is queued to the socket. The purge path misidentifies page ownership and frees the pinned pages while kernel references remain live.
Conditions required:
  • RDS module loaded (step 2)
  • Ability to call sendmsg() with MSG_ZEROCOPY
Where this breaks in practice:
  • Race window is tight; PoC reliability varies by kernel version and CPU count
  • KASAN-enabled debug kernels will detect the UAF and panic rather than allow exploitation
Detection/coverage: Kernel KASAN logs; runtime anomaly detection on rapid RDS socket churn by non-root users.
STEP 04

Corrupt kernel heap for privilege escalation

The freed pages are reallocated with attacker-controlled content via heap spraying (e.g., sendmsg on other sockets or add_key syscall). The attacker overwrites a kernel object (such as struct cred or a function pointer) to gain root privileges. The ZcopyReaper PoC demonstrated this on openSUSE 6.4.0-150600.23.100.
Conditions required:
  • Successful race from step 3
  • Predictable heap layout (SLUB allocator behavior)
Where this breaks in practice:
  • KASLR adds entropy to kernel addresses; requires info leak or brute force on some configs
  • CONFIG_SLAB_FREELIST_HARDENED and CONFIG_SLAB_FREELIST_RANDOM reduce spray reliability
Detection/coverage: EDR behavioral detection on commit_creds() from unexpected call path; kernel integrity monitoring.
STEP 05

Root shell — full host compromise

With overwritten credentials, the attacker's process now runs as uid 0. From here they can read /etc/shadow, install persistence (cron, systemd unit, kernel module), pivot laterally, or exfiltrate data. On a hypervisor or container host, this means control of all guest workloads.
Conditions required:
  • Successful heap corruption from step 4
Where this breaks in practice:
  • SELinux / AppArmor in enforcing mode constrains what even root can do
  • Immutable infrastructure (read-only root FS) limits persistence options
Detection/coverage: Host-based IDS detecting uid 0 transition from non-suid process; auditd ANOM_ROOT_TRANS events.
03 · Intelligence Metadata

The supporting signals.

In-the-Wild ExploitationNot confirmed. No reports from CISA KEV, Mandiant, or CrowdStrike as of 2026-09-08.
Proof-of-ConceptPublic. 'ZcopyReaper' by NebuSec. Demonstrated on openSUSE kernel 6.4.0-150600.23.100.
EPSS Score0.00123 (≈ top 30% — low probability of exploitation in next 30 days)
KEV StatusNot listed as of 2026-09-08
CVSS VectorCVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H — Local access, low complexity, low privilege, no user interaction. Full CIA impact, scope unchanged.
Affected VersionsLinux kernel 4.17 (commit 0cebaccef3ac, Feb 2018) through pre-7.1-rc3 (May 2026). Eight-year window covering virtually all production kernels.
Fixed VersionsMainline 7.1-rc3. Ubuntu: 7.0.0-28.28 (plucky), 6.8.0-136.136 (noble), 5.15.0-186.196 (jammy). RHEL/SUSE backports expected; check distro advisories.
Scanning / ExposureRDS is a local kernel module, not a network-exposed service. Shodan/Censys/GreyNoise have no relevance. Exposure is determined by whether rds.ko ships in the installed kernel package and module auto-load is permitted.
Disclosure Date2026-05-21 (upstream patch merged)
Researcher / OrgNebuSec security research team
04 · The Call

noisgate verdict.

Final Verdict
= UNCHANGED to HIGH (7.8/10)

The single most decisive factor sustaining this at HIGH is the public PoC combined with trivial RDS module auto-loading — an unprivileged local user can load the vulnerable module and exploit it without any special capabilities on default distro configurations. The local-access prerequisite prevents escalation to CRITICAL, but the eight-year affected range and proven exploit chain keep it firmly at HIGH.

HIGH Vulnerability technical analysis and affected versions
HIGH PoC availability and exploit mechanism
MEDIUM Real-world RDS module auto-load prevalence across enterprise fleets

Why this verdict

  • Public PoC removes exploit barrier: The ZcopyReaper PoC from NebuSec is published and demonstrated on a current enterprise kernel. This shifts the threat from theoretical to script-kiddie accessible for anyone with local access.
  • RDS auto-load broadens the target surface: On default RHEL, Ubuntu, SUSE, and Debian installs, an unprivileged user can call socket(AF_RDS, ...) to auto-load rds.ko, making the vulnerable code reachable even on hosts that never intentionally use RDS. This neutralizes the 'niche module' downgrade argument.
  • Eight-year affected range: Kernels from 4.17 (2018) to 7.1-rc3 (2026) are vulnerable. In a 10,000-host fleet, the vast majority of Linux hosts will be running a kernel in this range until patched.
  • Role multiplier: This is a *kernel* vulnerability. On hypervisor hosts (KVM), root compromise means control of all guest VMs — blast radius is fleet-scale. On container orchestration nodes (Kubernetes worker/control-plane), root on the host compromises all pods. On CI/CD build servers, root enables supply-chain poisoning. On database servers, root means unrestricted data access. Because the kernel is the affected component, ≥90% of installs are definitionally in a role where LPE to root has HIGH+ blast radius. The floor is HIGH.
  • Local-only caps at HIGH: AV:L means the attacker must already have a foothold. This is a post-initial-access privilege escalation, not a remote entry point. This single friction point prevents CRITICAL.

Why not higher?

A CRITICAL rating would require either remote exploitability or active in-the-wild exploitation. CVE-2026-43502 is strictly local (AV:L) — the attacker must already have an unprivileged shell on the target. There is no KEV listing and no confirmed campaigns. While the blast radius on high-value roles is severe, the prerequisite of prior access is a meaningful gate that separates this from CRITICAL-tier vulnerabilities like Zerologon or MOVEit.

Why not lower?

Downgrading below HIGH would require the module to be unreachable or the PoC to be unreliable. Neither is the case: RDS auto-loads on default distro configs, the PoC is public and demonstrated, and the affected kernel range spans eight years of production releases. The kernel is the most privileged component on any host — LPE to root is never MEDIUM when a working exploit exists and the module is reachable without admin help.

05 · Compensating Control

What to do — in priority order.

  1. Blocklist the RDS kernel module immediately — Add install rds /bin/true to /etc/modprobe.d/disable-rds.conf and run rmmod rds on hosts where it is loaded but not needed. This eliminates the attack surface entirely. Deploy within 30 days per noisgate mitigation SLA for HIGH. Most enterprise environments do not use RDS (it is Oracle RAC and HPC-specific).
  2. Restrict module auto-loading for unprivileged users — Set kernel.modules_disabled=1 after boot or use SELinux/AppArmor to deny sys_module capability to unprivileged processes. This prevents step 2 of the attack chain. Audit with sysctl kernel.modules_disabled.
  3. Enable kernel hardening options — Ensure CONFIG_SLAB_FREELIST_HARDENED, CONFIG_SLAB_FREELIST_RANDOM, and KASAN (in test environments) are active. These degrade heap spray reliability and make exploitation significantly harder.
  4. Deploy seccomp profiles in container environments — Container workloads should use seccomp profiles that block socket(AF_RDS, ...). The default Docker seccomp profile does NOT block AF_RDS — you need a custom profile. This protects container-to-host escape paths.
What doesn't work
  • Network firewalls / WAFs — This is a local kernel vulnerability, not a network service. No amount of network filtering prevents exploitation once an attacker has local access.
  • Disabling unprivileged user namespaces — NebuSec explicitly confirmed this does not mitigate CVE-2026-43502. The exploit does not depend on user namespaces.
  • KASLR alone — While KASLR adds difficulty, kernel address leaks are abundant (e.g., via /proc/kallsyms if readable, dmesg, or side channels). It is a speed bump, not a mitigation.
06 · Verification

Crowdsourced verification payload.

Run this script as root on each target Linux host. It checks whether the running kernel is in the affected range and whether the RDS module is loadable. Example: sudo bash check_cve_2026_43502.sh

noisgate-verify.sh
BASHREAD-ONLYSAFE
#!/bin/bash\n# check_cve_2026_43502.sh — CVE-2026-43502 (ZcopyReaper) detection\n# Run as root on each Linux host.\n# Exit codes: 0=VULNERABLE, 1=PATCHED, 2=UNKNOWN\n\nset -euo pipefail\n\nKVER=$(uname -r)\necho "[*] Running kernel: $KVER"\n\n# Check for known-patched distro kernels (Ubuntu examples)\nPATCHED=0\ncase "$KVER" in\n  7.0.0-28.28*|6.8.0-13[6-9].*|6.8.0-1[4-9][0-9].*|5.15.0-18[6-9].*|5.15.0-19[0-9].*|5.15.0-2[0-9][0-9].*)\n    PATCHED=1\n    ;;\nesac\n\n# Check mainline version\nMAJOR=$(echo "$KVER" | cut -d. -f1)\nMINOR=$(echo "$KVER" | cut -d. -f2)\nif [ "$MAJOR" -gt 7 ] 2>/dev/null; then\n  PATCHED=1\nelif [ "$MAJOR" -eq 7 ] && [ "$MINOR" -ge 1 ] 2>/dev/null; then\n  PATCHED=1\nfi\n\nif [ "$PATCHED" -eq 1 ]; then\n  echo "[+] PATCHED — kernel $KVER is at or above the fix level."\n  exit 1\nfi\n\n# Check if RDS module is loaded or loadable\nRDS_LOADED=0\nif lsmod | grep -q '^rds '; then\n  RDS_LOADED=1\n  echo "[!] RDS module is currently LOADED."\nfi\n\nRDS_AVAILABLE=0\nif modinfo rds &>/dev/null; then\n  RDS_AVAILABLE=1\n  echo "[!] RDS module is available for auto-loading."\nfi\n\n# Check blocklist\nRDS_BLOCKED=0\nif grep -rqs 'install rds /bin/true\|install rds /bin/false\|blacklist rds' /etc/modprobe.d/ 2>/dev/null; then\n  RDS_BLOCKED=1\n  echo "[*] RDS module is blocklisted in modprobe.d."\nfi\n\nif [ "$MAJOR" -lt 4 ] || { [ "$MAJOR" -eq 4 ] && [ "$MINOR" -lt 17 ]; }; then\n  echo "[+] PATCHED — kernel $KVER predates the vulnerable commit (4.17)."\n  exit 1\nfi\n\nif [ "$RDS_AVAILABLE" -eq 0 ] && [ "$RDS_LOADED" -eq 0 ]; then\n  echo "[*] UNKNOWN — kernel is in affected range but rds.ko not found. Likely not vulnerable."\n  exit 2\nfi\n\nif [ "$RDS_BLOCKED" -eq 1 ] && [ "$RDS_LOADED" -eq 0 ]; then\n  echo "[*] VULNERABLE (mitigated) — kernel in range, RDS blocklisted but not patched."\n  echo "VULNERABLE"\n  exit 0\nfi\n\necho "[!] VULNERABLE — kernel $KVER is in range 4.17–7.1-rc2 and RDS module is reachable."\necho "VULNERABLE"\nexit 0
07 · Bottom Line

If you remember one thing.

TL;DR
Monday morning: Push the RDS module blocklist (install rds /bin/true in /etc/modprobe.d/disable-rds.conf) to all Linux hosts that do not run Oracle RAC or RDS-dependent HPC workloads — this is your fastest compensating control and should be deployed within the 30-day noisgate mitigation SLA for HIGH. In parallel, begin kernel patching: Ubuntu has backports available now (6.8.0-136.136 for noble, 5.15.0-186.196 for jammy), and RHEL/SUSE advisories should be tracked for backport availability. Complete kernel patching across the fleet within the 180-day noisgate remediation SLA. If you run containerized workloads, audit your seccomp profiles for AF_RDS socket coverage this week. There is no KEV listing and no confirmed in-the-wild exploitation, so this is a disciplined patching exercise, not a fire drill — but the public PoC means the clock is ticking.

Sources

  1. SecurityOnline — ZcopyReaper PoC Disclosure
  2. Ubuntu Security — CVE-2026-43502
  3. GitHub Advisory — GHSA-mhq7-fqmq-29pq
  4. NVD — CVE-2026-43502
  5. NebuSec ZcopyReaper PoC Repository
  6. TuxCare — CVE-2026-43494 PinTheft (related RDS vuln)
  7. CVEMon — CVE-2026-43502 Overview
Peer Review

What defenders are saying.

Submit a review attribution: handle + country only
0 flags selected · stored anonymously
Validation Results

Crowdsourced verification outputs.

Results submitted by users who ran the verification payload against their environment.