← Back to Feed CACHED · 2026-05-17 09:42:19 · cache_key CVE-2025-29912
CVE-2024-3094 · CWE-506 · Disclosed 2024-03-29

Malicious code was discovered in the upstream tarballs of xz

ASSESSED — NOISGATE V0.5
Vendor
Reassessed
Verdict:
01 · The Real Story

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.

"Terrible impact, narrow real-world exposure: treat it as a high-priority hunt-and-patch, not a fleet-wide critical fire."
02 · The Attack Path

4 steps from start to impact.

STEP 01

Build from the poisoned tarball

The attacker wins only if a distribution or internal build pipeline consumed the compromised upstream 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.
Conditions required:
  • The build consumed upstream xz 5.6.0 or 5.6.1 tarballs
  • The packaging path executed the malicious autotools logic
  • The resulting package was promoted into a repo, image, or host
Where this breaks in practice:
  • 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
Detection/coverage: Traditional network scanners miss this stage; authenticated package/version checks and SBOM/image provenance reviews are the main coverage.
STEP 02

Land a triggerable liblzma on SSH infrastructure

Impact becomes dangerous when the tainted 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.
Conditions required:
  • Affected host is typically x86_64
  • sshd is present and linked into the vulnerable path
  • The distro build/runtime layout matches the backdoor's assumptions
Where this breaks in practice:
  • 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
Detection/coverage: Authenticated host checks can confirm package versions and whether sshd links liblzma; internet-wide unauthenticated scanners cannot reliably infer exploitability.
STEP 03

Reach the host over SSH

An external attacker still needs network reachability to the target's SSH service. If present, the backdoor operates before normal authentication completes, so a valid user account is not required. This is the part CVSS fixates on, but it only matters after the earlier supply-chain and runtime prerequisites are already true.
Conditions required:
  • TCP/22 or alternative SSH port is reachable from the attacker's position
  • The vulnerable sshd process is actually running
Where this breaks in practice:
  • Many enterprise SSH services are internal-only, VPN-gated, or management-network scoped
  • Segmentation, bastions, and NAC reduce reachable population
Detection/coverage: External attack-surface tools may find exposed SSH, but they do not prove the xz backdoor is present.
STEP 04

Trigger pre-auth code execution

With the right host, exploit traffic can invoke the malicious logic during SSH authentication handling and execute attacker-controlled commands as the sshd context, effectively delivering unauthenticated remote code execution. The best-known public demonstration is xzbot, which weaponized the path for lab validation.
Conditions required:
  • All prior build, packaging, runtime, and reachability conditions are satisfied
  • The attacker can craft traffic matching the backdoor's trigger expectations
Where this breaks in practice:
  • The backdoor was fragile and environment-dependent
  • No broad evidence emerged of reliable mass exploitation across heterogeneous fleets
Detection/coverage: Behavioral telemetry on sshd spawning shells or unusual children is valuable; signature-only scanning is weaker because the malicious logic lives in a trusted library.
03 · Intelligence Metadata

The supporting signals.

In-the-wild statusNo 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 / weaponizationYes. Public exploit/demo work exists, most notably amlweems/xzbot, which makes this more than a theoretical lab curiosity.
EPSS0.85058 supplied in your intel block — extremely high probabilistic pressure, though EPSS here overstates enterprise urgency because exposed population was unusually narrow.
KEV statusNot KEV-listed in the reviewed CISA material; CISA published an alert, not a KEV entry.
CVSS vector reality checkCVSS: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 rangesUpstream 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 / reversionsUpstream-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 dataWiz 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 datePublic disclosure landed on 2024-03-29 via Andres Freund's oss-security post.
Reporting researcher / orgThe compromise was discovered and disclosed by Andres Freund after noticing abnormal SSH CPU behavior and valgrind issues on Debian sid systems.
04 · The Call

noisgate verdict.

Final Verdict
DOWNGRADED to HIGH (8.4/10)

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.

HIGH Affected-version and distro-scope narrowing
MEDIUM Breadth of reliably triggerable remote exploitation across all affected builds

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 xz 5.6.0/5.6.1 tarballs 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.

05 · Compensating Control

What to do — in priority order.

  1. Block suspect repos and images — Freeze promotion of Linux artifacts built during the exposure window and block package sources carrying xz 5.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.
  2. 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.
  3. Inventory and attest build provenance — Search package inventories, golden images, container bases, and CI runners for vulnerable xz versions 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.
  4. 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.
What doesn't work
  • 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.
06 · Verification

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.

noisgate-verify.sh
BASHREAD-ONLYSAFE
#!/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
07 · Bottom Line

If you remember one thing.

TL;DR
Monday morning: pull a package/image inventory for 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

  1. Openwall disclosure by Andres Freund
  2. Red Hat Fedora alert
  3. CISA alert
  4. Debian DSA-5649-1
  5. Ubuntu CVE page
  6. Arch Linux security tracker
  7. Wiz vulnerability analysis
  8. Public exploit demo xzbot
Peer Review

What defenders are saying.

Submit a review attribution: handle + country only
0 flags selected · stored anonymously
Validation Results

Crowdsourced verification outputs.

Results submitted by users who ran the verification payload against their environment.