docs: changelog and known issues for the header hardening

CHANGELOG (Correctness): the new header, datatype, chunk and truncation
checks, what is left out on purpose (checks HDF5 2.0 lacks; the two
v2.7.0 writer quirks), the conformance numbers and the new FormatError
variants. known-issues: the "Header checks" audit gap is fixed, with the
one CVE object and two CVE files libhdf5 still refuses and we read.

Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
This commit is contained in:
osobh
2026-09-26 00:36:49 -05:00
co-authored by Claude Opus 5.5
parent a59d83d47d
commit 6a8ee3ec7f
2 changed files with 75 additions and 2 deletions
+24 -2
View File
@@ -134,8 +134,30 @@ fill-value item that did is fixed).
- N-Bit on 64-bit scale-offset data and some N-Bit parameter layouts fail.
- **Filters:** blosc, blosc2, bitshuffle, bzip2, LZF and zfp are not
implemented.
- **Header checks:** on 12 CVE datasets libhdf5 rejects a corrupt header and
we read data anyway. We need stricter header checks.
- ~~**Header checks:** on 12 CVE datasets libhdf5 rejects a corrupt header and
we read data anyway. We need stricter header checks.~~ **Fixed
2026-09-26** (counted again: 18 objects on the CVE corpus that libhdf5
refuses; some read as wrong data, e.g. a zero chunk dimension read as all
fill values): object headers, datatypes, chunk dimensions and chunk-index
offsets are checked as libhdf5 checks them, and truncated files are
refused. 17 of the 18 now
fail as in libhdf5 (conformance on tank, `conformance/run.sh --no-fetch`,
2026-09-26: 571 of 697 ok). Still read where libhdf5 refuses:
- `cve-2024-32624.h5` `/Dset_OBJREF`: a dataspace whose storage size
overflows 64 bits. `File::dataset` and `shape()` succeed (libhdf5
refuses at open); reading the values fails.
- `cve-2020-10810.h5`, `cve-2020-10812.h5` (whole files libhdf5 cannot
open, not among the 18): libhdf5 decodes the superblock extension's File
Space Info and metadata-cache-image messages at open and refuses these
files; we do not decode those messages at open.
- Deliberately not refused, because clawhdf5 up to v2.7.0 wrote them: a
float sign bit position outside the type, and a size-0 string type.
- Not refused because HDF5 2.0 (h5py 3.16) reads them though newer
libhdf5 refuses them: bit-field offset/precision outside the type, an
unknown variable-length kind, an array type whose stored size is not
its element count times its base size.
- (`cve-2024-32616` `/group1/dset3` and `cve-2025-2309`'s `Comp_OBJREF`
attribute are h5py/numpy type-mapping failures, not libhdf5 refusals.)
- **Writer:**
- Nested groups beyond one level: path-like names are now refused, not
created.