RUSTSEC-2026-0436
Panic and unbounded allocation (OOM) in the CFB/OLE2 parser on malformed input
The Compound File Binary (OLE2) parser (src/cfb.rs), used when reading .xls and .xlsb
workbooks and when extracting VBA projects from .xlsx, can panic or allocate without bound
on crafted input. Both are reachable through the public reader API (open_workbook,
Xls::new, Xlsb::new) on an attacker-supplied file. Impact is denial of service only — no
memory unsafety (safe Rust turns the out-of-bounds read into a bounds-checked panic).
-
Reachable panic (out-of-bounds slice index). The directory stream is iterated with
.chunks(128), butDirectory::from_slicereads fixed offsets (buf[..64],buf[116..120],buf[120..128]) without checking the chunk length. A directory stream whose length is not a multiple of 128 yields a short final chunk, causing a panic (range end index 64 out of range for slice of length N).SectorSize::Small64-byte mini sectors are a second trigger. -
Unbounded allocation / OOM. The DIFAT loader grows the
difatvector without bounding the number of iterations; a crafted self-referential DIFAT chain drives a multi-gigabyte allocation from a tiny file (a 512-byte file attempts an allocation of several gigabytes).
A consumer that parses untrusted or user-supplied spreadsheets can be crashed (thread panic,
or process abort under panic=abort) or driven out of memory by a small crafted file.
Fixed in calamine 0.38.0 (commit b8ec4f0); the maintainer confirmed the fix in https://github.com/tafia/calamine/pull/762.
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
What each source reports
OSV Score used
7.5
Panic and unbounded allocation (OOM) in the CFB/OLE2 parser on malformed input
The Compound File Binary (OLE2) parser (src/cfb.rs), used when reading .xls and .xlsb
workbooks and when extracting VBA projects from .xlsx, can panic or allocate without bound
on crafted input. Both are reachable through the public reader API (open_workbook,
Xls::new, Xlsb::new) on an attacker-supplied file. Impact is denial of service only — no
memory unsafety (safe Rust turns the out-of-bounds read into a bounds-checked panic).
-
Reachable panic (out-of-bounds slice index). The directory stream is iterated with
.chunks(128), butDirectory::from_slicereads fixed offsets (buf[..64],buf[116..120],buf[120..128]) without checking the chunk length. A directory stream whose length is not a multiple of 128 yields a short final chunk, causing a panic (range end index 64 out of range for slice of length N).SectorSize::Small64-byte mini sectors are a second trigger. -
Unbounded allocation / OOM. The DIFAT loader grows the
difatvector without bounding the number of iterations; a crafted self-referential DIFAT chain drives a multi-gigabyte allocation from a tiny file (a 512-byte file attempts an allocation of several gigabytes).
A consumer that parses untrusted or user-supplied spreadsheets can be crashed (thread panic,
or process abort under panic=abort) or driven out of memory by a small crafted file.
Fixed in calamine 0.38.0 (commit b8ec4f0); the maintainer confirmed the fix in https://github.com/tafia/calamine/pull/762.
- Record
RUSTSEC-2026-0436- CVSS 3.1
- 7.5 High
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H - Updated
- 2026-11-03
Affected packages
| Package | Affected | Fixed |
|---|---|---|
calaminecrates.io |
0.0.0-0 up to 0.38.0 | 0.38.0 |
History
| Recorded | Changed | Sources |
|---|---|---|
| first indexed | OSV |
Dates are when Every CVE recorded each change. Upstream dates may differ.
In short
RUSTSEC-2026-0436 is a high vulnerability (CVSS 7.5) in calamine, published October 28, 2026. No source lists public exploit code. Fixed in calamine 0.38.0.