Skip to main content

lz4-java CVE-2026-106449

| EUVDEUVD-2026-93862 LOW
Uncontrolled Recursion (CWE-674)
2026-10-06 security-advisories@github.com GHSA-343h-94h5-c4wr
3.7
CVSS 3.1 · Vendor: github
View

Attack ChainAIDerived

Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain

  1. Access
    Attacker controls inbound LZ4 compressed stream
  2. Delivery
    Craft long run of empty LZ4 blocks
  3. Exploit
    Victim decodes with stopOnEmptyBlock=false
  4. Execution
    Recursive refill() exhausts thread stack
  5. Impact
    StackOverflowError crashes decoding thread (DoS)

Vulnerability Assessment

Weakness
CWE
ASVS 5.0
V15 - Secure Coding and Architecture Recursion depth limits
Exploitation Conditions

Exploitation requires the consuming application to use net.jpountz.lz4.LZ4BlockInputStream with stopOnEmptyBlock explicitly set to false - this is NOT the default (the default true is unaffected) and is the primary limiting factor. The attacker must also control, or be able to inject, the compressed LZ4 block stream fed to that input stream. Given those conditions, no authentication is needed (PR:N) and no user interaction is required, but the non-default configuration and the AC:H rating reflect that most deployments running defaults are not exposed. Impact is limited to crashing the single decoding thread via StackOverflowError (availability only); there is no confidentiality, integrity, or memory-corruption impact.

Impact

This is a genuinely low-priority issue despite being network-reachable. The supplied CVSS:3.1 vector (AV:N/AC:H/PR:N/UI:N/S:U/C:N/I:N/A:L, score 3.7) aligns well with the description: unauthenticated and remote, but high complexity and limited to a partial availability impact with no confidentiality or integrity loss. The root cause is CWE-674 (uncontrolled recursion) leading to a StackOverflowError on the decoding thread - a denial-of-service of a single thread, not memory corruption (the description explicitly rules that out). Crucially, exploitation requires the non-default LZ4BlockInputStream configuration stopOnEmptyBlock=false; the default (true) is not affected, which is the main factor limiting real-world exposure and justifies AC:H. No EPSS score, KEV listing, or public exploit was provided in the input, so there is no public exploit identified at time of analysis and no evidence of active exploitation. Note a metadata conflict: the input Tags include 'Buffer Overflow', but the description explicitly states the issue does not cause memory corruption and CWE-674 is uncontrolled recursion - the 'Buffer Overflow' label is inaccurate. The upstream commit ships a regression test that constructs a malicious stream of 1,000,000 empty blocks, demonstrating feasibility, but this is a project unit test rather than a weaponized public exploit.

Exploit ScenarioDerived

An application decodes untrusted LZ4 block-stream data using LZ4BlockInputStream explicitly configured with stopOnEmptyBlock=false. An attacker supplying the compressed stream prepends a long run of well-formed empty LZ4 blocks; the stream handler recurses once per empty block via refill(), exhausting the thread's stack and throwing StackOverflowError, crashing the decoding thread. No public weaponized exploit is identified, though the vendor's fix commit includes a test that reproduces the condition.

Monitor Track and reassess. Why: LOW severity (CVSS 0.1-3.9).
Patch available 0.3% exploitation probability (EPSS)

Get an e-mail when this CVE is exploited, patched or re-scored. Free account.

Alert me

AnalysisAIv1 – Oct 06, 2026

Uncontrolled recursion in yawkat LZ4 Java's net.jpountz.lz4.LZ4BlockInputStream can crash the decoding thread: when the stream is explicitly configured with stopOnEmptyBlock set to false, each well-formed empty LZ4 block causes refill() to call itself recursively, so an attacker-supplied compressed stream containing a long run of empty blocks drives the stack to exhaustion and throws StackOverflowError. Only applications that both use LZ4BlockInputStream with the non-default stopOnEmptyBlock=false setting and feed it attacker-controlled or injectable compressed data are exposed; the default stopOnEmptyBlock=true is not affected, no authentication or user interaction is required under those conditions (CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:N/I:N/A:L), and impact is limited to availability of the decoding thread with no memory corruption, confidentiality, or integrity effect. There is no public exploit identified at time of analysis and the flaw is fixed in version 1.11.4.

RemediationAI

Vendor-released patch: upgrade to lz4-java 1.11.4, which replaces the recursive empty-block handling in LZ4BlockInputStream with an iterative loop (commit c8ebf97d504fb34434fda46fc761e8202570e0d8); confirm the resolved version in your dependency tree, since lz4-java is frequently pulled in transitively by Kafka, Cassandra, and other data-processing frameworks. If you cannot upgrade immediately, the most effective compensating control is to leave stopOnEmptyBlock at its default of true or explicitly remove any builder call that sets it to false - the code path is simply unreachable in that configuration, at the cost of changing how end-of-stream/empty-block termination is handled for that stream. Where the non-default setting must be retained, do not pass untrusted or attacker-influenceable byte streams into LZ4BlockInputStream: bound the size and number of blocks accepted (for example via a length-limited or byte-counting wrapper), reject or cap streams containing abnormally long runs of empty blocks, and run decompression in an isolated thread or worker whose StackOverflowError can be caught and discarded without taking down the surrounding service. Catch and contain StackOverflowError around decode operations as a last-resort backstop, understanding that it can leave JVM state unpredictable and is not a substitute for upgrading. Reference the vendor advisory at https://github.com/yawkat/lz4-java/security/advisories/GHSA-343h-94h5-c4wr for the authoritative fix details.

Affected VersionsENISA

lz4-java < 1.11.4

Affected Packages

maven at.yawk.lz4:lz4-java fix: 1.11.4
maven org.lz4:lz4-java no fix
euvd lz4_java fix: 1.11.4

Source: OSV (Open Source Vulnerabilities)

Affects your stack

Affects 3 packages in maven, euvd

Checking this CVE against your own stacks and servers is part of the Basic plan and up.

Technical ContextAI · show details

The affected component is the LZ4 block-format reader net.jpountz.lz4.LZ4BlockInputStream in the yawkat LZ4 Java library (formerly net.jpountz.lz4), a pure-Java implementation of the LZ4 compression algorithm. The LZ4 block stream format encodes data as a sequence of blocks, each preceded by a header containing magic bytes and a compression-method byte; a well-formed empty block is legal in that format and is used to signal stream termination, which is why the reader's stopOnEmptyBlock flag exists. Per the CWE-674 (uncontrolled recursion) root cause, the reader's private refill() method recursively called itself when it encountered an empty block while stopOnEmptyBlock was false, instead of iterating; consequently a stream containing roughly a million chained empty blocks, as demonstrated in the commit's test case (emptyBlocksFollowedBy(1_000_000, ...)), exhausts the decoding thread's call stack. The problem is triggered through both the read and skip paths, but it is a stack-exhaustion defect only - no memory corruption occurs because the recursion is bounded by stack depth and terminates in a StackOverflowError. The source fix in commit c8ebf97d504fb34434fda46fc761e8202570e0d8 converts the recursive call into a while loop over a new readBlock() helper that returns false for empty blocks, preserving behavior (including in the available() and skip() paths) while making the empty-block handling iterative.

Know when Java gets its next vulnerability

  • Watch products and get an email when something new is published
  • Check this CVE against your own stack and servers
  • Exploit and PoC references, threat intelligence from 22 sources

No credit card · 7-day full trial

Severity by source

Vendor (github) PRIMARY 3.7 LOW
AV:N/AC:H/PR:N/UI:N/S:U/C:N/I:N/A:L
vuln.today AI 3.7 LOW

Remote attacker-supplied stream (AV:N, PR:N, UI:N), but the required non-default stopOnEmptyBlock=false configuration makes it AC:H, with only a single-thread DoS (A:L) and no C/I impact.

3.1 AV:N/AC:H/PR:N/UI:N/S:U/C:N/I:N/A:L
4.0 AV:N/AC:H/AT:N/PR:N/UI:N/VC:N/VI:N/VA:L/SC:N/SI:N/SA:N

Primary rating from Vendor (github).

CVSS VectorVendor: github

Attack Vector
Network
Attack Complexity
High
Privileges Required
None
User Interaction
None
Scope
Unchanged
Confidentiality
None
Integrity
None
Availability
Low

Lifecycle Timeline

1
Patch available
Oct 06, 2026 - 21:05 EUVD

DescriptionCVE.org

yawkat LZ4 Java provides LZ4 compression for Java. Prior to 1.11.4, net.jpountz.lz4.LZ4BlockInputStream configured with stopOnEmptyBlock set to false handles each well-formed empty LZ4Block by recursively calling refill(), allowing a long sequence of empty blocks in an attacker-controlled compressed stream to exhaust the decoding thread's stack and throw StackOverflowError. The default stopOnEmptyBlock setting is true and is not affected, and the issue does not cause memory corruption. This issue is fixed in version 1.11.4.

Blast Radius

ecosystem impact
† from your stack dependencies † transitive graph · vuln.today resolves 4-path depth
  • 163 maven packages depend on at.yawk.lz4:lz4-java (18 direct, 145 indirect)
  • 193 maven packages depend on org.lz4:lz4-java (62 direct, 133 indirect)

Ecosystem-wide dependent count for version 1.11.4 and other introduced versions.

Threat Intelligence Overview

EPSS Score
0.3%
Top 75% exploitable
Prevalence
Medium
popular Java LZ4 compression library, but this specific fork's adoption is unclear
Threat Intel
1
1 source
Exploit
POC
Public exploit code exists
Data Quality
5 sources
Confidence: Medium
EUVD NVD CVE.org EPSS Vulnrichment GHSA GitHub

How this decision was reached

The engine reads each signal below and applies a fixed list of rules from top to bottom. The first rule that matches sets the recommended action – like a statement, every line is shown.

SignalValue
Severity LOW
CISA KEV No
Public POC Yes
EPSS 0.3%
Patch available Yes
Active threat No
Deciding rule
LOW severity (CVSS 0.1-3.9)
What every action level means
Emergency Immediate action required. Criteria: CRITICAL + in CISA KEV (actively exploited) without patch, OR CRITICAL + EPSS > 30% without patch, OR CRITICAL + active threat signals without patch.
Act Now Prioritize within 24-48h. Criteria: in KEV with patch available, OR CRITICAL + public POC, OR HIGH + EPSS > 10%, OR CRITICAL + active threat, OR any CRITICAL severity.
This Week Schedule remediation this week. Criteria: HIGH severity (CVSS 7.0-8.9). Patch within normal change window.
This Month Plan within 30 days. Criteria: MEDIUM severity (CVSS 4.0-6.9), lower exploitation probability. Include in regular patch cycle.
Monitor Track and reassess. Criteria: LOW severity (CVSS 0.1-3.9), minimal exploitation risk. No immediate action needed.

SSVC AssessmentENISA

SSVC Decision· derived
Defer
Exploitation
None
System Exposure· derived
Open
Automatable
No
Human Impact· derived
Low
Technical Impact
Partial

Priority Score

38
Low Medium High Critical
KEV: 0
EPSS: 0
CVSS: +18
PoC: +20
Weaponized: 0
Threat intel: 0
Gov advisory: 0

More in Java

View all
CVE-2012-4681 CRITICAL POC
9.8 Aug 28

Oracle Java SE 7 Update 6 and earlier contains multiple sandbox bypass vulnerabilities via the ClassFinder and forName m

CVE-2015-7450 CRITICAL POC
9.8 Jan 02

Remote code execution in IBM Sterling B2B Integrator, Sterling Integrator, and Tivoli Common Reporting allows unauthenti

CVE-2013-2465 CRITICAL POC
9.8 Jun 18

Java Runtime Environment sandbox bypass via incorrect image channel verification in 2D component allows remote unauthent

CVE-2011-3544 CRITICAL POC
9.8 Oct 19

Oracle Java SE JDK/JRE 7 and 6 Update 27 and earlier allows remote code execution with complete system compromise throug

CVE-2010-1871 HIGH POC
8.8 Aug 05

JBoss Seam 2 in Red Hat JBoss EAP 4.3.0 fails to sanitize JBoss Expression Language inputs, allowing remote attackers to

CVE-2012-1723 CRITICAL POC
9.8 Jun 16

Unspecified vulnerability in the Java Runtime Environment (JRE) component in Oracle Java SE 7 update 4 and earlier, 6 up

CVE-2013-0422 CRITICAL POC
9.8 Jan 10

Multiple vulnerabilities in Oracle Java 7 before Update 11 allow remote attackers to execute arbitrary code by (1) using

CVE-2012-0507 CRITICAL POC
9.8 Jun 07

Unspecified vulnerability in the Java Runtime Environment (JRE) component in Oracle Java SE 7 Update 2 and earlier, 6 Up

CVE-2015-4852 CRITICAL POC
9.8 Nov 18

The WLS Security component in Oracle WebLogic Server 10.3.6.0, 12.1.2.0, 12.1.3.0, and 12.2.1.0 allows remote attackers

CVE-2012-5076 CRITICAL POC
9.8 Oct 16

Unspecified vulnerability in the Java Runtime Environment (JRE) component in Oracle Java SE 7 Update 7 and earlier allow

CVE-2017-3066 CRITICAL POC
9.8 Apr 27

Remote unauthenticated attackers can execute arbitrary code on Adobe ColdFusion servers through Java deserialization fla

CVE-2012-0391 CRITICAL POC
9.8 Jan 08

The ExceptionDelegator component in Apache Struts before 2.2.3.1 interprets parameter values as OGNL expressions during

This site uses cookies essential for authentication and security. No tracking or analytics cookies are used. Privacy Policy