PT-2026-65674 · Crates.Io · Tract-Nnef

Published

2026-06-18

·

Updated

2026-06-18

CVSS v3.1

6.1

Medium

VectorAV:L/AC:L/PR:N/UI:R/S:U/C:L/I:N/A:H
tract nnef::tensors::read tensor builds a tensor shape from attacker-controlled 32-bit dimensions and computes both the element count product(shape) and the byte allocation product(shape) * size of(dt) with unchecked usize arithmetic. In release builds (no overflow-checks) both products wrap modulo 2^64.
A crafted NNEF .dat tensor can choose dimensions whose wrapped products collapse to a small value that satisfies the header size-consistency check, while the true element count stays astronomically large. read tensor then returns a Tensor whose reported len (e.g. 2^61 + 7) far exceeds its backing heap allocation (e.g. 56 bytes). The unchecked accessor as slice unchecked (slice::from raw parts(ptr, self.len())) subsequently yields a slice spanning ~18 EiB over the small buffer.
The out-of-bounds read fires automatically during model build (no inference required), reachable through the default DatLoader resource loader via the public tract nnef::nnef().model for path / model for read API when the const-folding as uniform fast-path materializes the over-long constant. The always-on primitive is a bounded adjacent-heap over-read (information disclosure); access further past the mapped region SIGSEGVs (denial of service). No out-of-bounds write or code execution was demonstrated.
Affected: every release line prior to the backported fixes — < 0.21.16, 0.22.00.22.1, and 0.23.0. The block-quant path had already received an analogous blob-size guard; the dense DatLoader path was missed.

Mitigation

Upgrade to 0.21.16, 0.22.2, or 0.23.1. The fix computes the shape product and byte size with checked mul and rejects the tensor on overflow (commit 34c7df2).

Fix

Found an issue in the description? Have something to add? Feel free to write us 👾

Related Identifiers

RUSTSEC-2026-0217

Affected Products

Tract-Nnef