Internet security research and reporting
Analysis Updated Retrospective · 2024 CVE-2024-3094

The xz backdoor: why reviewing the repository was not enough

The 2024 disclosure put release archives, generated build files and distribution-specific build conditions inside the trust boundary.

Release-only build material; Modified liblzma; Downstream libsystemd linkage; Relevant sshd process. Original diagram of the incident mechanism and review boundaries.
FISRO schematic: Release-only build material; Modified liblzma; Downstream libsystemd linkage; Relevant sshd process. FISRO

Summary

Andres Freund disclosed the xz/liblzma backdoor on 29 March 2024. Malicious release material in 5.6.0 and 5.6.1 made artefact provenance and build conditions central to exposure analysis. This retrospective explains why a version string, a repository review and a deployed binary answer different questions.

The release artefact was part of the attack

On 29 March 2024, Andres Freund disclosed a backdoor in upstream xz/liblzma release material. His report described suspicious SSH performance and diagnostic failures that led him to inspect the dependency. The affected release tarballs included 5.6.0 and 5.6.1; part of the malicious build machinery was present in the distributed tarballs rather than solely in the visible source repository.

That distinction is the heart of this case. Reviewing the repository does not establish what a release archive will build. Generated build files, bundled test data and release-only modifications can change the executable result. The trust boundary includes the process that turns reviewed source into distributed software.

A version string is an investigation lead

The Debian security tracker records affected source material and distribution-specific status. NixOS's contemporaneous analysis gives a useful counterexample to blanket version-based claims: it reported that its unstable branch included 5.6.1 but that the malicious build path exited without modifying the library. It still chose to downgrade as a precaution.

This does not make version scanning unhelpful. It means that presence, successful malicious build conditions and exploitable deployment are different findings. A defensible record keeps those stages apart.

Stage Evidence needed Unsafe shortcut
Source acquisition Exact archive and provenance Assuming a repository tag equals the release tarball
Build Distribution recipe, generated files and environment Assuming every build of a named version is identical
Installation Package identity and installed library Assuming the machine's package list proves what a process loaded
Reachability Application linkage and relevant configuration Calling every xz user an exploitable SSH server

What release engineering should preserve

Keep the downloaded source artefact, its digest, the build recipe and the resulting package identity together. A signature can establish who signed material and whether it changed after signing; it does not independently establish that the signed content is benign.

Where practical, compare release archives with the source tree and document generated additions. Differences are not automatically malicious: release tooling routinely produces files. The useful control is a reviewable explanation of the difference and a way to reproduce it, rather than an assumption that generated files are outside the security review.

FISRO proposes treating unfamiliar binary test fixtures and opaque build-time transformations as review prompts. That is an engineering recommendation derived from this case, not a claim that FISRO discovered another compromised project.

Containment requires an artefact history

For a suspected affected build, identify which systems and images received that precise package, then follow the distribution's incident guidance. Preserve enough evidence to understand where it came from before replacing it. A current clean package does not reconstruct an earlier container digest or a deleted build workspace.

Do not run unknown backdoor demonstrations against production hosts. Package provenance, vendor advisories and controlled artefact examination are the appropriate starting points. If compromise remains plausible, handle the host under the organisation's incident-response process rather than declaring success after a version downgrade.

A different failure from tj-actions

In the later tj-actions compromise, mutable version tags pointed workflows at malicious action code. xz and tj-actions affected different parts of the supply chain, but each undermined a convenient assumption that a familiar label identifies a reviewed execution path.

The comparison supports stronger artefact identity and review. It does not mean commit pinning alone would have prevented xz, or that a reproducible malicious build becomes trustworthy because it is reproducible. Controls need to answer both what ran and why it was accepted.

The downstream linkage made SSH relevant

Freund's disclosure described an x86-64 Linux build path and checks involving the toolchain and Debian/RPM-style packaging environment. The affected SSH relationship was indirect: certain downstream sshd builds linked through libsystemd, which brought liblzma into the process. Upstream OpenSSH's name alone does not establish that dependency chain.

Population at disclosure Relevant evidence Limit of the finding
Upstream 5.6.0 / 5.6.1 tarballs Original disclosure's release-only build material and conditions The version alone does not prove a malicious binary was produced
Debian stable bookworm Debian tracker records not affected for this CVE Do not transfer the stable-branch finding to testing or sid
NixOS unstable's contemporaneous build Security team's analysis said the malicious path exited The team still chose a precautionary downgrade
A particular SSH deployment Exact binary, library linkage and package provenance A package installed elsewhere does not establish this process's load chain

The distinction prevents a distribution-specific observation becoming a claim about every Linux host. It also explains why a repository review that ignores the distributed tarball misses part of the evidence.

Inspect package provenance without invoking a backdoor test

For Debian packaging, the installed source of the inventory can be queried directly:

dpkg-query -W -f='${Package}\t${Version}\n' xz-utils liblzma5

On an RPM-managed environment, the equivalent package identities can be read using:

rpm -q xz xz-libs

Package names and availability depend on the distribution. These commands do not establish the integrity of a binary or prove that the malicious build conditions were met. Match the full package release with the distribution's own assessment and preserve the installed artefact identity where the incident scope requires it.

For a collected release archive, hashing the file preserves an exact identifier without executing or unpacking it:

sha256sum collected-xz-release.tar.xz

Use the relevant supported hashing tool on the analysis platform. A digest establishes file identity for comparison; it does not establish that the contents are benign. Keep the archive's acquisition record and the build recipe alongside it.

Three supply-chain records describe different weak points

3CX's April 2023 reconstruction traced compromised software consumed by a vendor into its own build environment. SolarWinds' December 2020 disclosure involved trojanised updates delivered through a management-software channel. tj-actions in March 2025 redirected mutable action tags.

xz adds a precise artefact distinction: generated release material and build inputs could change the library without the security reviewer finding an equivalent obvious source-code modification in the expected place. Reproducibility can help explain a build, but reproducing malicious output does not make that output safe.

A useful release review therefore records the source archive, generated differences, build environment, resulting package and process linkage. The component name is an index into that record, not the entire trust decision.

Affected software and fixes

ComponentAffectedFixed inStatusEvidence
XZ Utils upstream release tarballs
Historical affected artefacts. Follow the distribution's current guidance; not a universal statement about every binary built from these versions.
5.6.0 and 5.6.1; malicious outcome depends on build conditions — Affected Andres Freund / oss-security
Debian bookworm (stable at disclosure)
Historical distribution status for this specific CVE.
— — Not affected Debian Security Team
Versions as stated by each evidence source. Last checked 30 October 2026. Check vendor advisories before acting; this table is not a substitute for them.

What to do

Identify the source archive, distribution package and resulting library. Compare the specific distribution build with its security assessment, then establish any relevant libsystemd-to-sshd linkage. Preserve artefact identity before replacement.

What remains unverified

A named xz version alone does not prove that a distribution built the malicious path or that a particular SSH service was exploitable. This is a synthesis of published evidence, not a new FISRO forensic investigation.

Timeline

  1. Andres Freund publicly discloses the upstream xz/liblzma backdoor. [Andres Freund / oss-security]

Methodology

AI-assisted research and drafting. The article synthesises the linked primary documents; technical examples are read-only checks or proposed exercises, not claimed FISRO reproductions. Dates and product conditions are attributed to their sources. Editorial interpretation and diagrams are identified as FISRO analysis.

Sources

Primary sources are maintainers, vendors, official bodies and original documents. Secondary sources are reporting by others.

  1. backdoor in upstream xz/liblzma leading to ssh server compromise Andres Freund / oss-security Primary Published 29 Mar 2024 Accessed 30 Oct 2026 Original disclosure and release-tarball/build distinctions.
  2. Debian Security Tracker: CVE-2024-3094 Debian Security Team Primary Accessed 30 Oct 2026 Distribution-specific affected status and malicious source-material description.
  3. Malicious code in xz 5.6.0 and 5.6.1 tarballs: NixOS assessment NixOS security team Primary Published 29 Mar 2024 Accessed 30 Oct 2026 Contemporaneous example of a distribution-specific build outcome.

Updates and corrections

  • Update · 30 October 2026, 01:39 UTC
    Expanded technical conditions, read-only diagnostics, incident comparisons and original diagrams; AI-assisted drafting disclosed. Original publication date retained.

Found an error? Request a correction. We record every substantive change on this page, as set out in our corrections policy.

Related coverage