This was a poisoned flour shipment that only baked into bread in a few kitchens
CVE-2024-3094 was not a normal coding bug; it was malicious code hidden in upstream xz release tarballs that tainted liblzma during build time. The known bad upstream releases are 5.6.0 and 5.6.1, but downstream impact depends on which distros actually built from those tarballs and then shipped the result. In practice, the meaningful exposure clustered in fast-moving branches like Fedora 40 beta/Rawhide, Debian testing/unstable/experimental, some Arch artifacts, and a handful of other rolling environments rather than mainstream enterprise LTS fleets.
The vendor's 10.0/CRITICAL score describes the *worst-case impact* correctly: if all preconditions line up, this becomes pre-auth SSH compromise with full host takeover. But severity for patch planning should be downgraded from that vacuum score because the attack path has hard friction: specific xz versions, specific distro packaging choices, mostly x86_64, and a vulnerable sshd integration path. This is a HIGH for enterprise defenders because the blast radius on affected hosts is catastrophic, but the exposed population is much smaller than the raw CVSS implies.
4 steps from start to impact.
Build from the poisoned tarball
xz tarballs rather than a clean git snapshot. The malicious build-to-host.m4 logic extracts an obfuscated object from test files and splices it into liblzma during package build. This is the supply-chain stage; no exploit traffic exists yet because the badness is baked into the binary artifact.- The build consumed upstream
xz5.6.0or5.6.1tarballs - The packaging path executed the malicious autotools logic
- The resulting package was promoted into a repo, image, or host
- Most enterprise fleets never touched these versions
- Many stable/LTS distros never shipped affected binaries
- Git-snapshot builds and unaffected packaging paths break the chain early
Land a triggerable liblzma on SSH infrastructure
liblzma is loaded by sshd through distro-specific linkage and system integration choices. Research and vendor guidance showed the practical path was narrow: chiefly x86_64 Linux builds where OpenSSH ended up interacting with the compromised library in a pre-auth context. Public work such as amlweems/xzbot demonstrated the trigger path once a suitable host existed.- Affected host is typically
x86_64 sshdis present and linked into the vulnerable path- The distro build/runtime layout matches the backdoor's assumptions
- Not every affected package yielded a reachable SSH backdoor path
- Several distros shipped the bad package but not the full exploitable integration
- Architecture and stack-layout assumptions reduce portable exploitation
sshd links liblzma; internet-wide unauthenticated scanners cannot reliably infer exploitability.Reach the host over SSH
- TCP/22 or alternative SSH port is reachable from the attacker's position
- The vulnerable
sshdprocess is actually running
- Many enterprise SSH services are internal-only, VPN-gated, or management-network scoped
- Segmentation, bastions, and NAC reduce reachable population
Trigger pre-auth code execution
sshd context, effectively delivering unauthenticated remote code execution. The best-known public demonstration is xzbot, which weaponized the path for lab validation.- All prior build, packaging, runtime, and reachability conditions are satisfied
- The attacker can craft traffic matching the backdoor's trigger expectations
- The backdoor was fragile and environment-dependent
- No broad evidence emerged of reliable mass exploitation across heterogeneous fleets
sshd spawning shells or unusual children is valuable; signature-only scanning is weaker because the malicious logic lives in a trusted library.The supporting signals.
| In-the-wild status | No confirmed broad in-the-wild exploitation campaign has been established from the sources reviewed, but CISA issued an alert on 2024-03-29 due to the severity of the supply-chain compromise and the pre-auth SSH risk. |
|---|---|
| Public PoC / weaponization | Yes. Public exploit/demo work exists, most notably amlweems/xzbot, which makes this more than a theoretical lab curiosity. |
| EPSS | 0.85058 supplied in your intel block — extremely high probabilistic pressure, though EPSS here overstates enterprise urgency because exposed population was unusually narrow. |
| KEV status | Not KEV-listed in the reviewed CISA material; CISA published an alert, not a KEV entry. |
| CVSS vector reality check | CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H correctly models the end-state on a vulnerable host, but it ignores the strongest real-world prerequisite: only a small subset of Linux builds ever shipped a triggerable poisoned liblzma. |
| Affected version ranges | Upstream bad releases are 5.6.0 and 5.6.1. Debian says compromised packages appeared in testing/unstable/experimental from 5.5.1alpha-0.1 through 5.6.1-1 because of packaging history, while Red Hat narrowed its community impact to Fedora 40 beta/Rawhide. |
| Fixed versions / reversions | Upstream-safe rollback target was 5.4.6 stable per CISA. Debian reverted to 5.6.1+really5.4.5-1; Arch fixed at 5.6.1-2; openSUSE and others similarly reverted rather than trusting a forward minor update. |
| Exposure data | Wiz reported that while xz is ubiquitous, only about 2% of cloud environments they observed had vulnerable versions. That is the central reason this drops from vendor CRITICAL to operational HIGH. |
| Disclosure date | Public disclosure landed on 2024-03-29 via Andres Freund's oss-security post. |
| Reporting researcher / org | The compromise was discovered and disclosed by Andres Freund after noticing abnormal SSH CPU behavior and valgrind issues on Debian sid systems. |
noisgate verdict.
The decisive factor is population narrowing: catastrophic impact exists, but only on a relatively small set of hosts that actually shipped a triggerable poisoned liblzma into sshd. This is not a generic Linux-wide remote worm bug; it is a high-consequence compromise concentrated in rolling, beta, and testing channels plus any internal images built from the same upstream tarballs.
Why this verdict
- Downgrade from 10.0: vendor CVSS scores the end-state on the victim host, not the rarity of hosts that actually inherited the poisoned build artifact
- Requires a specific supply-chain path: attacker benefit exists only where
xz5.6.0/5.6.1tarballs were built and shipped; most enterprise LTS baselines never crossed that line - Exposure is empirically narrow: Wiz observed only about 2% of cloud environments with vulnerable versions, which is strong downward pressure on fleet-wide urgency
- But impact stays severe where present: if you do have an affected SSH host, this is pre-auth remote compromise with full host control, which keeps the verdict well above MEDIUM
Why not higher?
To earn CRITICAL in patch-ops terms, this needed broad exposed population or confirmed active exploitation at scale. Instead, the exploit chain depended on a rare combination of bad upstream tarball, distro packaging choice, runtime linkage, and reachable SSH service, which sharply limits enterprise-wide blast radius.
Why not lower?
This is still a backdoor in a core library with public weaponization and unauthenticated remote compromise potential on the affected hosts. If your org runs rolling Linux channels, dev images, CI runners, or hand-rolled base images, the impact of a single miss is too large to relegate this to backlog hygiene.
What to do — in priority order.
- Block suspect repos and images — Freeze promotion of Linux artifacts built during the exposure window and block package sources carrying
xz5.6.0/5.6.1; for a HIGH verdict, deploy this within 30 days, but do it immediately anywhere Fedora beta/Rawhide, Debian testing/unstable, or rolling images are in use. - Constrain SSH reachability — Reduce inbound SSH to bastions, VPN ranges, and admin networks so an affected host is not internet-reachable while you verify image lineage. Apply within 30 days as the primary blast-radius reduction if you cannot attest every Linux image quickly.
- Inventory and attest build provenance — Search package inventories, golden images, container bases, and CI runners for vulnerable
xzversions and for artifacts built from the bad tarballs. For a HIGH verdict, complete the inventory push within 30 days; this is the most reliable way to catch quietly inherited exposure. - Prefer known-good rebuilds over in-place trust — For suspect hosts, redeploy from known-good images or reverted packages rather than assuming an in-place version bump is enough. Execute within 30 days for containment confidence, especially on ephemeral cloud and CI estates.
- A WAF does nothing here; the vulnerable path is typically SSH, not HTTP.
- MFA for SSH is not a dependable compensating control because the malicious logic operates in the pre-authentication path before normal identity controls matter.
- Version-only external scanning is insufficient; many affected environments require authenticated inspection of packages, linkage, and image lineage.
Crowdsourced verification payload.
Run this on the target Linux host or inside a mounted rootfs of a golden image. Invoke it as sudo bash verify-cve-2024-3094.sh /usr/sbin/sshd; root is recommended so ldd, package metadata, and filesystem paths are all readable. The script outputs exactly VULNERABLE, PATCHED, or UNKNOWN and exits 1, 0, or 2 respectively.
#!/usr/bin/env bash
# verify-cve-2024-3094.sh
# Determine likely exposure to the xz/liblzma backdoor CVE-2024-3094.
# Exit codes: 0=PATCHED, 1=VULNERABLE, 2=UNKNOWN
set -u
SSHD_PATH="${1:-/usr/sbin/sshd}"
ARCH="$(uname -m 2>/dev/null || echo unknown)"
STATUS="UNKNOWN"
VERSION=""
PKGSTR=""
LINKS_LZMA="no"
REASON=""
have_cmd() {
command -v "$1" >/dev/null 2>&1
}
get_pkg_string() {
if have_cmd dpkg-query; then
if dpkg-query -W -f='${Version}' xz-utils >/dev/null 2>&1; then
dpkg-query -W -f='${Version}' xz-utils 2>/dev/null
return 0
fi
if dpkg-query -W -f='${Version}' liblzma5 >/dev/null 2>&1; then
dpkg-query -W -f='${Version}' liblzma5 2>/dev/null
return 0
fi
fi
if have_cmd rpm; then
if rpm -q xz-libs >/dev/null 2>&1; then
rpm -q --qf '%{VERSION}-%{RELEASE}.%{ARCH}' xz-libs 2>/dev/null
return 0
fi
if rpm -q xz >/dev/null 2>&1; then
rpm -q --qf '%{VERSION}-%{RELEASE}.%{ARCH}' xz 2>/dev/null
return 0
fi
fi
if have_cmd apk; then
if apk info -e xz-libs >/dev/null 2>&1; then
apk info -v xz-libs 2>/dev/null | head -n1
return 0
fi
if apk info -e xz >/dev/null 2>&1; then
apk info -v xz 2>/dev/null | head -n1
return 0
fi
fi
if have_cmd pacman; then
if pacman -Q xz >/dev/null 2>&1; then
pacman -Q xz 2>/dev/null | awk '{print $2}'
return 0
fi
fi
if have_cmd xz; then
xz --version 2>/dev/null | awk 'NR==1{print $4}'
return 0
fi
return 1
}
classify_pkg() {
local s="$1"
# Explicitly known fixed/reverted forms
case "$s" in
*really5.4.5*|*revertto5.4*|5.6.1-2*|5.6.0-r2*|5.6.1-r2*)
echo "safe"
return 0
;;
esac
# Explicit known vulnerable major upstream versions or package strings
case "$s" in
5.6.0|5.6.1|5.6.0-*|5.6.1-*|*5.6.0-1.fc40*|*5.6.0-2.fc40*|*5.6.1-1*|*5.5.1alpha-0.1*|*5.5.*alpha*|*5.6.0-r0*|*5.6.0-r1*|*5.6.1-r0*|*5.6.1-r1*)
echo "vuln"
return 0
;;
esac
# Plain semantic versions below 5.6.0 are treated as safe.
if [[ "$s" =~ ^([0-9]+\.[0-9]+\.[0-9]+)$ ]]; then
if printf '%s\n%s\n' "$s" "5.6.0" | sort -V | head -n1 | grep -qx "$s" && [[ "$s" != "5.6.0" && "$s" != "5.6.1" ]]; then
echo "safe"
return 0
fi
fi
# Common package strings containing clearly older versions
if echo "$s" | grep -Eq '5\.[0-4]\.|5\.5\.0|5\.4\.'; then
echo "safe"
return 0
fi
echo "unknown"
return 0
}
check_sshd_linkage() {
local sshd="$1"
if [[ ! -x "$sshd" ]]; then
echo "missing"
return 0
fi
if have_cmd ldd; then
if ldd "$sshd" 2>/dev/null | grep -qi 'liblzma'; then
echo "yes"
return 0
fi
echo "no"
return 0
fi
if have_cmd readelf; then
if readelf -d "$sshd" 2>/dev/null | grep -qi 'liblzma'; then
echo "yes"
return 0
fi
echo "no"
return 0
fi
echo "unknown"
}
PKGSTR="$(get_pkg_string 2>/dev/null || true)"
if [[ -z "$PKGSTR" ]]; then
echo "UNKNOWN"
exit 2
fi
VERSION_CLASS="$(classify_pkg "$PKGSTR")"
LINKS_LZMA="$(check_sshd_linkage "$SSHD_PATH")"
if [[ "$VERSION_CLASS" == "safe" ]]; then
echo "PATCHED"
exit 0
fi
if [[ "$VERSION_CLASS" == "vuln" ]]; then
# Strongest likely vulnerable case: x86_64 + sshd linked to liblzma
if [[ "$ARCH" == "x86_64" && "$LINKS_LZMA" == "yes" ]]; then
echo "VULNERABLE"
exit 1
fi
# Package is bad, but exploitable SSH path is unclear
echo "UNKNOWN"
exit 2
fi
echo "UNKNOWN"
exit 2
If you remember one thing.
xz immediately, focus first on rolling Linux channels, CI runners, golden images, and any SSH-exposed developer or staging hosts, then lock down suspect repos and SSH reachability while you verify lineage. For this HIGH verdict, the noisgate mitigation SLA is within 30 days and the noisgate remediation SLA is within 180 days; in practice, any confirmed affected host should be rebuilt or reverted now, while the rest of the fleet gets a documented hunt for poisoned artifacts rather than a blind all-Linux emergency.Sources
What defenders are saying.
Crowdsourced verification outputs.
Results submitted by users who ran the verification payload against their environment.