{"id":"CVE-2026-115906","kind":"vulnerability","aliases":["CVE-2026-115906"],"related":[],"title":"zip Rust crate: truncated AES entries can skip HMAC authentication check","description":"zip is a zip library for Rust that supports reading and writing simple ZIP files. From 0.6.0 until 9.0.0, the AES entry reader in src/aes.rs verifies its HMAC only when the attacker-controlled data counter reaches zero. If the underlying bounded reader reaches the real end of the archive while data_remaining is still positive, or if an encrypted entry has no payload, the reader can return a clean end of stream without reading and comparing the authentication tag. Applications using by_index_decrypt, by_name_decrypt, by_path_decrypt, or password-enabled by_index_with_options can therefore accept modified plaintext without an authentication error. This issue is fixed in version 9.0.0.","summary":"The zip Rust crate, versions 0.6.0 through 8.x, can return a clean end of stream for an AES-encrypted entry without verifying its authentication tag when the archive is truncated or the entry has no payload. An attacker who can modify an encrypted archive can get tampered plaintext accepted without an authentication error.","severity":"medium","cvss":6.5,"epss":null,"exploited":false,"exploited_at":null,"products":[],"ecosystems":[],"tags":["cargo","package","rust","zip"],"not_affected_if":["no-aes-decryption","trusted-archives-only"],"how_to_check":"- Check the zip version in Cargo.lock with `grep -A1 'name = \"zip\"' Cargo.lock`\n- Look for calls to `by_index_decrypt`, `by_name_decrypt`, `by_path_decrypt` or `by_index_with_options` with a password in the project source","fix":"- Upgrade the zip crate to `9.0.0` or later with `cargo update -p zip`\n- Until upgraded, do not rely on AES-encrypted zip entries from untrusted sources for integrity","status":"open","published_at":"2026-10-26T17:17:17+00:00","first_seen_at":"2026-10-26T17:31:22+00:00","triaged_at":"2026-10-26T17:33:20+00:00","updated_at":"2026-10-26T17:33:20+00:00","category":"package","confidence":0.7,"triage":{"at":"2026-10-26T17:33:20Z","model":"claude-haiku-5-5","output":{"fix":"- Upgrade the zip crate to `9.0.0` or later with `cargo update -p zip`\n- Until upgraded, do not rely on AES-encrypted zip entries from untrusted sources for integrity","reach":"unknown","title":"zip Rust crate: truncated AES entries can skip HMAC authentication check","impact":"medium","summary":"The zip Rust crate, versions 0.6.0 through 8.x, can return a clean end of stream for an AES-encrypted entry without verifying its authentication tag when the archive is truncated or the entry has no payload. An attacker who can modify an encrypted archive can get tampered plaintext accepted without an authentication error.","category":"package","nicknames":[],"who_cares":["rust","zip","cargo"],"confidence":0.7,"needs_auth":"no","worst_case":"tampered encrypted archive contents accepted without authentication error","analyst_note":"","how_to_check":"- Check the zip version in Cargo.lock with `grep -A1 'name = \"zip\"' Cargo.lock`\n- Look for calls to `by_index_decrypt`, `by_name_decrypt`, `by_path_decrypt` or `by_index_with_options` with a password in the project source","needs_analyst":false,"not_affected_if":["no-aes-decryption","trusted-archives-only"],"who_is_affected":"Applications that read AES-encrypted ZIP entries in Rust using the zip crate's decrypt or password-enabled reader APIs, where the archive can come from an untrusted or tamperable source. Projects that only write unencrypted zips or never decrypt untrusted archives can skip it.","user_interaction":"no","needs_special_setup":"yes","severity_if_unknown":"medium"},"cost_usd":0.000643,"input_tokens":3441,"output_tokens":598,"severity_before":"medium"},"analyst_status":null,"analyst_note":null,"search":"'-115906':14A,17A '-2026':13A,16A '0.6.0':27B,93C '8':29B '9.0.0':95C,191C 'accept':72B,178C 'ae':5A,41B,97C 'aes-encrypt':40B 'applic':157C 'archiv':51B,67B,126C 'attack':61B,109C 'attacker-control':108C 'authent':10A,47B,75B,155C,183C 'bound':118C 'cargo':18B 'check':11A 'clean':34B,146C 'compar':153C 'control':110C 'counter':112C 'crate':3A,25B 'cve':12A,15A 'data':111C,128C 'decrypt':161C,164C,167C 'enabl':171C 'encrypt':42B,66B,136C 'end':35B,123C,147C 'entri':6A,43B,56B,98C,137C 'error':76B,184C 'file':91C 'fix':188C 'get':69B 'hmac':9A,104C 'index':160C,173C 'issu':186C 'librari':81C 'modifi':64B,179C 'name':163C 'option':175C 'packag':19B 'password':170C 'password-en':169C 'path':166C 'payload':59B,140C 'plaintext':71B,180C 'posit':132C 'reach':113C,120C 'read':86C,151C 'reader':99C,119C,142C 'real':122C 'remain':129C 'return':32B,144C 'rust':2A,20B,24B,83C 'simpl':89C 'skip':8A 'src/aes.rs':101C 'still':131C 'stream':37B,149C 'support':85C 'tag':48B,156C 'tamper':70B 'therefor':177C 'truncat':4A,53B 'under':117C 'use':158C 'verifi':45B,102C 'version':26B,190C 'without':44B,73B,150C,181C 'write':88C 'x':30B 'zero':114C 'zip':1A,21B,23B,77C,80C,90C","nicknames":[],"mitigations":[],"who_affected":"Applications that read AES-encrypted ZIP entries in Rust using the zip crate's decrypt or password-enabled reader APIs, where the archive can come from an untrusted or tamperable source. Projects that only write unencrypted zips or never decrypt untrusted archives can skip it.","tier":"C","verified":{},"analyst_revisit_at":null,"first_public_at":"2026-10-26T17:17:17+00:00","kev":null,"cvss_vector":"CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:N/I:H/A:N","cvss_by":"security-advisories@github.com","poc_count":0,"sources":[{"source":"nvd","external_id":"CVE-2026-115906","url":"https://nvd.nist.gov/vuln/detail/CVE-2026-115906","severity":null,"published_at":"2026-10-26T17:17:17+00:00","modified_at":"2026-10-26T17:17:17+00:00","first_seen_at":"2026-10-26T17:31:22+00:00","fetched_at":"2026-10-26T17:31:22+00:00","note":null}],"documents":[],"notice":"Free to read at a human pace. An API with keys and an MCP server are in preparation; early access: hello@infrastack.ai"}