Every CVE Search/ Get API key

CVE-2026-77301

adm-zip: Uncontrolled memory allocation via the declared uncompressed size (DoS)

7.5 HighFix available

adm-zip is a JavaScript library for creating and extracting ZIP archives in Node.js. Prior to 0.6.1, getData() in zipEntry.js trusts an entry's central-directory uncompressed size and allocates output memory before validating that value against the actual compressed data and decompression result. A small crafted ZIP can declare a multi-gigabyte uncompressed size, causing Buffer.alloc and decompression handling to commit excessive resident memory before CRC validation reports an error. Applications that read entries from untrusted archives can therefore be terminated by the operating system or suffer service-wide memory exhaustion. This issue is fixed in version 0.6.1.

Attack profile

How easy it is to exploit

Attack vector
Network
Complexity
Low
Privileges needed
None
User interaction
None

What an attacker can affect

Confidentiality
None
Integrity
None
Availability
High

Exploit likelihood

0.61%Up 0.2 points since Sep 19, 2026
90%50%10%1%

What each source reports

CVE List Score used 7.5

adm-zip: Uncontrolled memory allocation via the declared uncompressed size (DoS)

adm-zip is a JavaScript library for creating and extracting ZIP archives in Node.js. Prior to 0.6.1, getData() in zipEntry.js trusts an entry's central-directory uncompressed size and allocates output memory before validating that value against the actual compressed data and decompression result. A small crafted ZIP can declare a multi-gigabyte uncompressed size, causing Buffer.alloc and decompression handling to commit excessive resident memory before CRC validation reports an error. Applications that read entries from untrusted archives can therefore be terminated by the operating system or suffer service-wide memory exhaustion. This issue is fixed in version 0.6.1.

Record
CVE-2026-77301
CVSS 3.1
7.5 HighCVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H
Weakness
CWE-789
Updated
2026-11-02
EUVDEUVD-2026-83170 7.5

adm-zip is a JavaScript library for creating and extracting ZIP archives in Node.js. Prior to 0.6.1, getData() in zipEntry.js trusts an entry's central-directory uncompressed size and allocates output memory before validating that value against the actual compressed data and decompression result. A small crafted ZIP can declare a multi-gigabyte uncompressed size, causing Buffer.alloc and decompression handling to commit excessive resident memory before CRC validation reports an error. Applications that read entries from untrusted archives can therefore be terminated by the operating system or suffer service-wide memory exhaustion. This issue is fixed in version 0.6.1.

Record
EUVD-2026-83170
CVSS 3.1
7.5 HighCVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H
Updated
2026-11-02
GitHub AdvisoriesGHSA-7q85-xj36-vmfc 7.5

adm-zip: Uncontrolled memory allocation via the declared uncompressed size (DoS)

Summary

adm-zip allocates an entry's output buffer from the declared uncompressed size (central-directory size field) before validating it against the actual data. A tiny crafted ZIP that declares a huge uncompressed size forces a multi-gigabyte allocation from a few bytes.

Impact

On adm-zip 0.5.17 (latest), Node 24, a 105-byte ZIP with one stored entry declaring size = 1,774,399,200 makes new AdmZip(buf).getEntries()[0].getData() commit ~1.8 GB of resident memory in ~4.4 s before throwing Error: ADM-ZIP: CRC32 checksum failed, roughly 16 million times the input size. Because the buffer is committed before any validation, on a memory-constrained host (containers, serverless, small VMs) the allocation OOM-kills the process before the CRC check (uncatchable), and concurrent requests can exhaust memory even on larger hosts. Any service that reads entries from untrusted ZIPs is exposed to a remote denial of service.

Steps to reproduce

Attachments are not supported in the advisory form, so the 105-byte PoC (sha256 980d34356fbb248fe527b9d0ac3eabc5c99393a374014be6199523de16709386) is inlined as base64 in this self-contained reproducer:

const AdmZip = require('adm-zip');
// 105-byte crafted ZIP, base64-inlined
// sha256 980d34356fbb248fe527b9d0ac3eabc5c99393a374014be6199523de16709386
const b64 = "UEsDBBQAAAAAAAAAAAAAAAAABQAAAAUAAAABAAAAYWhlbGxvUEsBAhQAFAAAAAAAAAAAAAAAAAAFAAAA4C7DaQEAAAAAAAAAAAAAAAAAAAAAAGFQSwUGAAAAAAEAAQAvAAAAJAAAAAAA";
const buf = Buffer.from(b64, "base64");          // 105 bytes
const zip = new AdmZip(buf);
zip.getEntries()[0].getData();   // commits ~1.8 GB, then throws "ADM-ZIP: CRC32 checksum failed"

The single entry declares uncompressed size = 1,774,399,200 with a compressed size of 5. getData() allocates the full declared size before the CRC check runs, so the memory is committed regardless of the (tiny) actual payload.

Root cause

zipEntry.js does Buffer.alloc(<declared uncompressed size>) before checking the declared size against the compressed size / available bytes.

Suggested fix

Validate the declared uncompressed size against the compressed size and a configurable maximum before allocating (yauzl, for example, requires the caller to bound this); reject or stream when the declared size is implausible relative to the input. Happy to send a patch.

Record
GHSA-7q85-xj36-vmfc
CVSS 3.1
7.5 HighCVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H
Weakness
CWE-789
Updated
2026-11-02
NVD 7.5

adm-zip is a JavaScript library for creating and extracting ZIP archives in Node.js. Prior to 0.6.1, getData() in zipEntry.js trusts an entry's central-directory uncompressed size and allocates output memory before validating that value against the actual compressed data and decompression result. A small crafted ZIP can declare a multi-gigabyte uncompressed size, causing Buffer.alloc and decompression handling to commit excessive resident memory before CRC validation reports an error. Applications that read entries from untrusted archives can therefore be terminated by the operating system or suffer service-wide memory exhaustion. This issue is fixed in version 0.6.1.

Record
CVE-2026-77301
CVSS 3.1
7.5 HighCVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H
Weakness
CWE-789
Updated
2026-11-02
OSV 7.5

adm-zip: Uncontrolled memory allocation via the declared uncompressed size (DoS)

adm-zip is a JavaScript library for creating and extracting ZIP archives in Node.js. Prior to 0.6.1, getData() in zipEntry.js trusts an entry's central-directory uncompressed size and allocates output memory before validating that value against the actual compressed data and decompression result. A small crafted ZIP can declare a multi-gigabyte uncompressed size, causing Buffer.alloc and decompression handling to commit excessive resident memory before CRC validation reports an error. Applications that read entries from untrusted archives can therefore be terminated by the operating system or suffer service-wide memory exhaustion. This issue is fixed in version 0.6.1.

Record
CVE-2026-77301
CVSS 3.1
7.5 HighCVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H
Weakness
CWE-789
Updated
2026-11-02
OSVGHSA-7q85-xj36-vmfc 7.5

adm-zip: Uncontrolled memory allocation via the declared uncompressed size (DoS)

Summary

adm-zip allocates an entry's output buffer from the declared uncompressed size (central-directory size field) before validating it against the actual data. A tiny crafted ZIP that declares a huge uncompressed size forces a multi-gigabyte allocation from a few bytes.

Impact

On adm-zip 0.5.17 (latest), Node 24, a 105-byte ZIP with one stored entry declaring size = 1,774,399,200 makes new AdmZip(buf).getEntries()[0].getData() commit ~1.8 GB of resident memory in ~4.4 s before throwing Error: ADM-ZIP: CRC32 checksum failed, roughly 16 million times the input size. Because the buffer is committed before any validation, on a memory-constrained host (containers, serverless, small VMs) the allocation OOM-kills the process before the CRC check (uncatchable), and concurrent requests can exhaust memory even on larger hosts. Any service that reads entries from untrusted ZIPs is exposed to a remote denial of service.

Steps to reproduce

Attachments are not supported in the advisory form, so the 105-byte PoC (sha256 980d34356fbb248fe527b9d0ac3eabc5c99393a374014be6199523de16709386) is inlined as base64 in this self-contained reproducer:

const AdmZip = require('adm-zip');
// 105-byte crafted ZIP, base64-inlined
// sha256 980d34356fbb248fe527b9d0ac3eabc5c99393a374014be6199523de16709386
const b64 = "UEsDBBQAAAAAAAAAAAAAAAAABQAAAAUAAAABAAAAYWhlbGxvUEsBAhQAFAAAAAAAAAAAAAAAAAAFAAAA4C7DaQEAAAAAAAAAAAAAAAAAAAAAAGFQSwUGAAAAAAEAAQAvAAAAJAAAAAAA";
const buf = Buffer.from(b64, "base64");          // 105 bytes
const zip = new AdmZip(buf);
zip.getEntries()[0].getData();   // commits ~1.8 GB, then throws "ADM-ZIP: CRC32 checksum failed"

The single entry declares uncompressed size = 1,774,399,200 with a compressed size of 5. getData() allocates the full declared size before the CRC check runs, so the memory is committed regardless of the (tiny) actual payload.

Root cause

zipEntry.js does Buffer.alloc(<declared uncompressed size>) before checking the declared size against the compressed size / available bytes.

Suggested fix

Validate the declared uncompressed size against the compressed size and a configurable maximum before allocating (yauzl, for example, requires the caller to bound this); reject or stream when the declared size is implausible relative to the input. Happy to send a patch.

Record
GHSA-7q85-xj36-vmfc
CVSS 3.1
7.5 HighCVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H
Weakness
CWE-789
Updated
2026-11-02
Show 9 moreShow less
OSVCLSA-2026-1784596298 No score

TuxCare security update for adm-zip (2 CVEs)

TuxCare rebuilt adm-zip to address 2 CVEs. Fixed in 0.4.7-tuxcare.1.

Record
CLSA-2026-1784596298
Updated
2026-11-02
OSVCLSA-2026-1784769498 No score

TuxCare security update for adm-zip (2 CVEs)

TuxCare rebuilt adm-zip to address 2 CVEs. Fixed in 0.4.16-tuxcare.1.

Record
CLSA-2026-1784769498
Updated
2026-11-02
OSVCLSA-2026-1790161409 No score

TuxCare security update for adm-zip (2 CVEs)

TuxCare rebuilt adm-zip to address 2 CVEs. Fixed in 0.6.0-tuxcare.2.

Record
CLSA-2026-1790161409
Updated
2026-11-02
OSVCLSA-2026-1790162622 No score

TuxCare security update for adm-zip (1 CVE)

TuxCare rebuilt adm-zip to address 1 CVE. Fixed in 0.5.18-tuxcare.2.

Record
CLSA-2026-1790162622
Updated
2026-11-02
OSVCLSA-2026-1790166345 No score

TuxCare security update for adm-zip (1 CVE)

TuxCare rebuilt adm-zip to address 1 CVE. Fixed in 0.5.17-tuxcare.2.

Record
CLSA-2026-1790166345
Updated
2026-11-02
OSVCLSA-2026-1790180021 No score

TuxCare security update for adm-zip (1 CVE)

TuxCare rebuilt adm-zip to address 1 CVE. Fixed in 0.5.16-tuxcare.2.

Record
CLSA-2026-1790180021
Updated
2026-11-02
OSVCLSA-2026-1791626782 No score

TuxCare security update for adm-zip (1 CVE)

TuxCare rebuilt adm-zip to address 1 CVE. Fixed in 0.5.10-tuxcare.3.

Record
CLSA-2026-1791626782
Updated
2026-11-02
OSVCLSA-2026-1791989313 No score

TuxCare security update for adm-zip (4 CVEs)

TuxCare rebuilt adm-zip to address 4 CVEs. Fixed in 0.5.12-tuxcare.4.

Record
CLSA-2026-1791989313
Updated
2026-11-02
OSVROOT-APP-NPM-CVE-2026-77301 No score

CVE-2026-77301 in adm-zip - Patched by Root

Root has patched CVE-2026-77301 in the adm-zip package for Root:npm. Multiple fixed versions available.

Record
ROOT-APP-NPM-CVE-2026-77301
Updated
2026-11-06

Affected products

Affected packages

Affected packages
PackageAffectedFixed
adm-zip
npm
before 0.6.1
0.6.1
adm-zip
TuxCare:npm
From an advisory covering 2 CVEs
0.4.7-tuxcare.0 up to 0.4.7-tuxcare.1, plus listed versions
0.4.7
0.4.7-tuxcare.1
adm-zip
TuxCare:npm
From an advisory covering 2 CVEs
0.4.16-tuxcare.0 up to 0.4.16-tuxcare.1, plus listed versions
0.4.16
0.4.16-tuxcare.1
adm-zip
TuxCare:npm
From an advisory covering 2 CVEs
0.6.0-tuxcare.0 up to 0.6.0-tuxcare.2, plus listed versions
0.6.00.6.0-tuxcare.1
0.6.0-tuxcare.2
adm-zip
TuxCare:npm
0.5.18-tuxcare.0 up to 0.5.18-tuxcare.2, plus listed versions
0.5.180.5.18-tuxcare.1
0.5.18-tuxcare.2
adm-zip
TuxCare:npm
0.5.17-tuxcare.0 up to 0.5.17-tuxcare.2, plus listed versions
0.5.170.5.17-tuxcare.1
0.5.17-tuxcare.2
adm-zip
TuxCare:npm
0.5.16-tuxcare.0 up to 0.5.16-tuxcare.2, plus listed versions
0.5.160.5.16-tuxcare.1
0.5.16-tuxcare.2
adm-zip
TuxCare:npm
0.5.10-tuxcare.0 up to 0.5.10-tuxcare.3, plus listed versions
0.5.100.5.10-tuxcare.10.5.10-tuxcare.2
0.5.10-tuxcare.3
adm-zip
TuxCare:npm
From an advisory covering 3 CVEs
0.5.12-tuxcare.0 up to 0.5.12-tuxcare.4, plus listed versions
0.5.120.5.12-tuxcare.10.5.12-tuxcare.20.5.12-tuxcare.3
0.5.12-tuxcare.4
adm-zip
Root:npm
before 0.5.16-aikido.2
0.5.16-aikido.20.5.18-aikido.20.6.0-aikido.10.5.10-aikido.20.6.0-aikido.20.6.0-aikido.30.5.10-aikido.30.5.10-aikido.40.5.10-aikido.50.5.9-aikido.20.5.18-aikido.30.5.9-aikido.30.5.16-aikido.3
@rootio/adm-zip
Root:npm
before 0.5.16-root.io.2
0.5.16-root.io.20.5.18-root.io.20.6.0-root.io.10.5.10-root.io.20.6.0-root.io.20.6.0-root.io.30.5.10-root.io.30.5.10-root.io.40.5.10-root.io.50.5.9-root.io.20.5.18-root.io.30.5.9-root.io.30.5.16-root.io.3

History

History
RecordedChangedSources
affected, factsOSV
first indexedCVE List, EUVD, GitHub Advisories, NVD, OSV

Dates are when Every CVE recorded each change. Upstream dates may differ.

In short

CVE-2026-77301 is a high vulnerability (CVSS 7.5) in Cthackers Adm-zip, published August 4, 2026. No source lists public exploit code. EPSS puts the chance of exploitation in the next 30 days at 0.61%, the 49th percentile. Fixed in adm-zip 0.6.1.

References

MoveEnter Open