The probability is the direct output of the EPSS model, and conveys an overall sense of the threat of exploitation in the wild. The percentile measures the EPSS probability relative to all known EPSS scores. Note: This data is updated daily, relying on the latest available EPSS model version. Check out the EPSS documentation for more details.
In a few clicks we can analyze your entire application and see what components are vulnerable in your application, and suggest you quick fixes.
Test your applicationsThere is no fixed version for RHEL:7 openshift4/insights-runtime-extractor-rhel9.
Note: Versions mentioned in the description apply only to the upstream openshift4/insights-runtime-extractor-rhel9 package and not the openshift4/insights-runtime-extractor-rhel9 package as distributed by RHEL.
See How to fix? for RHEL:7 relevant fixed versions and status.
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
namespace