Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
ReconIdentify shared or predictable extraction directory
-
DeliveryPlant symlink inside extraction root pointing to sensitive target file
-
ExploitSupply or influence ZIP archive with matching entry name
-
InstallTrigger extraction call with overwrite=true
-
C2fs.openSync follows symlink to target outside root
-
ExecuteWrite attacker-controlled content to target file
-
Impactchmod applied to target, completing file takeover
Vulnerability Assessment
| Weakness |
CWE
OWASP Top 10:2025
A01:2025 - Broken Access Control
ASVS 5.0
V5 - File Handling Symlink resolution safety
|
| Exploitation Conditions | Two conditions must both be satisfied. First, the calling application must pass overwrite: true (or the equivalent truthy flag) to extractAllTo, extractAllToAsync, or extractEntryTo - without this flag the fs.existsSync pre-check resolves the symlink and refuses to overwrite, blocking the write. Second, the attacker must be able to create a symbolic link at a path component inside the extraction root before extraction begins - this requires filesystem write access to the extraction directory or a parent, which is achievable in shared temporary directories, multi-tenant CI workspaces, or any directory with group/world write bits. Exploitation is limited to files the extracting process has permission to write; it does not grant write access beyond the OS-enforced privilege boundary of the extracting user. The vulnerability is not exploitable through the archive entry path alone (no traversal sequence in the entry name) - the symlink must pre-exist at the destination on the host filesystem. |
| Impact | The CVSS 4.0 score of 6.8 (AV:L/AC:L/AT:N/PR:L/UI:N/VC:N/VI:H/VA:N) reflects the local-only attack vector and the absence of a confidentiality impact, while correctly flagging high integrity impact. The tag 'Information Disclosure' from VulnCheck appears to be a mislabeling - the actual primitive is arbitrary file write, not read. The overwrite=true flag is a hard prerequisite; this is a non-default caller configuration that significantly narrows real-world exposure compared to the raw vector suggests. The AT:N assignment in the provided CVSS 4.0 vector may understate the deployment-specific condition (overwrite must be explicitly enabled), which in CVSS 3.1 terms would drive AC to H. No EPSS data was supplied. The vulnerability is not in CISA KEV and no POC is confirmed. Real-world priority is elevated for applications that (a) extract ZIP archives to shared or predictable directories such as /tmp or CI workspace paths and (b) invoke extraction with overwrite enabled - a pattern common in build tools, artifact deployers, and archive managers. Applications extracting to fresh, process-owned directories with overwrite disabled are not exploitable. |
| Exploit ScenarioDerived | An attacker with write access to a shared CI workspace directory creates a symbolic link at a predictable sub-path - for example, workspace/dist/config pointing to /etc/cron.d/pwned - before a build job runs. When the CI job calls extractAllTo('workspace/dist', true) on an attacker-influenced archive containing an entry named config, adm-zip resolves the destination through the symlink and writes the archive entry's contents to /etc/cron.d/pwned, then chmods it, granting the attacker a cron execution primitive under the CI agent's privileges. No path-traversal characters appear in the archive entry name, so the sanitize check passes cleanly. |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAIv1 – Aug 24, 2026
Symlink-following during ZIP extraction in adm-zip 0.5.9 through 0.6.0 allows a local attacker who can plant a symlink inside the extraction directory to overwrite arbitrary files accessible by the extracting process. Utils.writeFileTo calls fs.openSync without O_NOFOLLOW and performs no pre-write lstat check, so a pre-positioned symlink transparently redirects the write - and a subsequent chmod - to any target outside the extraction root without any path-traversal sequence appearing in the archive. No public exploit is identified at time of analysis and the vulnerability is not listed in CISA KEV, but the impact is high in shared or predictable extraction environments such as CI pipelines and multi-tenant temp directories.
RemediationAI
No vendor-released patch identified at time of analysis - no fix version is referenced in the VulnCheck advisory or the linked GitHub repository. Until a patch is released, the most direct compensating control is to remove the overwrite: true flag from all calls to extractAllTo, extractAllToAsync, and extractEntryTo; without overwrite enabled, the preceding fs.existsSync check (which also resolves symlinks) will decline to write through a pre-existing symlink, blocking the attack path - at the trade-off of failing on any extraction where a destination file already exists. Where overwrite must be enabled, callers should perform an fs.lstatSync check on each resolved destination path before writing and abort if the result is a symbolic link, which eliminates the vulnerable condition at the application level. Additionally, extraction directories should be created as fresh, process-owned paths (e.g., mkdtemp) rather than reusing shared or predictable locations such as /tmp or CI workspace roots, removing the attacker's ability to pre-plant a symlink. Monitor the upstream repository and VulnCheck advisory for a patched release.
Affected VersionsENISA
Affected Packages
Source: OSV (Open Source Vulnerabilities)
Affects your stack
Affects 1 package in npm
Checking this CVE against your own stacks and servers is part of the Basic plan and up.
Technical ContextAI · show details
adm-zip (CPE: cpe:2.3:a:cthackers:adm-zip:*:*:*:*:*:*:*:*) is a pure-JavaScript Node.js library for reading and writing ZIP archives. The root cause is CWE-59 (Improper Link Resolution Before File Access - 'Link Following'). The sanitization logic in util/utils.js compares only the string representation of an archive entry path against the resolved extraction root; it does not verify filesystem object types at the destination. The file-write path in Utils.writeFileTo then calls fs.openSync(path, 'w', 0o666), which inherits the Node.js default behavior of following symbolic links. Since neither O_NOFOLLOW is passed nor an fs.lstatSync check is performed before the open, any symlink already present at a path component of the computed destination is silently followed, placing attacker-controlled content in the symlink's target. A subsequent chmod on what the code believes to be the destination file is also applied to the symlink target. The three affected extraction methods are extractAllTo, extractAllToAsync, and extractEntryTo.
Know when Adm Zip 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
CVSS:4.0/AV:L/AC:L/AT:N/PR:L/UI:N/VC:N/VI:H/VA:N/SC:N/SI:N/SA:N
AC:H because overwrite=true is a non-default caller flag; AV:L for local filesystem access; S:C because writes escape the intended extraction boundary.
Primary rating from Vendor (VulnCheck).
CVSS VectorVendor: VulnCheck
DescriptionCVE.org
adm-zip 0.5.9 through 0.6.0 follows symbolic links at the extraction destination. Utils.sanitize in util/utils.js enforces containment by comparing only the string form of an archive entry name against the resolved extraction root, and Utils.writeFileTo opens the computed destination with fs.openSync(path, "w", 0o666), which resolves symbolic links and carries neither O_NOFOLLOW nor a pre-write fs.lstatSync check. When a path component at the destination already exists as a symbolic link pointing outside the extraction root, extractAllTo, extractAllToAsync and extractEntryTo write the entry contents through that link and then chmod its target, placing attacker-controlled content in a file outside the root without any traversal sequence appearing in the archive. Reaching the write requires overwrite to be enabled, because the preceding fs.existsSync check also resolves the link and otherwise declines. An attacker able to create a symbolic link inside a shared, reused or predictable extraction directory, such as a temporary directory or a continuous integration workspace, can overwrite any file the extracting process is permitted to write.
Blast Radius
ecosystem impact- 168 npm packages depend on adm-zip (76 direct, 94 indirect)
Ecosystem-wide dependent count for version 0.5.9.
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
Information disclosure occurs when an application unintentionally exposes sensitive data that aids attackers in reconnaissance or directly compromises security.
Memory exhaustion in the adm-zip Node.js library before 0.6.1 allows remote, unauthenticated attackers to crash or sever
adm-zip npm library before 0.4.9 is vulnerable to directory traversal, allowing attackers to write to arbitrary files vi
Denial of service in adm-zip 0.6.0 and earlier lets remote attackers terminate the entire Node.js host process by submit
Integrity bypass in adm-zip through 0.6.0 allows an unauthenticated attacker who supplies a crafted ZIP to a validate-th
adm-zip versions before 0.6.1 can apply attacker-controlled setuid, setgid, or sticky bits when extracting archives with
Memory exhaustion in adm-zip 0.6.0 and earlier allows unauthenticated remote attackers to bypass the library's decompres
EUVD-2026-64851
GHSA-vwc7-r8mq-g2x9
NVD
CVE.org
EPSS
Vulnrichment
VulDB
Exploit-DB