Views
No views yet
VariablesIndex block native out-of-bounds readvariables/variables.index. A zero-byte block reaches
VariablesIndex::read_variables_index_block(), which subtracts four from the
size and calls decode_fixed32() before enforcing a minimum block length:1size_t block_size = index.m_size;
2data.resize(block_size + BLOCK_TRAILER_SIZE);
3// ...
4uint32_t numRestarts =
5 decode_fixed32(data.data() + block_size - sizeof(uint32_t));block_size == 0, the pointer passed to decode_fixed32() is four bytes
before the allocated vector. The public TensorFlow SavedModel load path then
performs a native out-of-bounds read.2026.2.1-21919-ede283a88e3-releases/2026/22970df68018e1fb7d7d0c4a834c34687a843a3681python3 -m venv .venv
2./.venv/bin/pip install openvino==2026.2.0
3./.venv/bin/python generate_fixtures.py
4
5./.venv/bin/python load_model.py models/control
6# InputModel
7
8DYLD_INSERT_LIBRARIES=/usr/lib/libgmalloc.dylib \
9 ./.venv/bin/python load_model.py models/trigger
10# SIGSEGV| Fixture | Run 1 | Run 2 | Run 3 |
|---|---|---|---|
| control | 0 | 0 | 0 |
| trigger | 139 | 139 | 139 |
SIGBUS or SIGSEGV). The remaining run read allocator
memory and later raised an OpenVINO bounds exception, as expected for an
unprotected heap under-read.| Model | variables.index size | SHA-256 |
|---|---|---|
| control | 93 bytes | 0d66a5ce3578e6ed8340b4e168ffb19ba974dc0b54c7e3f026a40af9521350a7 |
| trigger | 93 bytes | 6d5eccd303c9360719acaf24c8c0a2ebe1dae399483fd236c615b32d37dcf1fb |
saved_model.pb files and variable data shards are byte-identical. The
index files differ at exactly one byte: offset 48 changes from 0x0e to
0x00, changing only the footer's declared top-level index block size. The
physical index block remains present.1ov::frontend::tensorflow::decode_fixed32
2ov::frontend::tensorflow::VariablesIndex::read_variables_index_block
3ov::frontend::tensorflow::VariablesIndex::read_variables_index
4ov::frontend::tensorflow::VariablesIndex::read_variables
5ov::frontend::tensorflow::GraphIteratorSavedModel::read_saved_model
6ov::frontend::tensorflow::FrontEnd::load_implsizeof(uint32_t) before subtracting
the restart-count trailer size. Also validate that the first restart offset is
inside the entry region before constructing entry pointers.generate_fixtures.py builds the differential SavedModel pair.load_model.py exercises OpenVINO's public TensorFlow frontend.crash-stack.txt records sanitized native evidence.