Skip to main content

Erlang OTP EUVDEUVD-2026-101390

| CVE-2026-96596 MEDIUM
Loop with Unreachable Exit Condition (Infinite Loop) (CWE-835)
2026-10-14 EEF
5.9
CVSS 4.0 · Vendor: EEF
View

Attack ChainAIDerived

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

  1. Access
    Craft tar with malformed GNU sparse member
  2. Delivery
    Deliver archive to extraction path (package/CI/app input)
  3. Exploit
    Victim calls erl_tar:extract to disk
  4. Execution
    stream_to_file_loop hits trailing-hole clause
  5. Persist
    Infinite zero-byte read, no position advance
  6. Impact
    Scheduler and process pinned until killed (DoS)

Vulnerability Assessment

Weakness
CWE
ASVS 5.0
V15 - Secure Coding and Architecture Loop termination conditions
MITRE ATT&CK

1 technique across 1 tactic: Impact

The technique list with ATT&CK links and the kill-chain view is part of the Basic plan and up.

Exploitation Conditions

Exploitation requires that the application extract an attacker-supplied tar archive to DISK via erl_tar:extract/1,2 (or the vendored hex_erl_tar/mix_hex_erl_tar/r3_hex_erl_tar equivalents), and that the archive contain a crafted GNU sparse member whose sparse map ends before its declared real size. Key limiting factors: extraction using the 'memory' output option is NOT affected; the {max_size, N} option only prevents the hang when N is set below the real size of the member. For stdlib's erl_tar the flaw applies only to OTP 29.0 before 29.1.2, but the vendored copies in hex_core (>=0.14.0), Hex (>=2.4.2), and rebar3 (>=3.27.1) are affected on ANY OTP version, including OTP 28. No attacker privileges or user interaction with the process are required beyond getting the archive into an extraction routine.

Impact

This is a genuine but moderate-priority availability-only issue (CWE-835 infinite loop), not a high-severity emergency. The vendor CVSS 4.0 vector (AV:L/AC:L/AT:P/PR:N/UI:N) scores 5.9 with impact limited to availability (VA:H; VC:N/VI:N), which is consistent with the description: a crafted 2048-byte GNU sparse tar member pins the extracting process and one scheduler at 100% until killed, with no code execution or data exposure. The AV:L (local) and AT:P (a specific attack precondition - the malformed sparse map) signals correctly convey that this is not a trivially remote, wormable flaw: the attacker must get a crafted archive into an extraction path. No EPSS score, no CISA KEV listing, and no public POC are present in the provided data, so exploitation status is 'no public exploit identified at time of analysis' - exploitation probability must be treated as unquantified rather than low. The practical risk is elevated by the distribution model: hex_core, Hex, and rebar3 ship their own vendored copies of erl_tar (hex_erl_tar/mix_hex_erl_tar/r3_hex_erl_tar) that are vulnerable on ANY OTP version (including OTP 28, which is otherwise unaffected), so build-time package extraction is a realistic trigger. One caveat to verify: although the vendor labels AV:L, package managers like Hex/rebar3 fetch and extract archives from remote repositories, so a supply-chain delivery path (malicious or compromised package) could effectively deliver the archive over a network even though the tar parsing itself is local - treat the AV:L as describing the parsing boundary, not the full delivery chain.

Exploit ScenarioDerived

An attacker publishes or substitutes a malicious ~2 KB tar archive containing a GNU sparse member whose sparse map ends before the member's declared real size, then gets a victim to extract it (e.g., a CI/build host running rebar3 or Hex fetching the package, or an application calling erl_tar:extract to disk). When the member is streamed to disk, do_sparse_read matches the trailing-hole clause, reads zero bytes without advancing, and recurses forever, pinning the extracting process and one scheduler at 100% CPU until the process is killed. No public exploit code is identified, but the malformed-archive trigger is simple to construct from the detailed advisory.

This Month Plan within 30 days. Why: MEDIUM severity (CVSS 4.0-6.9).
Patch available 0.2% exploitation probability (EPSS)

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

Alert me

AnalysisAIv1 – Oct 14, 2026

Denial of service in Erlang OTP's stdlib erl_tar module (OTP 29.0 before 29.1.2, stdlib 8.0 before 8.1.1) allows an attacker who supplies a tar archive to be extracted to disk to hang the extracting process and consume a scheduler indefinitely, using a crafted GNU sparse member with a sparse map that ends before its declared real size. The same vulnerable code is vendored as hex_erl_tar in hex_core 0.14.0 and later, as mix_hex_erl_tar in Hex 2.4.2 and later, and as r3_hex_erl_tar in rebar3 3.27.1 and later, so those components remain exploitable on any OTP release including OTP 28. The assessed vector is local and unauthenticated (AV:L/AC:L/PR:N/UI:N) with availability-only impact on a single process/scheduler; no public exploit identified at time of analysis, and extraction using the memory output option is not affected.

RemediationAI

Upgrade Erlang/OTP to 29.1.2, which ships the fixed stdlib 8.1.1 (vendor-released patch; see https://github.com/erlang/otp/security/advisories/GHSA-phm5-m6cj-5382 and patch commit 3086307f311b78b38644a7787a3aca6a3f95a9d5). Because the flaw also lives in vendored copies, upgrading OTP alone is not sufficient: update hex_core to a build containing commit 13bb9fbba418a406af614790b8d5cd458259ee70, Hex to a build containing commit 5543a1919c709d8eb2b317f62aad76ca1eed375c, and rebar3 to a build containing commit 23dbdb5d1f87f56902aef296c88a20049cd0c6e4 (this commit re-vendors hex_core v0.15.0); upstream fix available (PR/commit) for these three, with released patched versions not independently confirmed from the provided data. Actionable workarounds where patching must be deferred: extract untrusted archives with the memory output option, which does not use the streaming-to-disk path and is unaffected, at the cost of holding the whole member in RAM; if memory extraction is not viable, run extraction in a dedicated worker process and supervise it with a short timeout plus kill-on-timeout so the stuck loop is torn down instead of blocking a scheduler; use {max_size, N} only with caution, since it prevents the hang only when N is below the real size of the member and therefore cannot be relied on as a general guard; and avoid automatically extracting attacker-influenced or downloaded tar archives (including package/documentation tarballs fetched from remotes) with affected versions. Note the patched code also introduces a {chunks, ChunkSize} option that lets operators tune the 65536-byte streaming chunk size, which reduces but does not by itself eliminate exposure on unpatched builds.

Affected VersionsENISA

hex_core 0.14.0 <*
hex 5543a1919c709d8eb2b317f62aad76ca1eed375c <*
hex_core 13bb9fbba418a406af614790b8d5cd458259ee70 <*
rebar3 23dbdb5d1f87f56902aef296c88a20049cd0c6e4 <*
hex 2.4.2 <*
otp 29.0 <29.1.2
otp fbf2c7194f6fce4b7b66dc0bcaa4f6b4b85e088f <3086307f311b78b38644a7787a3aca6a3f95a9d5
otp 8.0 <8.1.1
rebar3 3.27.1 <*

Affected Packages

euvd otp fix: 8.1.1, 29.1.2

Source: OSV (Open Source Vulnerabilities)

Affects your stack

Affects 1 package in euvd

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

Technical ContextAI · show details

The root cause is CWE-835, a loop with an unreachable exit condition, inside Erlang's erl_tar implementation of GNU sparse tar member extraction. When erl_tar:extract/1,2 streams a regular member to disk, erl_tar:stream_to_file_loop/3 reads it in 65536-byte chunks and erl_tar:do_sparse_read/3 reconstructs sparse files. For a GNU sparse member whose sparse map terminates before the member's real size, the trailing-hole clause of do_sparse_read/3 matches before the zero-length clause; once the remaining chunk budget is exhausted the trailing-hole clause returns zero bytes without advancing the reader position, so the loop recurses endlessly on the same reader state. A roughly 2048-byte archive is sufficient to busy one scheduler and block the extracting process until it is killed. The {max_size, N} guard only helps when N is smaller than the member's real size, and the memory output option (which never uses the streaming path) is unaffected. The upstream fix (commit fbf2c7194f6fce4b7b66dc0bcaa4f6b4b85e088f, patch commit 3086307f311b78b38644a7787a3aca6a3f95a9d5) splits extraction into a file path via new extract_to_file/stream_to_file helpers, makes chunk_size default to 65536, and adds a {chunks, ChunkSize} option. Cryptographically this is not a memory-safety issue: the same code was copied verbatim into hex_core and then namespaced-vendored into Hex and rebar3, which is why CPE entries cover cpe:2.3:a:erlang:otp, cpe:2.3:a:erlang:rebar3, cpe:2.3:a:hexpm:hex and cpe:2.3:a:hexpm:hex_core and why the vendored copies are vulnerable independent of the host OTP version (including OTP 28, which is not affected through stdlib itself).

Know when Erlang 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 (EEF) PRIMARY 5.9 MEDIUM
CVSS:4.0/AV:L/AC:L/AT:P/PR:N/UI:N/VC:N/VI:N/VA:H/SC:N/SI:N/SA:N
vuln.today AI 6.2 MEDIUM

Attacker needs no privileges and only supplies a crafted archive that is deterministically parsed locally, so AV:L/AC:L/PR:N; impact is availability-only (CPU/scheduler exhaustion), hence C:N/I:N/A:H.

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

Primary rating from Vendor (EEF).

CVSS VectorVendor: EEF

Attack Vector
Local
Attack Complexity
Low
Attack Requirements
Present
Privileges Required
None
User Interaction
None
Vulnerable system: Confidentiality
None
Vulnerable system: Integrity
None
Vulnerable system: Availability
High
Subsequent system: Confidentiality
None
Subsequent system: Integrity
None
Subsequent system: Availability
None

DescriptionCVE.org

Loop with Unreachable Exit Condition ('Infinite Loop') vulnerability in Erlang OTP stdlib (erl_tar module), hexpm hex_core (hex_erl_tar module), hexpm hex (mix_hex_erl_tar module) and erlang rebar3 (r3_hex_erl_tar module) allows an attacker who supplies a tar archive to cause a denial of service via a crafted GNU sparse member.

When erl_tar:extract/1,2 writes a member to disk, erl_tar:stream_to_file_loop/3 reads it in chunks of 65536 bytes by default. For a GNU sparse member whose sparse map ends before its real size, erl_tar:do_sparse_read/3 matches its trailing-hole clause before its zero-length clause. After the chunk is used up, the trailing-hole clause reads zero bytes, does not advance the position, and recurses forever. A 2048-byte archive keeps the extracting process and one scheduler busy until the process is killed. The {max_size, N} option prevents this only when N is below the real size of the member. Extraction with the memory option is not affected.

hex_core ships its own copy of erl_tar as hex_erl_tar, and Hex and rebar3 ship hex_core with prefixed module names (mix_hex_erl_tar and r3_hex_erl_tar). These copies contain the same code and do not call stdlib's erl_tar, so they are affected on any OTP version. OTP 28 is not affected, but an application running on OTP 28 is affected if it extracts archives through an affected version of hex_core, Hex or rebar3.

This issue affects OTP from OTP 29.0 before OTP 29.1.2, corresponding to stdlib from 8.0 before 8.1.1, and rebar3 from 3.27.1 onward, and hex from 2.4.2 onward; hex_core: from 0.14.0 onward.

Threat Intelligence Overview

EPSS Score
0.2%
Top 93% exploitable
Prevalence
Medium
core build/packaging tooling of the Erlang/Elixir ecosystem, common but not universal
Data Quality
7 sources
Confidence: High
EUVD NVD CVE.org EPSS Vulnrichment GitHub VulDB

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 MEDIUM
CISA KEV No
Public POC No
EPSS 0.2%
Patch available Yes
Active threat No
Deciding rule
MEDIUM severity (CVSS 4.0-6.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
Small
Automatable
No
Human Impact· derived
Medium
Technical Impact
Partial

Priority Score

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

Attack Technique

Denial of Service attacks render applications or systems unavailable by overwhelming resources or triggering failure conditions.

More in Erlang

View all
CVE-2025-32433 CRITICAL POC
10.0 Apr 16

Erlang/OTP SSH server allows unauthenticated remote code execution by exploiting a flaw in SSH protocol message handling

CVE-2017-1000385 MEDIUM POC
5.9 Dec 12

The Erlang otp TLS server answers with different TLS alerts to different error types in the RSA PKCS #1 1.5 padding. Rat

CVE-2023-48795 MEDIUM POC
5.9 Dec 18

The SSH transport protocol with certain OpenSSH extensions, found in OpenSSH before 9.6 and other products, allows remot

CVE-2020-13802 CRITICAL POC
9.8 Sep 02

Rebar3 versions 3.0.0-beta.3 to 3.13.2 are vulnerable to OS command injection via URL parameter of dependency specificat

CVE-2014-1693 HIGH POC
7.5 Dec 08

Multiple CRLF injection vulnerabilities in the FTP module in Erlang/OTP R15B03 allow context-dependent attackers to inje

CVE-2021-29221 HIGH POC
7.0 Apr 09

A local privilege escalation vulnerability was discovered in Erlang/OTP prior to version 23.2.3. Rated high severity (CV

CVE-2016-10253 CRITICAL
9.8 Mar 18

An issue was discovered in Erlang/OTP 18.x. Rated critical severity (CVSS 9.8), this vulnerability is remotely exploitab

CVE-2022-37026 CRITICAL
9.8 Sep 21

In Erlang/OTP before 23.3.4.15, 24.x before 24.3.4.2, and 25.x before 25.0.2, there is a Client Authentication Bypass in

CVE-2026-89422 CRITICAL
9.3 Sep 22

Erlang/OTP's ssl application in affected releases (OTP 22.2 through the fixed 27.3.4.18, 28.5.0.7 and 29.1.1) will compl

CVE-2026-67404 CRITICAL
9.2 Sep 23

RabbitMQ brokers that use the OAuth2 plugin can silently fall back to disabled TLS certificate verification when no CA b

CVE-2026-67231 CRITICAL
9.1 Sep 23

TLS client-authentication bypass in the RabbitMQ trust-store plugin lets a remote unauthenticated attacker whose forged

CVE-2026-55953 CRITICAL
9.1 Jul 27

An on-path attacker can force an Erlang/OTP TLS 1.2 or DTLS client to accept an anonymous cipher suite not offered by th

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