CVE-2026-104795 — The insights-runtime-extractor runs as a privileged DaemonSet (hostPID: true)¶
Key facts
CVE-2026-104795 is a High (8.8) vulnerability: The insights-runtime-extractor runs as a privileged DaemonSet (hostPID: true). This entry ships a detection-only PoC and a Docker test lab.
| CVE | CVE-2026-104795 |
| Severity | High (8.8) |
| Detection / prevention | — |
| PoC | poc.py |
| Source | 2026/CVE-2026-104795/ |
Details¶
English | 한국어
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:
- fork()s a child process
- setns() into the target container's PID and mount namespaces
- fchdir() back to an orphaned FD pointing at the extractor's own root
filesystem (where
/crio.sockis hostPath-mounted) - 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 - 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 - The
VersionExecutablefingerprint invokesfpr_kind_executablewithprocess.command_line[0]— the target's argv[0], read from/proc/<pid>/cmdlineand fully controlled by the workload fpr_kind_executablecallsexec.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
// 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);
// 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
// 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
// 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:
- Attacker creates a pod whose process name matches a configured
versioned-executable pattern (
node,python,python3,MainThread, or containsjava) - The pod's main binary (at the path matching argv[0]) is a malicious
executable that calls
setuid(0)to restore root - 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
- The attacker's code regains full root with
CAP_SYS_ADMINin the host user namespace - The inherited cwd contains the host CRI-O socket → full node compromise
Vulnerability Details¶
| Property | Value |
|---|---|
| CVE ID | CVE-2026-104795 |
| CVSS Score | 8.8 |
Proof of Concept¶
Download¶
# Download PoC script
curl -O https://raw.githubusercontent.com/fankh/vulnerability-poc/main/2026/CVE-2026-104795/poc.py
Usage¶
# Run PoC against target
python3 poc.py --target <TARGET_URL>
# With authentication
python3 poc.py --target <TARGET_URL> --username <USER> --password <PASS>
⚠️ Warning: This PoC is for authorized security testing only. It uses detection-only techniques and does not exploit or damage target systems.
Test Lab¶
This repository includes a Docker-based test environment with both vulnerable and patched applications.
Quick Start¶
# Clone and navigate to CVE directory
cd CVE-2026-104795
# Start both applications
docker-compose up -d
# Run tests
./run-tests.sh # Linux/Mac
./run-tests.ps1 # Windows PowerShell
Application Endpoints¶
| Application | URL | Status |
|---|---|---|
| Vulnerable App | http://localhost:8080 | Shows vulnerability |
| Patched App | http://localhost:8081 | Demonstrates fix |
Directory Structure¶
├── README.md # English documentation
├── README_KO.md # Korean documentation
├── poc.py # PoC detection script
├── docker-compose.yml # Container orchestration
├── run-tests.sh # Linux/Mac test runner
├── run-tests.ps1 # Windows test runner
├── vulnerable-app/ # Vulnerable version
│ ├── app.py
│ ├── Dockerfile
│ └── requirements.txt
└── patched-app/ # Fixed version
├── app.py
├── Dockerfile
└── requirements.txt
References¶
- https://access.redhat.com/security/cve/CVE-2026-104795
- https://bugzilla.redhat.com/show_bug.cgi?id=2543917
Generated by PoC Generator on 2026-10-14T22:03:05.008548607
Frequently asked questions¶
What is CVE-2026-104795?¶
CVE-2026-104795 is a High (8.8) vulnerability: The insights-runtime-extractor runs as a privileged DaemonSet (hostPID: true). This entry ships a detection-only PoC and a Docker test lab.
How do I detect CVE-2026-104795?¶
Run the detection-only PoC included with this entry against your Docker test lab to confirm whether a target is affected; pair it with your own IDS logging.
How do I block or mitigate CVE-2026-104795?¶
Upgrade to a fixed version per the vendor advisory; the NVD record lists the affected versions. Use the included PoC to verify your remediation.
For authorized security testing and research only. See the full source and NVD record.