CVE-2026-104795
Awaiting Analysis Awaiting Analysis - Queue

Privilege Escalation in insights-runtime-extractor via seteuid Bypass

Vulnerability report for CVE-2026-104795, including description, CVSS score, EPSS score, affected products, exploitability, helpful resources, and attack-flow context.

Publication date: 2026-10-14

Last updated on: 2026-10-14

Assigner: redhat-SADP

Description

The insights-runtime-extractor runs as a privileged DaemonSet (`hostPID: true`) that scans container processes for runtime fingerprinting. When scanning a container, the coordinator: 1. **fork()s** a child process 2. **setns()** into the target container's PID and mount namespaces 3. **fchdir()** back to an orphaned FD pointing at the extractor's own root filesystem (where `/crio.sock` is hostPath-mounted) 4. Calls **only `seteuid(target_uid)`** β€” changing the effective UID but leaving the **real UID and saved-set-UID at 0** and **retaining the permitted capability set** 5. The `check_no_privileged_perms()` guard inspects only the Effective capability set (so it passes), and is **skipped entirely when the target runs as uid 0** 6. The `VersionExecutable` fingerprint invokes `fpr_kind_executable` with `process.command_line[0]` β€” the target's argv[0], read from `/proc/<pid>/cmdline` and **fully controlled by the workload** 7. `fpr_kind_executable` calls `exec.Command(executable, "--version").Output()` β€” executing the **workload's own binary** inside the workload's mount namespace while **ruid=0 in the host user namespace** The executed process can call `setuid(0)` to restore full root with `CAP_SYS_ADMIN`, and inherits the orphaned cwd which resolves into the extractor container's filesystem containing the host CRI-O socket. ## Affected Code ### 1. Insufficient privilege drop (Rust β€” extractor coordinator) **File:** `extractor/src/insights_runtime_extractor.rs` ```rust // Lines 139-146 β€” seteuid-only drop, guard skipped for root containers join_process_namespaces(process.pid)?; change_dir(current_dir); switch_user(*process.uid)?; if *process.uid != 0 { perms::check_no_privileged_perms() .expect("Must not have privileged permissions to run fingerprints"); } fingerprint::run_fingerprints(&config, out_dir, &process); ``` ```rust // Lines 182-185 β€” only effective UID changed; ruid/suid stay 0 fn switch_user(uid: u32) -> Result<(), ScannerError> { debug!("... Becoming user: {uid}"); seteuid(uid.into()).map_err(|e| ScannerError::Errno(e)) } ``` ### 2. Execution of untrusted binary (Go β€” fingerprint) **File:** `fingerprints/pkg/utils/file.go` ```go // Lines 75-80 β€” executes a path taken verbatim from workload's argv[0] func GetExecutableVersionOutput(executable string) (string, error) { out, err := exec.Command(executable, "--version").Output() if err != nil { return "", err } return string(out), nil } ``` ### 3. Workload-controlled path forwarded (Rust β€” version_executable) **File:** `version_executable.rs` ```rust // Lines 29-34 β€” workload-controlled command_line[0] forwarded to fingerprint return Some(vec![ fpr_kind_executable, out_dir.to_string(), String::from(&process.command_line[0]), String::from(&version_executable.runtime_kind_name), ]); ``` ## Attack Pattern **Attacker:** Any tenant able to schedule a pod (unprivileged, any namespace) **Victim:** The node running the insights-runtime-extractor DaemonSet **Trigger:** Automatic β€” the DaemonSet scans all container processes on the node **Attack sequence:** 1. Attacker creates a pod whose process name matches a configured versioned-executable pattern (`node`, `python`, `python3`, `MainThread`, or contains `java`) 2. The pod's main binary (at the path matching argv[0]) is a malicious executable that calls `setuid(0)` to restore root 3. When the insights operator triggers a scan, the DaemonSet forks, enters the attacker's mount namespace, and executes the attacker's binary with ruid=0 4. The attacker's code regains full root with `CAP_SYS_ADMIN` in the host user namespace 5. The inherited cwd contains the host CRI-O socket β†’ full node compromise

CVSS Scores

EPSS Scores

Probability:
Percentile:

Meta Information

Published
2026-10-14
Last Modified
2026-10-14
Generated
2026-10-19
AI Q&A
2026-10-15
EPSS Evaluated
2026-10-18
NVD
EUVD

Affected Vendors & Products

Showing 1 associated CPE
Vendor Product Version / Range
Red Hat Red Hat OpenShift Container Platform 4 *

Helpful Resources

Exploitability

CWE
CWE Icon
KEV
KEV Icon
CWE ID Description
CWE-250 The product performs an operation at a privilege level that is higher than the minimum level required, which creates new weaknesses or amplifies the consequences of other weaknesses.

Attack-Flow Graph

AI Quick Actions

Instant insights powered by AI
Executive Summary

CVE-2026-104795 is a privilege escalation flaw in Red Hat's insights-runtime-extractor, a privileged DaemonSet that scans container processes. The extractor performs an incomplete privilege drop when scanning containers, using only seteuid() to change the effective UID while leaving real UID and saved-set-UID at 0 and retaining all Linux capabilities. This allows a malicious workload to supply a crafted binary that restores full root privileges via setuid(0), gaining CAP_SYS_ADMIN in the host user namespace and access to the host container runtime socket, leading to complete container escape with host-level root access.

Detection Guidance

Detect this vulnerability by checking for the insights-runtime-extractor DaemonSet running with hostPID: true and privileged permissions. Inspect the extractor's logs for scans of containers with process names matching configured patterns like node, python, python3, MainThread, or containing java. Look for commands executed with ruid=0 in the host namespace.

Impact Analysis

An attacker who can schedule a pod with a process name matching configured patterns (node, python, python3, MainThread, or containing java) can trigger this vulnerability. When the extractor scans the pod, it executes the attacker's binary with real UID 0, allowing the attacker to regain full root privileges and access the host CRI-O socket. This results in complete node compromise, enabling the attacker to control the host system and all containers running on it.

Compliance Impact

This vulnerability could lead to severe compliance violations under GDPR and HIPAA due to unauthorized root access and data breaches. GDPR requires strict access controls and breach notification; HIPAA mandates safeguards for protected health information. A successful exploit would compromise confidentiality, integrity, and availability of sensitive data, potentially resulting in regulatory fines, legal liabilities, and reputational damage for affected organizations.

Mitigation Strategies

Immediately update the insights-runtime-extractor to implement a complete privilege drop, including setting all three UID/GID fields, clearing all Linux capability sets, and setting PR_SET_NO_NEW_PRIVS before executing any fingerprint binary. Disable the DaemonSet until patched. Monitor for unauthorized access to the host CRI-O socket.

Chat Assistant

Ask questions about this CVE
Hi! I’m here to help you understand CVE-2026-104795. Ask me anything about the vulnerability, its impact, or mitigation strategies.
0/70

EPSS Chart