Skip to main content

zip-rs zip2 EUVDEUVD-2026-109985

| CVE-2026-115908 HIGH
Path Traversal (CWE-22)
2026-10-26 GitHub_M
7.4
CVSS 3.1 · Vendor: GitHub_M
View

Attack ChainAIDerived

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

  1. Access
    Craft ZIP with symlink chain (abs target)
  2. Delivery
    Deliver archive to extracting host (CI/download)
  3. Exploit
    App calls ZipArchive::extract
  4. Execution
    Lexical check passes, intermediate link resolves outside dest
  5. Impact
    Overwrite attacker-controlled file beyond destination

Vulnerability Assessment

Weakness
CWE
OWASP Top 10:2025
A01:2025 - Broken Access Control
ASVS 5.0
V5 - File Handling Path canonicalization, traversal prevention
MITRE ATT&CK

2 techniques across 2 tactics: Discovery, Collection

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

Exploitation Conditions

Exploitation requires (1) the target application to extract an attacker-supplied ZIP using ZipArchive::extract or ZipArchive::extract_unwrapped_root_dir on an affected version (7.2.0 through <9.0.0); ZipStreamReader::extract is NOT affected because local-header external_attributes are 0 so is_symlink() never returns true. (2) The attacker must know or guess the absolute path of the extraction destination (the basis for AC:H) - realistic for CI workspaces, /opt/app, or fixed Downloads paths. On Unix the escape needs a multi-stage symlink chain where an intermediate link resolves outside the destination. On Windows a single symlink suffices because simplified_components discards the drive/UNC Prefix (e.g. D:\<same tail> or \\attacker\share\<same tail>), but creating a symlink on Windows additionally requires the extracting process to hold SeCreateSymbolicLinkPrivilege (administrator rights or Developer Mode). Limiting factors: the AC:H path-knowledge requirement, the restriction to the two affected extract APIs, and on Windows the symlink-creation privilege requirement.

Impact

Severity signals are moderate-high and largely consistent. The supplied CVSS 3.1 vector (AV:N/AC:H/PR:N/UI:N/S:U/C:N/I:H/A:H, base 7.4) describes an unauthenticated, remotely-triggerable arbitrary file write with high integrity and availability impact but no confidentiality loss, and AC:H correctly reflects the one real precondition: the attacker must know or guess the absolute extraction path. The vuln.today decision label is 'this_week' (a prioritize-but-not-emergency tier), a vendor patch exists (v9.0.0), and the issue is reported by GitHub (GitHub_M). No CISA KEV listing and no EPSS score are present in the input, so there is no evidence of active or widespread exploitation - this is not a confirmed in-the-wild threat. However, the GHSA advisory documents a reporter-verified proof-of-concept (including real-hardware Windows 10 verification in tests/poc_win.rs and a two-stage symlink PoC that returns Ok(()) while writing outside the destination), so exploitability is demonstrated rather than theoretical. Net assessment: a genuine, patch-now-this-cycle supply-chain library flaw rather than a drop-everything emergency - the AC:H path-knowledge requirement and the write-only (not read) impact temper the raw CVSS, while the verified PoC and ubiquity of the crate in Rust ZIP handling raise it above a paper-only high-CVSS issue.

Exploit ScenarioDerived

An attacker crafts a malicious ZIP whose entries include a symlink chain whose apparent target stays lexically under the extraction directory while an intermediate link resolves outside it, then delivers it to a target that extracts untrusted archives into a predictable path (a CI workspace, /opt/app, or a fixed Downloads directory). When the application calls ZipArchive::extract, the lexical prefix check passes and attacker-controlled files are created or overwritten outside the destination with the extracting process's privileges. A reporter-verified PoC exists (confirmed on a Windows 10 VM and via a two-stage symlink on other platforms); AC:H applies because the attacker must know or guess the absolute destination path.

This Week Schedule remediation this week. Why: HIGH severity (CVSS 7.0-8.9).
Patch available 0.4% exploitation probability (EPSS)

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

Alert me

AnalysisAIv1 – Oct 26, 2026

Arbitrary file write outside the extraction directory in the Rust zip2 crate 7.2.0 through 9.0.0 lets a crafted ZIP create or overwrite files with the extracting process's privileges when an application calls ZipArchive::extract or ZipArchive::extract_unwrapped_root_dir. The symlink-target check is purely lexical, so an attacker who knows or can guess the absolute destination path can supply a chain whose apparent target stays under the destination while an intermediate link resolves outside it; on Windows a single link is enough because drive and UNC prefixes are discarded, provided the extracting process holds SeCreateSymbolicLinkPrivilege. The GitHub advisory ships proof-of-concept reproduction detail, including a real-hardware Windows test, but no CISA KEV entry exists and public working exploit code is not confirmed in the supplied data; severity is rated 7.4 with AC:H reflecting the destination-path precondition.

RemediationAI

Vendor-released patch: upgrade the zip2 crate to 9.0.0 (release https://github.com/zip-rs/zip2/releases/tag/v9.0.0, fix commit 09c030eab56e8db8fb3c1c33f554407b30bad8fa), which replaces the lexical starts_with comparison with the component-by-component resolve_enclosed routine; anything from 7.2.0 through 8.x remains exploitable and a rebuild plus dependency pin bump is required since this is a library, not a service. Advisory guidance and the reproduction detail are at https://github.com/zip-rs/zip2/security/advisories/GHSA-hjqx-j4rw-g7xv. The supplied advisory documents no vendor-supplied workaround beyond updating, so interim options are narrowing rather than fixing: staying on the crate's streaming API is not affected by this bug (ZipStreamReader::extract never treats entries as symlinks because external_attributes in the local header are 0), but it constrains callers to a streaming interface and does not help code that must use ZipArchive; on Windows the single-link escape additionally requires the extracting process to hold SeCreateSymbolicLinkPrivilege, so running extraction without administrator rights and with Developer Mode disabled removes that variant, at the cost of also preventing legitimate symlink extraction and leaving the multi-stage Unix-style chain unaffected.

Affected VersionsENISA

zip2 7.2.0, < 9.0.0

Affected Packages

euvd zip2 fix: 9.0.0

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 flaw is a path-traversal (CWE-22) with related link-following aspects (CWE-59, CWE-61) in the Rust zip2 library's symlink handling. In src/read/zipfile.rs, safe_prepare_path compares simplified_components(target) against simplified_components(base_path) with starts_with; simplified_components in src/path.rs parses entry names and link targets with Utf8WindowsPath, pops on ParentDir and pushes Normal components, so classic ../ Zip Slip is blocked, but the result is only a normalized component vector - filesystem resolution is never consulted. Because . make_symlink_impl then creates the link exactly as the archive supplies it, no check exists that an intermediate component of the target is itself a symlink, and outpath.push(target) follows whatever the path really resolves to. This is a regression of CVE-2025-29787 rather than a duplicate: commit d4539d6b (2025-02-28) canonicalized paths, commit 0199ac2c (2025-03-15) replaced that with the lexical check before the v2.3.0 fix release, and that combination was safe only because simplified_components at the time returned None on Component::Prefix and Component::RootDir. Commit d5cf4b55 (2026-01-18, shipped in 7.2.0) changed those arms to silently skip prefixes and roots so archives with absolute names could be extracted, which let absolute symlink targets pass the lexical check and re-opened the escape. The 9.0.0 fix (commit 09c030ea) abandons the prefix comparison for resolve_enclosed, which walks components one at a time from a canonicalized base, pushes symlink targets back onto a VecDeque queue so each component of every target is re-validated, refuses .. at the base, and caps resolution at MAX_SYMLINK_HOPS = 40, with strip_base_prefix/strip_equivalent_prefix reconciling verbatim (\\?\C:\, \\?\UNC) and ordinary Windows prefix spellings.

Know when Rust 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_M) PRIMARY 7.4 HIGH
AV:N/AC:H/PR:N/UI:N/S:U/C:N/I:H/A:H
vuln.today AI 7.4 HIGH

AV:N and PR:N because a malicious archive triggers the write with no attacker privileges; AC:H because the attacker must know the absolute destination path; C:N as the flaw writes/overwrites files only (I:H/A:H).

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

Primary rating from Vendor (GitHub_M).

CVSS VectorVendor: GitHub_M

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

Lifecycle Timeline

2
Patch available
Oct 26, 2026 - 17:02 EUVD
CVE Published
Oct 26, 2026 - 16:34 cve.org
HIGH 7.4

DescriptionCVE.org

zip is a zip library for Rust that supports reading and writing simple ZIP files. From 7.2.0 until 9.0.0, ZipArchive::extract and ZipArchive::extract_unwrapped_root_dir use safe_prepare_path in src/read/zipfile.rs and simplified_components in src/path.rs to validate symbolic link targets with a lexical prefix comparison rather than resolving each intermediate link. An attacker who knows or can guess the absolute extraction destination can create a chain whose apparent target remains under the destination while an intermediate symlink resolves outside it, allowing attacker-controlled files to be created or overwritten with the extracting process's privileges. On Windows, discarded drive and UNC prefixes can permit a single-link escape when the process has SeCreateSymbolicLinkPrivilege, such as through administrator rights or Developer Mode. This regression is distinct from CVE-2025-29787. This issue is fixed in version 9.0.0.

Technical POC Analysis

CWE-22 (path traversal), realised through symlink handling.

Full technical POC analysis - root cause, step-by-step exploitation and patch breakdown - is part of the Pro and Business plans.

Executive ViewAI

Why It Matters

The Rust zip2 library versions 7.2.0 through 9.0.0 contain a high-severity path-traversal file-write flaw (CVE-2026-115908, CVSS 7.4) that can let a crafted ZIP archive overwrite or create files outside the intended extraction directory, running with the extracting process's privileges. Any product or internal service built on these library versions that extracts untrusted archives is affected, putting host integrity and any secrets or configuration reachable by that process at risk. Leadership should care because the practical precondition is an attacker who can influence archive contents and guess a destination path, which commonly applies to file-ingestion, upload, and automation pipelines.

Business Impact: High
Compensating Controls

Apply vendor patch.

Threat Intelligence Overview

EPSS Score
0.4%
Top 63% exploitable
Prevalence
Medium
de facto ZIP crate in Rust ecosystem, but language-scoped footprint
Data Quality
4 sources
Confidence: Medium

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 HIGH
CISA KEV No
Public POC No
EPSS 0.4%
Patch available Yes
Active threat No
Deciding rule
HIGH severity (CVSS 7.0-8.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
Scheduled
Exploitation
None
System Exposure· derived
Open
Automatable
No
Human Impact
High
Technical Impact
Partial

Priority Score

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

Attack Technique

Path traversal exploits occur when applications use user-controlled input to construct file system paths without proper validation.

More in Rust

View all
CVE-2024-3566 CRITICAL POC
9.8 Apr 10

Command injection via Windows CreateProcess argument parsing affects multiple language runtimes and tooling (Node.js, PH

CVE-2021-31162 CRITICAL POC
9.8 Apr 14

In the standard library in Rust before 1.52.0, a double free can occur in the Vec::from_iter function if freeing the ele

CVE-2021-28879 CRITICAL POC
9.8 Apr 11

In the standard library in Rust before 1.52.0, the Zip implementation can report an incorrect size due to an integer ove

CVE-2026-58491 CRITICAL POC
9.3 Sep 21

Stored cross-site scripting and open redirect in Warpgate's SSO endpoints (versions prior to 0.25.5) allow an unauthenti

CVE-2021-29922 CRITICAL POC
9.1 Aug 07

library/std/src/net/parser.rs in Rust before 1.53.0 does not properly consider extraneous zero characters at the beginni

CVE-2026-77620 HIGH POC
8.7 Sep 22

Denial of service in the Vector observability pipeline's `logstash` source (versions 0.15.0 through 0.56.x) allows a rem

CVE-2019-12083 HIGH POC
8.1 May 13

The Rust Programming Language Standard Library 1.34.x before 1.34.2 contains a stabilized method which, if overridden, c

CVE-2026-96889 HIGH POC
7.8 Sep 23

Use-after-free in librsvg during rendering of crafted SVG documents with nested XInclude directives and duplicate entity

CVE-2021-28878 HIGH POC
7.5 Apr 11

In the standard library in Rust before 1.52.0, the Zip implementation calls __iterator_get_unchecked() more than once fo

CVE-2021-28875 HIGH POC
7.5 Apr 11

In the standard library in Rust before 1.50.0, read_to_end() does not validate the return value from Read in an unsafe c

CVE-2019-16760 HIGH POC
7.5 Sep 30

Cargo prior to Rust 1.26.0 may download the wrong dependency if your package.toml file uses the `package` configuration

CVE-2026-115905 CRITICAL
10.0 Oct 26

A parser differential in the Rust `zip` crate (zip2) through 9.0.4 lets a crafted archive present different filenames to

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