Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
AccessCraft ZIP with symlink chain (abs target)
-
DeliveryDeliver archive to extracting host (CI/download)
-
ExploitApp calls ZipArchive::extract
-
ExecutionLexical check passes, intermediate link resolves outside dest
-
ImpactOverwrite 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. |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAIv1 – 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
Affected Packages
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
AV:N/AC:H/PR:N/UI:N/S:U/C:N/I:H/A:H
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).
Primary rating from Vendor (GitHub_M).
CVSS VectorVendor: GitHub_M
Lifecycle Timeline
2DescriptionCVE.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
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.
Apply vendor patch.
Threat Intelligence Overview
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.
What every action level means
SSVC AssessmentENISA
Priority Score
Attack Technique
Path traversal exploits occur when applications use user-controlled input to construct file system paths without proper validation.
Command injection via Windows CreateProcess argument parsing affects multiple language runtimes and tooling (Node.js, PH
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
In the standard library in Rust before 1.52.0, the Zip implementation can report an incorrect size due to an integer ove
Stored cross-site scripting and open redirect in Warpgate's SSO endpoints (versions prior to 0.25.5) allow an unauthenti
library/std/src/net/parser.rs in Rust before 1.53.0 does not properly consider extraneous zero characters at the beginni
Denial of service in the Vector observability pipeline's `logstash` source (versions 0.15.0 through 0.56.x) allows a rem
The Rust Programming Language Standard Library 1.34.x before 1.34.2 contains a stabilized method which, if overridden, c
Use-after-free in librsvg during rendering of crafted SVG documents with nested XInclude directives and duplicate entity
In the standard library in Rust before 1.52.0, the Zip implementation calls __iterator_get_unchecked() more than once fo
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
Cargo prior to Rust 1.26.0 may download the wrong dependency if your package.toml file uses the `package` configuration
A parser differential in the Rust `zip` crate (zip2) through 9.0.4 lets a crafted archive present different filenames to
EUVD-2026-109985
NVD
CVE.org
EPSS
Vulnrichment
GitHub
Exploit-DB