Every CVE Search/ Get API key

CVE-2026-115905

zip: Critical Parser Differential & Security Control Bypass via Dual-Header Inconsistencies (Zip Cloaking) Leading to Arbitrary File Overwrite & RCE

10.0 CriticalPublic exploitFix available

zip is a zip library for Rust that supports reading and writing simple ZIP files. Through 9.0.4, ZipArchive treats Central Directory File Header filenames as authoritative while ZipStreamReader extracts using Local File Header filenames without reconciling the duplicate metadata in src/read/stream.rs. A crafted archive can therefore appear benign to a component that inspects the central directory but cause a streaming extractor to write a different attacker-selected path and content, potentially overwriting files used by a downstream service. This issue is fixed in version 9.0.5.

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
High
Integrity
High
Availability
High

Exploit likelihood

0.32%Unchanged since Oct 27, 2026
90%50%10%1%

What each source reports

CVE List Score used 10.0

zip: Critical Parser Differential & Security Control Bypass via Dual-Header Inconsistencies (Zip Cloaking) Leading to Arbitrary File Overwrite & RCE

zip is a zip library for Rust that supports reading and writing simple ZIP files. Through 9.0.4, ZipArchive treats Central Directory File Header filenames as authoritative while ZipStreamReader extracts using Local File Header filenames without reconciling the duplicate metadata in src/read/stream.rs. A crafted archive can therefore appear benign to a component that inspects the central directory but cause a streaming extractor to write a different attacker-selected path and content, potentially overwriting files used by a downstream service. This issue is fixed in version 9.0.5.

Record
CVE-2026-115905
CVSS 4.0
10.0 CriticalCVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:H/VI:H/VA:H/SC:H/SI:H/SA:L
Weakness
CWE-20, CWE-436
Updated
2026-11-02
EUVDEUVD-2026-109981 10.0

zip is a zip library for Rust that supports reading and writing simple ZIP files. Through 9.0.4, ZipArchive treats Central Directory File Header filenames as authoritative while ZipStreamReader extracts using Local File Header filenames without reconciling the duplicate metadata in src/read/stream.rs. A crafted archive can therefore appear benign to a component that inspects the central directory but cause a streaming extractor to write a different attacker-selected path and content, potentially overwriting files used by a downstream service. This issue is fixed in version 9.0.5.

Record
EUVD-2026-109981
CVSS 4.0
10.0 CriticalCVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:H/VI:H/VA:H/SC:H/SI:H/SA:L
Updated
2026-11-03
GitHub AdvisoriesGHSA-m665-v7pm-7grj 10.0

zip: Critical Parser Differential & Security Control Bypass via Dual-Header Inconsistencies (Zip Cloaking) Leading to Arbitrary File Overwrite & RCE

Summary

A critical architectural parser differential exists in the zip crate (<= 9.0.4) between random-access archive readers (ZipArchive) and streaming readers (ZipStreamReader). ZipArchive considers the Central Directory File Header (CDFH) authoritative and ignores the filename declared in the Local File Header (LFH). In contrast, ZipStreamReader relies exclusively on the Local File Header (LFH) when extracting files to the filesystem.

This discrepancy enables ZIP archives to appear to have different file paths and contents according to which tool is reading them.


Details

Architectural Root Cause

In the PKWARE ZIP archive format, every file entry is defined in two distinct locations:

  1. Local File Header (LFH): Precedes the compressed payload of each file in the body of the archive.
  2. Central Directory File Header (CDFH): Stored in a contiguous index at the end of the archive.

In zip2:

  • src/read/zip_archive.rs: ZipArchive parses the central directory into SharedBuilder.files. All file lookups by index or name read exclusively from the CDFH table, completely ignoring the filename present in the LFH.
  • src/read/stream.rs:L86-L141: ZipStreamReader::visit and ZipStreamReader::extract read sequentially from the stream without verifying the central directory index. Each entry is parsed via read_zipfile_from_stream and written to disk using the unverified filename declared in the LFH:
    // src/read/stream.rs
    fn visit_file<R: Read>(&mut self, file: &mut ZipFile<'_, R>) -> ZipResult<()> {
        file.safe_prepare_path(&self.outpath, &mut outpath, None::<&(_, fn(&Path) -> bool)>)?;
        let mut outfile = fs::File::create(&outpath)?;
        io::copy(file, &mut outfile)?;
        Ok(())
    }
    
  • src/write.rs:L1552: The crate explicitly exposes shallow_copy_file, an API that constructs dual-header desynchronizations by adding a new CDFH entry with an alias name pointing to an existing file without updating the original LFH.

Threat Scenario & Severity Justification (10.0 / 9.9 Critical)

  1. Security Control Evasion: An adversary crafts a ZIP archive where:
    • Central Directory Header declares: doc_report.pdf (Clean document)
    • Local File Header declares: cron_worker.sh (Malicious root backdoor)
  2. The archive is uploaded through a web portal or API endpoint protected by security gateways (WAF, Anti-Virus, Content Disarm & Reconstruction). The security gateway inspects the archive using ZipArchive (or similar CDFH-first parsers), detects only doc_report.pdf, and approves the file.
  3. The backend worker or cloud function receives the approved archive and extracts it using ZipStreamReader::extract. ZipStreamReader reads the LFH and overwrites cron_worker.sh.
  4. Full Compromise (CIA = High): The legitimate production health checker / service script is destroyed (Availability = High / DoS), while the attacker's backdoor payload is implanted (Integrity = High / RCE).

Proof of Concept

The following automated integration test reproducibly demonstrates the complete CVSS 10.0 / 9.9 exploit chain (Security Gateway Evasion -> Arbitrary File Overwrite -> RCE & DoS) against zip2:

use std::fs;
use std::io::{Cursor, Write};
use tempfile::tempdir;
use zip::unstable::stream::ZipStreamReader;
use zip::write::SimpleFileOptions;
use zip::{ZipArchive, ZipWriter};

// Simulated Security Gateway (inspects CDFH via ZipArchive)
fn security_gateway_inspection(archive_bytes: &[u8]) -> Result<(), String> {
    let mut archive = ZipArchive::new(Cursor::new(archive_bytes)).unwrap();
    for i in 0..archive.len() {
        let name = archive.by_index(i).unwrap().name().unwrap().to_string();
        if name.ends_with(".sh") || name.ends_with(".exe") {
            return Err(format!("MALWARE DETECTED: '{}' blocked!", name));
        }
        if !name.ends_with(".pdf") {
            return Err("Policy violation: only PDFs allowed!".into());
…
Record
GHSA-m665-v7pm-7grj
CVSS 4.0
10.0 CriticalCVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:H/VI:H/VA:H/SC:H/SI:H/SA:L
Weakness
CWE-20, CWE-436
Updated
2026-11-02
NVD 10.0

zip is a zip library for Rust that supports reading and writing simple ZIP files. Through 9.0.4, ZipArchive treats Central Directory File Header filenames as authoritative while ZipStreamReader extracts using Local File Header filenames without reconciling the duplicate metadata in src/read/stream.rs. A crafted archive can therefore appear benign to a component that inspects the central directory but cause a streaming extractor to write a different attacker-selected path and content, potentially overwriting files used by a downstream service. This issue is fixed in version 9.0.5.

Record
CVE-2026-115905
CVSS 4.0
10.0 CriticalCVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:H/VI:H/VA:H/SC:H/SI:H/SA:L/E:X/CR:X/IR:X/AR:X/MAV:X/MAC:X/MAT:X/MPR:X/MUI:X/MVC:X/MVI:X/MVA:X/MSC:X/MSI:X/MSA:X/S:X/AU:X/R:X/V:X/RE:X/U:X
Weakness
CWE-20, CWE-436
Updated
2026-11-02
OSV 10.0

zip: Critical Parser Differential & Security Control Bypass via Dual-Header Inconsistencies (Zip Cloaking) Leading to Arbitrary File Overwrite & RCE

zip is a zip library for Rust that supports reading and writing simple ZIP files. Through 9.0.4, ZipArchive treats Central Directory File Header filenames as authoritative while ZipStreamReader extracts using Local File Header filenames without reconciling the duplicate metadata in src/read/stream.rs. A crafted archive can therefore appear benign to a component that inspects the central directory but cause a streaming extractor to write a different attacker-selected path and content, potentially overwriting files used by a downstream service. This issue is fixed in version 9.0.5.

Record
CVE-2026-115905
CVSS 4.0
10.0 CriticalCVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:H/VI:H/VA:H/SC:H/SI:H/SA:L
Weakness
CWE-20, CWE-436
Updated
2026-11-07
OSVDEBIAN-CVE-2026-115905 10.0

zip is a zip library for Rust that supports reading and writing simple ZIP files. Through 9.0.4, ZipArchive treats Central Directory File Header filenames as authoritative while ZipStreamReader extracts using Local File Header filenames without reconciling the duplicate metadata in src/read/stream.rs. A crafted archive can therefore appear benign to a component that inspects the central directory but cause a streaming extractor to write a different attacker-selected path and content, potentially overwriting files used by a downstream service. This issue is fixed in version 9.0.5.

Record
DEBIAN-CVE-2026-115905
CVSS 4.0
10.0 CriticalCVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:H/VI:H/VA:H/SC:H/SI:H/SA:L/E:X/CR:X/IR:X/AR:X/MAV:X/MAC:X/MAT:X/MPR:X/MUI:X/MVC:X/MVI:X/MVA:X/MSC:X/MSI:X/MSA:X/S:X/AU:X/R:X/V:X/RE:X/U:X
Updated
2026-11-03
Show 9 moreShow less
OSVGHSA-m665-v7pm-7grj 10.0

zip: Critical Parser Differential & Security Control Bypass via Dual-Header Inconsistencies (Zip Cloaking) Leading to Arbitrary File Overwrite & RCE

Summary

A critical architectural parser differential exists in the zip crate (<= 9.0.4) between random-access archive readers (ZipArchive) and streaming readers (ZipStreamReader). ZipArchive considers the Central Directory File Header (CDFH) authoritative and ignores the filename declared in the Local File Header (LFH). In contrast, ZipStreamReader relies exclusively on the Local File Header (LFH) when extracting files to the filesystem.

This discrepancy enables ZIP archives to appear to have different file paths and contents according to which tool is reading them.


Details

Architectural Root Cause

In the PKWARE ZIP archive format, every file entry is defined in two distinct locations:

  1. Local File Header (LFH): Precedes the compressed payload of each file in the body of the archive.
  2. Central Directory File Header (CDFH): Stored in a contiguous index at the end of the archive.

In zip2:

  • src/read/zip_archive.rs: ZipArchive parses the central directory into SharedBuilder.files. All file lookups by index or name read exclusively from the CDFH table, completely ignoring the filename present in the LFH.
  • src/read/stream.rs:L86-L141: ZipStreamReader::visit and ZipStreamReader::extract read sequentially from the stream without verifying the central directory index. Each entry is parsed via read_zipfile_from_stream and written to disk using the unverified filename declared in the LFH:
    // src/read/stream.rs
    fn visit_file<R: Read>(&mut self, file: &mut ZipFile<'_, R>) -> ZipResult<()> {
        file.safe_prepare_path(&self.outpath, &mut outpath, None::<&(_, fn(&Path) -> bool)>)?;
        let mut outfile = fs::File::create(&outpath)?;
        io::copy(file, &mut outfile)?;
        Ok(())
    }
    
  • src/write.rs:L1552: The crate explicitly exposes shallow_copy_file, an API that constructs dual-header desynchronizations by adding a new CDFH entry with an alias name pointing to an existing file without updating the original LFH.

Threat Scenario & Severity Justification (10.0 / 9.9 Critical)

  1. Security Control Evasion: An adversary crafts a ZIP archive where:
    • Central Directory Header declares: doc_report.pdf (Clean document)
    • Local File Header declares: cron_worker.sh (Malicious root backdoor)
  2. The archive is uploaded through a web portal or API endpoint protected by security gateways (WAF, Anti-Virus, Content Disarm & Reconstruction). The security gateway inspects the archive using ZipArchive (or similar CDFH-first parsers), detects only doc_report.pdf, and approves the file.
  3. The backend worker or cloud function receives the approved archive and extracts it using ZipStreamReader::extract. ZipStreamReader reads the LFH and overwrites cron_worker.sh.
  4. Full Compromise (CIA = High): The legitimate production health checker / service script is destroyed (Availability = High / DoS), while the attacker's backdoor payload is implanted (Integrity = High / RCE).

Proof of Concept

The following automated integration test reproducibly demonstrates the complete CVSS 10.0 / 9.9 exploit chain (Security Gateway Evasion -> Arbitrary File Overwrite -> RCE & DoS) against zip2:

use std::fs;
use std::io::{Cursor, Write};
use tempfile::tempdir;
use zip::unstable::stream::ZipStreamReader;
use zip::write::SimpleFileOptions;
use zip::{ZipArchive, ZipWriter};

// Simulated Security Gateway (inspects CDFH via ZipArchive)
fn security_gateway_inspection(archive_bytes: &[u8]) -> Result<(), String> {
    let mut archive = ZipArchive::new(Cursor::new(archive_bytes)).unwrap();
    for i in 0..archive.len() {
        let name = archive.by_index(i).unwrap().name().unwrap().to_string();
        if name.ends_with(".sh") || name.ends_with(".exe") {
            return Err(format!("MALWARE DETECTED: '{}' blocked!", name));
        }
        if !name.ends_with(".pdf") {
            return Err("Policy violation: only PDFs allowed!".into());
…
Record
GHSA-m665-v7pm-7grj
CVSS 4.0
10.0 CriticalCVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:H/VI:H/VA:H/SC:H/SI:H/SA:L
Weakness
CWE-20, CWE-436
Updated
2026-11-02
OSVUBUNTU-CVE-2026-115905 10.0

zip is a zip library for Rust that supports reading and writing simple ZIP files. Through 9.0.4, ZipArchive treats Central Directory File Header filenames as authoritative while ZipStreamReader extracts using Local File Header filenames without reconciling the duplicate metadata in src/read/stream.rs. A crafted archive can therefore appear benign to a component that inspects the central directory but cause a streaming extractor to write a different attacker-selected path and content, potentially overwriting files used by a downstream service. This issue is fixed in version 9.0.5.

Record
UBUNTU-CVE-2026-115905
CVSS 4.0
10.0 CriticalCVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:H/VI:H/VA:H/SC:H/SI:H/SA:L
Updated
2026-11-02
OSVAZL-112214 No score

CVE-2026-115905 affecting package rust 1.75.0-31

zip is a zip library for Rust that supports reading and writing simple ZIP files. Through 9.0.4, ZipArchive treats Central Directory File Header filenames as authoritative while ZipStreamReader extracts using Local File Header filenames without reconciling the duplicate metadata in src/read/stream.rs. A crafted archive can therefore appear benign to a component that inspects the central directory but cause a streaming extractor to write a different attacker-selected path and content, potentially overwriting files used by a downstream service. This issue is fixed in version 9.0.5.

Record
AZL-112214
Updated
2026-11-05
OSVAZL-112223 No score

CVE-2026-115905 affecting package rust 1.98.1-1

zip is a zip library for Rust that supports reading and writing simple ZIP files. Through 9.0.4, ZipArchive treats Central Directory File Header filenames as authoritative while ZipStreamReader extracts using Local File Header filenames without reconciling the duplicate metadata in src/read/stream.rs. A crafted archive can therefore appear benign to a component that inspects the central directory but cause a streaming extractor to write a different attacker-selected path and content, potentially overwriting files used by a downstream service. This issue is fixed in version 9.0.5.

Record
AZL-112223
Updated
2026-11-05
OSVopenSUSE-SU-2026:12307-1 No score

python313-uv-0.13.6-1.1 on GA media

These are all security issues fixed in the python313-uv-0.13.6-1.1 package on the GA media of openSUSE Tumbleweed.

Record
openSUSE-SU-2026:12307-1
Updated
2026-11-02
OSVopenSUSE-SU-2026:12333-1 No score

keylime-ima-policy-0.2.10+12-1.1 on GA media

These are all security issues fixed in the keylime-ima-policy-0.2.10+12-1.1 package on the GA media of openSUSE Tumbleweed.

Record
openSUSE-SU-2026:12333-1
Updated
2026-11-02
OSVopenSUSE-SU-2026:12454-1 No score

gleam-1.19.2-1.1 on GA media

These are all security issues fixed in the gleam-1.19.2-1.1 package on the GA media of openSUSE Tumbleweed.

Record
openSUSE-SU-2026:12454-1
Updated
2026-11-07
OSVSUSE-SU-2026:4930-1 No score

Security update for rust-keylime

This update for rust-keylime fixes the following issue:

  • CVE-2026-115905: zip: security control bypass via parser differential between central directory and local headers (bsc#1287921)
  • CVE-2026-115906: zip: authentication bypass in AES encrypted entries due to improper HMAC verification (bsc#1287921)
  • CVE-2026-115907: zip: denial of service via unbounded memory allocation in legacy decoders (bsc#1287921)
  • CVE-2026-115908: zip: path traversal via lexical symlink validation during extraction (bsc#1287921)
  • CVE-2026-115909: zip: denial of service via uncontrolled memory allocation on symlink targets (bsc#1287921)

Changes for rust-keylime:

  • Update to version 0.2.10+12:
  • log Agent UUID at push agent startup
  • Limit actix-web workers
  • Fix clippy needless_late_init warnings
  • Unwrap OCTET STRING wrapped EK certificates
  • build(deps): bump rand from 0.9.4 to 0.10.1
  • build(deps): bump glob from 0.3.3 to 0.3.4
  • build(deps): bump reqwest from 0.13.3 to 0.13.4
  • Check shutdown marker inside ml_extend loop
  • Fix clippy useless_borrows_in_formatting warnings
  • build(deps): bump tokio from 1.52.2 to 1.53.1
  • Fix payload key upgrade regression by falling back to mTLS key
  • Accept any RSA key size for payload encryption
  • Bump version to 0.2.10
  • keylime: use runtime OpenSSL algorithm detection instead of compile-time symbols
Record
SUSE-SU-2026:4930-1
Updated
2026-11-02
OSVSUSE-SU-2026:4931-1 No score

Security update for rust-keylime

This update for rust-keylime fixes the following issue:

  • CVE-2026-115905: zip: security control bypass via parser differential between central directory and local headers (bsc#1287921)
  • CVE-2026-115906: zip: authentication bypass in AES encrypted entries due to improper HMAC verification (bsc#1287921)
  • CVE-2026-115907: zip: denial of service via unbounded memory allocation in legacy decoders (bsc#1287921)
  • CVE-2026-115908: zip: path traversal via lexical symlink validation during extraction (bsc#1287921)
  • CVE-2026-115909: zip: denial of service via uncontrolled memory allocation on symlink targets (bsc#1287921)

Changes for rust-keylime:

  • Update to version 0.2.10+12:
  • log Agent UUID at push agent startup
  • Limit actix-web workers
  • Fix clippy needless_late_init warnings
  • Unwrap OCTET STRING wrapped EK certificates
  • build(deps): bump rand from 0.9.4 to 0.10.1
  • build(deps): bump glob from 0.3.3 to 0.3.4
  • build(deps): bump reqwest from 0.13.3 to 0.13.4
  • Check shutdown marker inside ml_extend loop
  • Fix clippy useless_borrows_in_formatting warnings
  • build(deps): bump tokio from 1.52.2 to 1.53.1
  • Fix payload key upgrade regression by falling back to mTLS key
  • Accept any RSA key size for payload encryption
  • Bump version to 0.2.10
  • keylime: use runtime OpenSSL algorithm detection instead of compile-time symbols
Record
SUSE-SU-2026:4931-1
Updated
2026-11-02

Affected products

Affected packages

Affected packages
PackageAffectedFixed
zip
crates.io
through 9.0.4
9.0.5
rust
Azure Linux:3
through 1.75.0-31 None known
rust
Azure Linux:3
1.85.0 to 1.98.1-1 None known
rust-zip
Debian:12
All versions, plus listed versions
0.6.3-30.6.6-10.6.6-20.6.6-30.6.6-4
Show 9 moreShow less
0.6.6-52.5.0-15.1.1+dfsg-15.1.1-15.1.1-25.1.1-35.1.1-49.0.5+ds-19.1.3+ds-1
None known
rust-zip
Debian:13
All versions, plus listed versions
2.5.0-15.1.1+dfsg-15.1.1-15.1.1-25.1.1-35.1.1-49.0.5+ds-19.1.3+ds-1
None known
rust-zip
Debian:14
All versions, plus listed versions
2.5.0-15.1.1+dfsg-15.1.1-15.1.1-25.1.1-35.1.1-49.0.5+ds-19.1.3+ds-1
None known
zip
crates.io
before 9.0.5
9.0.5
rust-keylime
SUSE:Linux Enterprise Micro 5.4
From an advisory covering 5 CVEs
before 0.2.10+12-150400.3.22.1
0.2.10+12-150400.3.22.1
rust-keylime
SUSE:Linux Enterprise Micro 5.5
From an advisory covering 5 CVEs
before 0.2.10+12-150500.3.22.1
0.2.10+12-150500.3.22.1
rust-zip
Ubuntu:20.04:LTS
All versions, plus listed versions
0.5.0-10.5.3-10.5.3-2
None known
Show 7 moreShow less
Affected packages
PackageAffectedFixed
rust-zip
Ubuntu:22.04:LTS
All versions, plus listed versions
0.5.8-20.5.13-1
None known
rust-zip
Ubuntu:24.04:LTS
All versions, plus listed versions
0.6.6-10.6.6-2
None known
rust-zip
Ubuntu:26.10
All versions, plus listed versions
5.1.1-35.1.1+dfsg-1
None known
rust-zip
Ubuntu:26.04:LTS
All versions, plus listed versions
2.5.0-15.1.1-25.1.1-3
None known
python-uv
openSUSE:Tumbleweed
From an advisory covering 3 CVEs
before 0.13.6-1.1
0.13.6-1.1
rust-keylime
openSUSE:Tumbleweed
From an advisory covering 2 CVEs
before 0.2.10+12-1.1
0.2.10+12-1.1
gleam
openSUSE:Tumbleweed
From an advisory covering 3 CVEs
before 1.19.2-1.1
1.19.2-1.1

Public exploits

Links only. Every CVE stores no exploit code.

Public exploits
SourceLinkDate
PoC in GitHubfoxcornlab/zip-cloaking-scanner2026-10-27
PoC in GitHubcosmonic-labs/demo-zip-rce-sandbox2026-10-28

History

History
RecordedChangedSources
affected, aliases, referencesOSV
affectedOSV
factsOSV
affected, exploitsEUVD, OSV
first indexedCVE List, EUVD, GitHub Advisories, NVD, OSV, PoC in GitHub

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

In short

CVE-2026-115905 is a critical vulnerability (CVSS 10.0) in Zip-rs Zip2, published October 26, 2026. Public exploit code exists. EPSS puts the chance of exploitation in the next 30 days at 0.32%, the 25th percentile. Fixed in zip 9.0.5.

References

Show 18 moreShow less
This page doesn't list everything

Left out here: the rest of 2 source descriptions. The JSON record has them.

MoveEnter Open