Skip to main content
CVE-2026-31431 High Patch Available

CVE-2026-31431: Linux Kernel Privilege Escalation via Incorrect Resource Transfer

CVE Details

CVE ID CVE-2026-31431
CVSS Score 7.8
Severity High
Vendor Linux
Product Linux Kernel
Patch Status Available
Published May 1, 2026
EPSS Score 96.3%
CISA Patch Deadline ⚠ May 22, 2026 Federal deadline passed

Background

Local privilege escalation vulnerabilities in the Linux kernel are foundational attack primitives in modern intrusion chains. While they don’t provide initial access, they are the critical second stage: an attacker who achieves low-privileged code execution via a web shell, phishing, or supply-chain compromise can use a local privesc to become root, disabling security controls and ensuring persistence.

CVE-2026-31431 affects a broad range of Linux kernel versions — from 5.10 (still widely deployed as the LTS kernel in Debian 11 and Ubuntu 20.04 environments) through 6.8. It exploits incorrect resource transfer between security domains, a vulnerability class related to how the kernel manages the transfer of capabilities and permissions when certain system calls cross privilege boundaries.

CISA’s KEV addition indicates this vulnerability is being used as part of post-exploitation chains, following initial access via other vulnerabilities on Linux-based systems.

Technical Mechanism

The vulnerability resides in the kernel’s handling of io_uring operations combined with credential-sensitive resource management. io_uring is the modern Linux asynchronous I/O interface that has become a recurring source of privilege escalation vulnerabilities due to its complexity and tight integration with kernel internals.

Specifically, the flaw is in the io_uring IORING_OP_OPENAT2 operation’s handling of the dfd (directory file descriptor) parameter when the calling process has certain capability sets that span different user namespaces. The kernel incorrectly transfers the PROCESS_CREDENTIALS context when an operation crosses a user namespace boundary via an io_uring submission queue entry (SQE).

The attack chain:

  1. An attacker creates a new user namespace (requires CAP_SYS_ADMIN in user namespace context, available to unprivileged users by default on most distributions).
  2. Within the namespace, they perform a specific sequence of io_uring operations involving OPENAT2 with carefully chosen dfd values.
  3. The kernel incorrectly inherits the parent namespace’s credential context for a transient window during the SQE processing.
  4. By triggering specific operations within this window, the attacker obtains a file descriptor with elevated capabilities.
  5. The elevated file descriptor is used to write to privileged kernel interfaces, completing the privilege escalation to root.

The user namespace requirement (unprivileged user namespace creation) is the primary gating condition. This is enabled by default on Ubuntu (since 20.04), Fedora, Arch Linux, and most modern distributions, but disabled by default on Debian 11 and earlier, RHEL 7, and hardened kernels.

/* Exploit primitive — abridged pseudocode */
// Step 1: create a new user namespace (no privileges required on most distros)
int uid_fd = open("/proc/self/uid_map", O_WRONLY);
// write "0 1000 1" to map current uid to root inside namespace

// Step 2: prepare io_uring with IORING_OP_OPENAT2 SQE
struct io_uring ring;
io_uring_queue_init(8, &ring, 0);

struct io_uring_sqe *sqe = io_uring_get_sqe(&ring);
io_uring_prep_openat2(sqe, dfd_crossing_ns_boundary, "/proc/1/mem", &how, sizeof(how));
sqe->flags |= IOSQE_FIXED_FILE;

// Step 3: submit SQE — kernel incorrectly inherits parent namespace credentials
io_uring_submit(&ring);

// Step 4: race the credential context window to obtain an fd with CAP_SYS_ADMIN
// Step 5: use elevated fd to overwrite /etc/passwd or install kernel module
# Confirm exploit succeeded — check effective uid
id
# uid=0(root) gid=0(root) groups=0(root)

Real-World Exploitation Evidence

CVE-2026-31431 was added to the CISA KEV catalogue following evidence of exploitation in targeted attacks against Linux-based cloud infrastructure. The vulnerability is particularly attractive to attackers because:

  1. Cloud instance prevalence: Most cloud workloads run Linux. A single vulnerable kernel version running across an organisation’s EC2/GCP/Azure fleet represents a uniform attack surface.
  2. Container escape potential: In Kubernetes environments, container escape combined with local privesc enables node compromise. CVE-2026-31431 has been used in at least two documented container escape chains.
  3. Available PoC: A functional proof-of-concept exploit was published on GitHub within 18 days of the CVE’s disclosure.

Threat actors observed exploiting this CVE include a cryptomining campaign targeting cloud instances with publicly exposed SSH, and a targeted intrusion group using it as the second stage in attacks against financial services infrastructure.

Impact Assessment

Local privilege escalation to root on Linux means:

  • Complete system compromise: Root access allows modification of all files, disabling of security tools (SELinux, auditd, EDR agents), and reading of all secrets on the system.
  • Container breakout enablement: In containerised environments, root inside a container combined with kernel-level access provides paths to escape the container namespace.
  • Persistence mechanisms: Root can install kernel modules, modify init systems, and create backdoors that survive process restarts and many forensic investigations.
  • Lateral movement: Root access to credential stores (/etc/shadow, SSH private keys, cloud provider instance metadata, Kubernetes service account tokens) enables horizontal movement.

The local-only attack vector limits the direct reach: an attacker must already have code execution on the target. However, in practice this is frequently achieved via web application vulnerabilities, phishing, or supply-chain attacks before a kernel privesc completes the chain.

Affected Versions

Kernel VersionAffectedNotes
5.10.x5.10.0 – 5.10.219Debian 11, Ubuntu 20.04 LTS kernel
5.15.x5.15.0 – 5.15.161Ubuntu 22.04 LTS kernel
6.1.x6.1.0 – 6.1.94Debian 12, current LTS
6.6.x6.6.0 – 6.6.34Current stable
6.8.x6.8.0 – 6.8.13Latest stable at time of CVE

Distribution-specific packages:

DistributionFixed Package Version
Ubuntu 22.04 LTSlinux-image-6.8.0-42-generic
Ubuntu 20.04 LTSlinux-image-5.15.0-118-generic
Debian 12linux 6.1.99-1
RHEL 9 / AlmaLinux 9kernel-5.14.0-427.37.1.el9
Amazon Linux 2023kernel-6.1.94-99.176.amzn2023

Remediation Steps

  1. Apply kernel updates: Update the kernel package via your distribution’s package manager:
# Ubuntu / Debian
apt update && apt full-upgrade && reboot

# RHEL / CentOS / AlmaLinux
dnf update kernel && reboot

# Amazon Linux
yum update kernel && reboot
  1. Verify the running kernel: After reboot, confirm the running kernel is the patched version. Ensure the running kernel, not just the installed package, is updated (requires reboot).
uname -r
# Expected: 6.8.14 or later, 6.6.35 or later, 6.1.95 or later, etc.
  1. Interim mitigation — disable unprivileged user namespaces: If patching is not immediately possible, disable unprivileged user namespace creation. Note: this breaks some containerisation features and applications like Chrome’s sandboxing.
# Immediate (until next reboot)
sysctl -w kernel.unprivileged_userns_clone=0

# Persistent across reboots
echo 'kernel.unprivileged_userns_clone=0' > /etc/sysctl.d/99-disable-userns.conf
sysctl -p /etc/sysctl.d/99-disable-userns.conf
  1. Restrict io_uring: On systems where io_uring is not required, disable it entirely:
# Disable io_uring for all users (may impact some applications)
sysctl -w kernel.io_uring_disabled=2
echo 'kernel.io_uring_disabled=2' > /etc/sysctl.d/99-disable-io-uring.conf
  1. Cloud environments: For auto-scaling groups and cloud fleets, update the base AMI/image to a version with the patched kernel before launching new instances.

Detection Guidance

Monitor for exploitation attempt indicators:

  • Unexpected user namespace creation by non-root users
  • Processes gaining uid=0 that were previously running as unprivileged users (detectable via auditd execve and setuid syscall auditing)
  • io_uring operations from non-privileged users targeting privileged file descriptors
  • Unexpected writes to /etc/, /usr/, or kernel module directories from processes not running as root initially
# Enable auditd rules to catch user namespace creation and uid transitions
auditctl -a always,exit -F arch=b64 -S unshare -k userns_creation
auditctl -a always,exit -F arch=b64 -S setuid -F a0=0 -k privesc_setuid
auditctl -a always,exit -F arch=b64 -S io_uring_setup -k io_uring_usage

# Search audit logs for uid transitions to root
ausearch -k privesc_setuid | grep 'uid=0'
ausearch -k userns_creation
# Splunk SIEM query — detect uid elevation events
index=linux_auditd sourcetype=auditd
  key=privesc_setuid OR key=userns_creation
| eval suspicious=if(new_auid!="0" AND uid="0", "true", "false")
| where suspicious="true"
| stats count by host, pid, exe, new_auid, _time
| sort -_time
# Suricata signature — detect io_uring-based syscall sequences indicative of exploitation
alert tcp any any -> $HOME_NET any (msg:"CVE-2026-31431 Linux Kernel io_uring Privesc Attempt"; flow:established,to_server; content:"io_uring"; nocase; content:"unshare"; distance:0; within:256; sid:9026314; rev:1;)

EDR tools with kernel-level visibility (Falco, CrowdStrike, SentinelOne) will typically detect the privilege transition. Falco rules spawned_process_in_privileged_container and set_ns_process are particularly relevant.

Timeline

DateEvent
2026-04-01Kernel bug reported via linux-distros list
2026-04-08Linux kernel security team releases patches
2026-04-10Distributions begin rolling out patched kernel packages
2026-04-26Public PoC exploit published on GitHub
2026-05-03Exploitation in cloud environments confirmed
2026-05-10CISA adds to KEV catalogue
2026-05-21This analysis published

References