A compromised passenger climbs from the cargo hold into the cockpit because the door was never locked
Eclipse Bluechi is a multi-node systemd service controller. It lets a single 'host' node orchestrate systemd units on a fleet of 'managed' nodes — its flagship deployment is Red Hat's RHIVOS (in-vehicle OS) and similar automotive/edge platforms. The flaw (CWE-863, incorrect authorization) is that Bluechi doesn't restrict cross-node systemd dependencies: a process with root on a managed node can craft a unit file whose Requires=/Wants=/Before= relationships reach back to the *host* node, causing the host to execute or override unit files on the attacker's behalf. Affected versions are everything prior to the upstream fix shipped by the Eclipse Bluechi project and backported by Red Hat in late 2025; the GHSA does not yet pin specific version numbers.
Red Hat's HIGH / 7.2 rating is defensible *inside the RHIVOS threat model*, where a managed node is a less-trusted partition (the qm container) and the host is the safety-critical OS — crossing that boundary is exactly the design failure CVSS scope-change is meant to flag. For a typical enterprise patch queue, the rating is generous: the attacker already needs root on a managed node, the vector is AV:P (Physical), EPSS is 0.00178 (8th percentile), there is no public PoC, no KEV listing, and Bluechi has essentially zero install base outside automotive/edge stacks. Net effect: real bug, narrow audience, MEDIUM in a general enterprise context.
4 steps from start to impact.
Obtain root on a Bluechi-managed node
qm Quadlet/container hosting less-trusted workloads). This is *not* a remote-unauth entry point — it is a post-compromise escalation primitive that assumes another bug or insider access got you root on the managed side first.- Pre-existing root on a managed node
- Bluechi agent running and connected to a host controller
- No remote vector — requires a prior chain
- Managed nodes in RHIVOS are SELinux-confined and short-lived
Author a malicious systemd unit with cross-node dependencies
[email protected] or equivalent agent-mediated reference). Because Bluechi's controller does not authorize whether a managed node is *permitted* to influence host-side units, the dependency is accepted as legitimate orchestration traffic.- Write access to
/etc/systemd/systemon the managed node - Bluechi agent willing to forward dependency requests
- Requires knowledge of Bluechi's unit-naming and proxy conventions
- Host-side unit names must be guessable or enumerable
Trigger the dependency to execute on the host node
- Working Bluechi control channel between nodes
- Target host-side unit (or attacker-supplied unit) loadable by systemd
- Some deployments restrict the controller's writable unit paths via ReadOnlyPaths=
- RHIVOS safety-critical units are signed and protected by IMA/EVM in newer builds
Full host compromise / fleet pivot
- Host-side root execution achieved in Step 3
- Functional-safety partitions may still be gated by hypervisor (QEMU/KVM + sVirt) policy
- Defender-side recovery via signed A/B image rollback in automotive contexts
The supporting signals.
| In-the-wild exploitation | None observed. No campaigns, no GreyNoise tags, no Shodan/Censys signals — Bluechi is not internet-exposed by design. |
|---|---|
| Public PoC | None published. No GitHub repos, Metasploit modules, or researcher write-ups as of disclosure. |
| EPSS | 0.00178 (~8th percentile) — the model considers exploitation extremely unlikely in the next 30 days. |
| KEV status | Not listed by CISA. |
| CVSS vector | CVSS:3.1/AV:P/AC:L/PR:H/UI:N/S:C/C:H/I:H/A:H — Physical vector and High privileges already required; scope-change is what pushes it to 7.2. |
| Affected versions | Bluechi prior to the Eclipse upstream fix landed late 2025; GHSA-hcr2-46j7-rjhp does not pin exact versions. Track Red Hat advisory for backport into RHIVOS / bluechi package builds. |
| Fixed versions | Upstream Eclipse Bluechi patch + Red Hat-backported bluechi and bluechi-agent RPMs shipped through RHIVOS errata. |
| Exposure / install base | Niche. Primary deployments are RHIVOS in-vehicle OS and a handful of edge-orchestration pilots. Negligible Shodan/Censys footprint — Bluechi communicates over local D-Bus and TCP within the vehicle/cluster trust boundary. |
| Disclosure | GHSA published 2025-12-24; coordinated through Red Hat Product Security and Eclipse Foundation. |
| Reporter | Red Hat Product Security (no individual researcher credited in the GHSA at time of writing). |
noisgate verdict.
Downgraded to MEDIUM because the single most decisive factor is install base — Bluechi is a niche automotive/edge orchestrator with essentially no presence in general enterprise IT, and even where it runs, the attacker must already hold root on a managed node before the chain begins. Vendor's 7.2 is fair inside the RHIVOS safety model; it is too high for a 10,000-host enterprise CMDB that doesn't ship cars.
Why this verdict
- Pre-existing root required: PR:H means the attacker has already compromised one node — this is a lateral/escalation primitive, not an initial-access bug. Friction adjustment: −1.0.
- AV:P (Physical) vector: CVSS itself classifies the attack surface as physical-adjacent; remote exploitation is not in scope. Friction adjustment: −0.7.
- Install base is automotive/edge-only: Bluechi's flagship deployment is RHIVOS in-vehicle OS; install base in general enterprise is effectively zero. For the typical noisgate reader, the population at risk rounds to nothing. Friction adjustment: −1.0.
- No exploitation signal: EPSS 0.00178, not KEV-listed, no public PoC, no GreyNoise traffic — exploit development cost is high and reward niche. Friction adjustment: −0.5.
- Role multiplier: Bluechi *is* a control-plane component on the systems where it runs — a successful chain ends in host-node root and fleet pivot across managed nodes. That triggers the high-value-role floor of MEDIUM for enterprise readers (install base <1%), and would floor at HIGH for organizations actually running RHIVOS or Bluechi-managed fleets. RHIVOS operators should treat this as HIGH per the canonical orchestrator rule.
Why not higher?
Not HIGH for the general enterprise audience because the install base is vanishingly small, the attacker needs PR:H on a managed node before the bug is reachable, and the CVSS vector is AV:P. Without remote reachability or a broad install base, HIGH would misallocate patching attention away from genuinely externally reachable bugs.
Why not lower?
Not LOW or IGNORE because the underlying flaw is a real authorization break in an orchestrator: where Bluechi *is* deployed, it sits in the trust boundary between less-trusted and safety-critical partitions, and the chain ends in full host compromise. Anyone running RHIVOS, the bluechi RPM, or an edge Quadlet stack must treat it as a HIGH-floor bug per the canonical-orchestrator rule.
What to do — in priority order.
- Inventory for the
bluechiandbluechi-agentpackages — Run a one-shot package query across your fleet (rpm -qa | grep bluechi, Ansible ad-hoc, or your existing CMDB query) to confirm whether you have any install base at all. For 99% of enterprise readers this returns zero and the CVE moves to documented-and-closed. No mitigation SLA applies (MEDIUM verdict) — complete the sweep as part of normal monthly hygiene. - Restrict writable unit-file paths on managed nodes — On any host running
bluechi-agent, harden systemd'sUnitPath=and applyReadOnlyPaths=/etc/systemd/systemvia a drop-in for the agent service. This prevents a root-on-managed-node attacker from authoring the malicious unit in Step 2 of the chain. Roll out within the standard 365-day MEDIUM remediation window per noisgate SLA. - Enforce SELinux confinement on bluechi-agent — Verify the agent runs under a confined domain (RHIVOS ships
bluechi_agent_t) and that policy denies unit-file writes from non-admin domains. Useausearch -m AVC -ts recent | grep bluechito confirm denials are being logged. - Ship Bluechi controller logs to your SIEM — Forward host-node
journalctl -u bluechi-controllerand managed-nodebluechi-agentlogs. Alert on cross-node unit activations that didn't originate from your orchestration pipeline — that's the high-signal detection for Step 3.
- Network segmentation alone — Bluechi's control channel is *expected* between nodes; blocking it breaks orchestration without addressing the authorization flaw.
- EDR on the host node — most EDR products are not deployed inside RHIVOS partitions, and even where deployed they don't model systemd dependency graphs as a primitive.
- WAF / reverse proxy controls — irrelevant; Bluechi does not speak HTTP and the flaw is not at the network protocol layer.
- MFA / identity hardening — the attacker already has root on a managed node; identity controls don't gate the authorization bug.
Crowdsourced verification payload.
Run this on each suspected Bluechi host (managed node *or* controller) as root or via your config-management agent: sudo bash check-cve-2025-2515.sh. It checks for the bluechi/bluechi-agent packages, compares versions against the Red Hat-fixed build, and reports VULNERABLE / PATCHED / UNKNOWN.
#!/usr/bin/env bash
# check-cve-2025-2515.sh — Bluechi cross-node systemd dependency authorization flaw
# Exit codes: 0 = PATCHED or NOT_INSTALLED, 1 = VULNERABLE, 2 = UNKNOWN
set -u
FIXED_RHEL='0.9.0-1' # placeholder — replace with the RHSA-pinned fixed NVR for your stream
FIXED_UPSTREAM='0.9.0' # upstream Eclipse Bluechi tag containing the auth check
found=0
status='PATCHED'
for pkg in bluechi bluechi-agent bluechi-controller; do
if rpm -q "$pkg" >/dev/null 2>&1; then
found=1
ver=$(rpm -q --qf '%{VERSION}-%{RELEASE}\n' "$pkg")
echo "[*] $pkg installed: $ver"
# rpmdev-vercmp returns 11 if $ver < FIXED_RHEL, 12 if greater, 0 if equal
if command -v rpmdev-vercmp >/dev/null 2>&1; then
rpmdev-vercmp "$ver" "$FIXED_RHEL" >/dev/null 2>&1
rc=$?
case $rc in
0|12) : ;; # equal or newer → still patched
11) status='VULNERABLE' ;;
*) status='UNKNOWN' ;;
esac
else
status='UNKNOWN'
fi
fi
done
if [ $found -eq 0 ]; then
echo 'NOT_INSTALLED'
exit 0
fi
# Bonus: surface agent process so you know the daemon is actually running
if pgrep -a bluechi-agent >/dev/null 2>&1 || pgrep -a bluechi-controller >/dev/null 2>&1; then
echo '[*] Bluechi daemon active'
fi
echo "$status"
case $status in
PATCHED) exit 0 ;;
VULNERABLE) exit 1 ;;
*) exit 2 ;;
esac
If you remember one thing.
rpm -qa | grep bluechi sweep across your CMDB — for the vast majority of enterprises this returns nothing and the ticket closes with a documented N/A. If you *do* surface any bluechi/bluechi-agent installs (RHIVOS pilots, edge-orchestration POCs, automotive build labs), treat them as the HIGH-floor subset per the canonical-orchestrator rule: deploy ReadOnlyPaths/SELinux hardening on agent nodes within the noisgate mitigation SLA of 30 days and roll the Red Hat-backported bluechi RPM within the noisgate remediation SLA of 180 days. For everyone else the verdict is MEDIUM with no mitigation SLA — go straight to the 365-day remediation window and prioritize anything internet-reachable above it.Sources
What defenders are saying.
Crowdsourced verification outputs.
Results submitted by users who ran the verification payload against their environment.