CVEReports
Reports
CVEReports

Automated vulnerability intelligence platform. Comprehensive reports for high-severity CVEs generated by AI.

Product

  • Home
  • Reports
  • Sitemap

Company

  • About
  • Privacy Policy
  • Terms of Service

© 2026 CVEReports. All rights reserved.

Powered by Google Gemini & CVE Feed

|
•

CVE-2024-3094
CVSS 10.0|EPSS 8.00%

The 500ms Delay That Saved the Internet: Dissecting the XZ Utils Backdoor

Amit Schendel
Amit Schendel
Senior Security Researcher•December 31, 2025•4 min read
Weaponized
CISA KEV Listed

Executive Summary (TL;DR)

A malicious backdoor was intentionally planted in XZ Utils (liblzma) versions 5.6.0 and 5.6.1. It hooks into OpenSSH via systemd dependencies, allowing an attacker to execute remote commands by sending a specific payload during the handshake. It was discovered by accident due to a 500ms latency increase.

In one of the most sophisticated supply chain attacks in history, a maintainer known as 'Jia Tan' spent years infiltrating the XZ Utils project to plant a backdoor. This vulnerability allows an attacker with a specific private key to execute arbitrary code as root on affected Linux systems via SSH, bypassing authentication completely.

The Hook: When Efficiency Become Suspicious

Most critical vulnerabilities are accidents—a buffer overflow here, a logic error there. This is not that. This is a masterclass in patience and malice. CVE-2024-3094 isn't a bug; it's a warhead.

It all started when Andres Freund, a Microsoft PostgreSQL developer, noticed that sshd was taking a few hundred milliseconds longer to start and consuming too much CPU. Most of us would blame DNS or just restart the service. Andres grabbed a profiler.

He found that liblzma, a compression library used by XZ Utils, was doing things it had no business doing inside the SSH daemon. Why is a compression library hanging out in your secure shell? Thanks to some distros patching OpenSSH to support systemd notifications, liblzma gets pulled in as a dependency. This created the perfect vector: a ubiquitous, boring library that nobody audits, running inside the most sensitive process on a Linux server.

The Long Con: Social Engineering at Scale

Before we look at the code, we have to respect the hustle. The persona 'Jia Tan' didn't just hack a server; they hacked the human trust model of open source. Starting in 2021, they submitted helpful patches. They fixed bugs. They answered emails. They pressured the burned-out original maintainer, Lasse Collin, citing mental health issues to gain commit access.

[!NOTE] The Lesson: This wasn't a technical exploit of code; it was an exploit of maintainer burnout.

By 2024, Jia Tan was a trusted maintainer. They used this trust to sneak the backdoor into the release tarballs of versions 5.6.0 and 5.6.1. Note the distinction: the backdoor was not in the public Git repository source code. It was injected only during the packaging process, hidden inside binary test files that looked like corrupted archives.

The Code: Hide and Seek in M4

The brilliance of this attack lies in its build-system obfuscation. The attacker didn't just write if (attacker) grant_root(). They hid the logic in build-to-host.m4, a macro file used during the ./configure stage.

This script unpacked a 'test file' (bad-3-corrupt_lzma2.xz), which was actually a pre-compiled object file. It then modified the Makefile to link this object file into liblzma. Here is a simplified view of the injection logic:

# The obfuscated script checks if we are building for Linux x86_64
if [[ "$host" == *linux* ]]; then
    # Extract the payload from the 'corrupt' test files
    eval "$($SED n-p $srcdir/tests/files/bad-3-corrupt_lzma2.xz | tr ...)"
fi

The script was designed to look like standard autotools junk—a language so unreadable that even seasoned C developers gloss over it. This allowed the backdoor to survive casual inspection.

The Mechanism: Abusing IFUNC

Once linked, how does a compression library hijack SSH? The attacker used the GNU Indirect Function (IFUNC) mechanism. IFUNC is intended to allow a program to select the most optimized version of a function (e.g., memcpy) at runtime based on the CPU's capabilities.

The backdoor registers an IFUNC resolver. When the dynamic linker loads liblzma, it calls this resolver. The resolver doesn't just check for AVX instructions; it walks the Global Offset Table (GOT) and looks for the symbol RSA_public_decrypt.

It replaces the real RSA_public_decrypt function pointer with its own malicious wrapper. Now, every time someone tries to authenticate via SSH, the backdoor gets the public key first.

The Exploit: The Magic Key

The backdoor is an RCE, but only for the person holding the private key. It doesn't allow anyone to login; it allows Jia Tan to login.

Inside the hijacked RSA_public_decrypt, the code inspects the incoming RSA certificate. It looks for a specific hidden payload signed with the attacker's Ed448 key. The crypto inside the backdoor is surprisingly robust, using a ChaCha20 implementation to decrypt the command payload.

If the signature verifies correctly against the hardcoded public key in the backdoor:

  1. The command is extracted.
  2. It is passed strictly to system().
  3. The backdoor essentially bypasses the rest of authentication and executes the command as root.

If the signature fails? It falls back to the original RSA_public_decrypt, and the login proceeds normally. This made the backdoor nearly invisible to network scanners.

Official Patches

DebianDebian Security Tracker
Red HatRed Hat Customer Portal

Fix Analysis (1)

Technical Appendix

CVSS Score
10.0/ 10
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H
EPSS Probability
8.00%
Top 4% most exploited

Affected Systems

Fedora RawhideFedora 40 BetaDebian Unstable (Sid)Kali LinuxopenSUSE TumbleweedArch Linux

Affected Versions Detail

ProductAffected VersionsFixed Version
xz-utils
Tukaani Project
= 5.6.05.6.2
xz-utils
Tukaani Project
= 5.6.15.6.2
AttributeDetail
CWE IDCWE-506
Attack VectorNetwork (Supply Chain)
CVSS v3.110.0 (Critical)
ImpactRCE / Auth Bypass
Exploit StatusWeaponized (In the wild)
ComplexityHigh (Nation-state level)

MITRE ATT&CK Mapping

MITRE ATT&CK Mapping

T1195.001Supply Chain Compromise: Compromise Software Dependencies and Development Tools
Initial Access
T1574.006Hijack Execution Flow: Dynamic Linker Hijacking
Persistence
T1059.004Command and Scripting Interpreter: Unix Shell
Execution
CWE-506
Embedded Malicious Code

Embedded Malicious Code. The product contains code that appears to be benign but performs malicious actions, such as a logic bomb or backdoor.

Exploit Resources

Known Exploits & Detection

GitHubxzbot - specific exploit tooling to detect and trigger the backdoor
OpenWallOriginal disclosure by Andres Freund including reproduction steps
NucleiDetection Template Available

Vulnerability Timeline

Vulnerability Timeline

Jia Tan (JiaT75) creates GitHub account
2021-02-01
XZ version 5.6.0 released with backdoor
2024-02-24
XZ version 5.6.1 released with 'fixes'
2024-03-09
Andres Freund posts discovery to oss-security
2024-03-29

References & Sources

  • [1]Russ Cox: XZ Timeline
  • [2]Gynvael's Deep Dive into the XZ Payload

Subscribe to updates

Get the latest CVE analysis reports delivered to your inbox.

Attack Flow Diagram

Press enter or space to select a node. You can then use the arrow keys to move the node around. Press delete to remove it and escape to cancel.
Press enter or space to select an edge. You can then press delete to remove it or escape to cancel.