Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
AccessCraft ZIP with canonically equivalent entry names
-
ExploitSubmit archive to application for validation
-
ExecutiongetEntry/readAsText inspects benign duplicate
-
ImpactextractAllTo writes malicious content to same path
Vulnerability Assessment
| Weakness |
CWE
OWASP Top 10:2025
A06:2025 - Insecure Design
ASVS 5.0
V4 - API and Web Service Interpretation consistency
|
| Exploitation Conditions | Exploitation requires the consuming application to use adm-zip's validate-then-extract pattern: it must inspect entry content via getEntry() or readAsText() to approve the archive, then write it out with extractAllTo(). The attacker must craft an archive containing duplicate entries under canonically equivalent names (e.g. './hello.txt' and 'hello.txt') so readEntries() treats them as distinct and the validated entry differs from the extracted one. Limiting factors: only adm-zip through 0.6.1 is affected; the impact is confined to integrity (a wrong file written to an expected path), with no confidentiality or availability effect; and applications that extract without a prior content-validation step gain no security benefit to bypass, so the flaw is inert for them. |
| Impact | This is a medium-severity integrity issue, not a top-tier emergency. The supplied CVSS 4.0 vector (AV:N/AC:L/AT:P/PR:N/UI:N) scores 6.3 and limits impact to the vulnerable system's integrity (VI:L) with no confidentiality (VC:N) or availability (VA:N) effect, matching a validation-bypass rather than code execution. Network reach and no required privileges raise exposure, but the AT:P 'attack requirement' is the key moderator: exploitation only matters when a consuming application uses adm-zip's validate-then-extract pattern. No EPSS score was provided and the CVE is not in CISA KEV, so there is no signal of widespread or active exploitation; the vuln.today decision label is 'this_month', consistent with scheduled remediation rather than act_now/emergency. No explicit 'POC: Publicly available (confirmed)' marker is present in the input, though a VulnCheck advisory and GitHub issue #587 document the mechanism. Overall this is a real but conditional integrity-bypass risk whose impact depends heavily on how downstream applications use the library, not a high-CVSS-but-no-real-risk inflation nor an urgent actively-exploited flaw. |
| Exploit ScenarioDerived | An attacker submits a crafted ZIP archive to an application that first inspects entries with getEntry() or readAsText() to approve their content, then unpacks with extractAllTo(). Because the readEntries() duplicate check is evaded using canonically equivalent names such as './hello.txt' and 'hello.txt', the validator sees benign content while extraction writes the malicious variant to the same path, defeating the integrity check. No confirmed working exploit code is marked in the input; VulnCheck's advisory and GitHub issue #587 describe the technique. |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAIv1 – Oct 25, 2026
An integrity bypass in the Node.js archiving library adm-zip (through version 0.6.1) allows a crafted ZIP to defeat duplicate-entry validation by registering the same target file under canonically equivalent names such as './hello.txt' and 'hello.txt'. Applications that follow a validate-then-extract pattern - approving an archive by reading an entry with getEntry() or readAsText(), then unpacking it with extractAllTo() - can therefore approve benign content and still write attacker-chosen content to the expected path. This is a medium-severity integrity issue affecting npm consumers of adm-zip at or below 0.6.1; no public exploit code was identified at time of analysis and there is no CISA KEV confirmation of active exploitation, while the vulnerability is inert for applications that extract untrusted archives without relying on a prior content-validation step.
RemediationAI
No vendor-released patched version is identified in the available data; track https://github.com/cthackers/adm-zip/issues/587 and the GitHub repository for a fix release above 0.6.1, and pin or upgrade as soon as one is published. Until then, applications using the validate-then-extract pattern should stop trusting adm-zip's own duplicate detection: normalize every entry name before both validation and extraction (strip leading './' and redundant separators, resolve '..' segments, apply a consistent case-folding policy) and reject any archive containing two entries whose normalized paths collide - the trade-off is that legitimate archives with redundant path spellings will be refused. A stronger control is to extract into a fresh, isolated directory first and then verify the written files by hash or size against the content that was originally approved, rather than approving in-memory entry content via getEntry() or readAsText(); this costs an extra I/O pass and temporary disk space but closes the mismatch entirely. Applications that never validate content before calling extractAllTo() gain nothing from adm-zip's check and should instead enforce their own path-traversal and overwrite policy on the destination directory. If neither workaround is feasible, route untrusted ZIP handling through a separate extraction service with filesystem-level uniqueness enforcement.
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
CWE-436 (Interpretation Conflict) is the root cause: adm-zip's readEntries() logic compares raw entry-name strings when detecting duplicates, but the ZIP format and the underlying filesystem resolve different strings to the same path. A name like './hello.txt' normalizes to 'hello.txt' once extracted, so the library's de-duplication check treats the two entries as distinct objects while the operating system overwrites one with the other. The referenced source points at exactly these surfaces: the readEntries() check in zipFile.js (lines 81-92), the getEntry() path in adm-zip.js (line 87), and the utility normalization helper in util/utils.js (line 383). The practical consequence is a split between what a caller validates and what is written to disk - a classic validation/extraction mismatch rather than a memory-safety flaw. The affected technology is the pure-JavaScript adm-zip package distributed via npm and widely embedded in Node.js file-upload, build-artifact, document-import, and plugin-installation handlers.
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:N/AC:L/AT:P/PR:N/UI:N/VC:N/VI:L/VA:N/SC:N/SI:N/SA:N
Archive is attacker-supplied over the network (AV:N, PR:N, UI:N); exploitation depends on the app's validate-then-extract pattern (AC:H); only integrity is affected (I:L, C:N, A:N).
Primary rating from Vendor (VulnCheck).
CVSS VectorVendor: VulnCheck
DescriptionCVE.org
adm-zip through 0.6.1 contains a duplicate-entry validation bypass that allows attackers to evade the readEntries() check by using canonically equivalent entry names like './hello.txt' and 'hello.txt'. Attackers can craft ZIP archives where getEntry() or readAsText() validates benign content while extractAllTo() writes malicious content to the same path, bypassing integrity checks.
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
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
Memory exhaustion in adm-zip 0.6.0 and earlier allows unauthenticated remote attackers to bypass the library's decompres
adm-zip versions before 0.6.1 can apply attacker-controlled setuid, setgid, or sticky bits when extracting archives with
Symlink-following during ZIP extraction in adm-zip 0.5.9 through 0.6.0 allows a local attacker who can plant a symlink i
EUVD-2026-109389
GHSA-mv5w-h6hm-qcp7
NVD
CVE.org
EPSS
VulDB
Exploit-DB