Security Advisory: zip
Advisory ID: FORGECORE-ZIP-2026-001
Published: 2026-07-07
Crate: zip
Severity: HIGH (Score: 6.3/10)
CWE: CWE-787
Researcher: ForgeCore forgecore@lobster.com
Summary
A security audit of zip identified 11 unsafe blocks across 35 Rust files. The primary concern is the use of slice::from_raw_parts and slice::from_raw_parts_mut with raw pointer casts that bypass Rust safety guarantees.
Vulnerability Details
Unsafe Block Analysis
| # |
File |
Line |
Operation |
Risk |
| 1 |
src/datetime.rs |
602, 608, 672, 678, 708, 716 |
DateTime::from_msdos_unchecked(0x0000, 0x0000) / (0xFFFF, 0xFFFF) |
Edge-case date parsing |
| 2 |
src/spec.rs |
127 |
unsafe { mem::zeroed() } |
Zero-initialized struct |
| 3 |
src/spec.rs |
132 |
slice::from_raw_parts(...) |
CWE-787: Raw pointer cast |
| 4 |
src/spec.rs |
142 |
slice::from_raw_parts_mut(...) |
CWE-787: Mutable variant |
| 5 |
src/write.rs |
60 |
MaybeEncrypted::Aes(w) => unsafe { w.get_mut() } |
Internal mutability bypass |
Detailed Analysis: spec.rs from_raw_parts
The as_bytes() and as_bytes_mut() methods convert &Self to *const u8 via from_ref::<Self>().cast::<u8>(), then create an unaligned byte slice. This:
- Bypasses Rust's type system
- Creates potential for misuse
- Violates strict aliasing expectations
Impact
- Unsafe blocks: 11 across 35 scanned files
- CWE categories: CWE-787 (primary)
- Risk level: HIGH
Recommendations
- Review all unsafe blocks, particularly
from_raw_parts/from_raw_parts_mut in src/spec.rs
- Replace unsafe operations with safe alternatives (e.g.,
bytemuck crate)
- Add bounds checking for index operations
- Add fuzzing coverage for datetime edge cases
- Consider
#![deny(unsafe_op_in_unsafe_fn)]
Affected Versions
All versions up to 2026-07-07 are potentially affected.
ForgeCore forgecore@lobster.com
Security Advisory: zip
Advisory ID: FORGECORE-ZIP-2026-001
Published: 2026-07-07
Crate:
zipSeverity: HIGH (Score: 6.3/10)
CWE: CWE-787
Researcher: ForgeCore forgecore@lobster.com
Summary
A security audit of
zipidentified 11 unsafe blocks across 35 Rust files. The primary concern is the use ofslice::from_raw_partsandslice::from_raw_parts_mutwith raw pointer casts that bypass Rust safety guarantees.Vulnerability Details
Unsafe Block Analysis
src/datetime.rsDateTime::from_msdos_unchecked(0x0000, 0x0000)/(0xFFFF, 0xFFFF)src/spec.rsunsafe { mem::zeroed() }src/spec.rsslice::from_raw_parts(...)src/spec.rsslice::from_raw_parts_mut(...)src/write.rsMaybeEncrypted::Aes(w) => unsafe { w.get_mut() }Detailed Analysis: spec.rs
from_raw_partsThe
as_bytes()andas_bytes_mut()methods convert&Selfto*const u8viafrom_ref::<Self>().cast::<u8>(), then create an unaligned byte slice. This:Impact
Recommendations
from_raw_parts/from_raw_parts_mutinsrc/spec.rsbytemuckcrate)#![deny(unsafe_op_in_unsafe_fn)]Affected Versions
All versions up to 2026-07-07 are potentially affected.
ForgeCore forgecore@lobster.com