CVE-2026-104795High· 8.8▾ TwilightThe 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 th…
▾ Twilight zone — High severity, or a signal on a lesser flaw
impact 48.4 · likelihood 0 · exploitation 0
Need a working PoC? Pro members can cast a request and our team develops one — it lands right here.
The insights-runtime-extractor runs as a privileged DaemonSet (hostPID: true)
that scans container processes for runtime fingerprinting. When scanning a
container, the coordinator:
/crio.sock is hostPath-mounted)seteuid(target_uid) — changing the effective UID but leaving
the real UID and saved-set-UID at 0 and retaining the permitted
capability setcheck_no_privileged_perms() guard inspects only the Effective capability
set (so it passes), and is skipped entirely when the target runs as uid 0VersionExecutable 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 workloadfpr_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 namespaceThe 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.
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))
}
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
}
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),
]);
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:
node, python, python3, MainThread,
or contains java)setuid(0) to restore rootCAP_SYS_ADMIN in the host user
namespaceRefer to the linked advisories for vendor-supplied fixes and affected version ranges.
Connected by shared product, vendor, weakness, or advisory.
CVE-2026-92817High· 8.8The Ignition Perspective module does not properly validate session privileges when determining Designer-level access
CVE-2026-110150High· 8.8Privilege elevation in Installer in Google Chrome on on Windows prior to 155.0.8059.79 allowed a local attacker to obtain sensitive information via a local program
CVE-2026-110036Low· 3.3A flaw was found in device-mapper-persistent-data
CVE-2026-80950Medium· 5.5kernel: i3c: renesas: Check that the transfer is valid before accessing it (CVE-2026-80950)
CVE-2026-80953Medium· 5.5kernel: i3c: master: adi: initialize the lock before enabling interrupts (CVE-2026-80953)
CVE-2026-80954Medium· 5.5kernel: i3c: Fix unlocked dereference of dev->desc in i3c_device_get_supported_xfer_mode() (CVE-2026-80954)