Views
No views yet
| File | Finding | CWE | Confirmation | Runtime Location |
|---|---|---|---|---|
| tensor_index_fuzz_poc.circle | Tensor index OOB — subgraph.tensors[input_num] via op->inputs()[i] | CWE-129 | ✅ Fuzz-confirmed (3 crashes) | CircleImport.cpp:855, :918, :936 |
| buffer_opcode_manual_poc.circle | Buffer index OOB — buffers[const_tensor.buffer]->data | CWE-129 | ✅ Manual-confirmed | CircleImport.cpp:875 |
| buffer_opcode_manual_poc.circle | Opcode index OOB — operator_codes[opcode_index] passed to ConvertSubgraph | CWE-129 | ✅ Manual-confirmed | CircleImport.cpp:1059 |
| redzone_read_poc.circle | FlatBuffers relative offset reads past buffer end (ASan redzone) | CWE-125 | ✅ Fuzz-confirmed | operator field accessor → op->inputs() |
circle-mlir toolchain with AddressSanitizer enabled.circle file through the standard model import path (CircleImport)VerifyModelBuffer() successfully but triggers an ASan-detected out-of-bounds read at the source locations listed abovetensors.size()buffers.size()operator_codes.size()CircleImport.cpp uses unchecked std::vector::operator[] (or FlatBuffers Vector::Get()) to access tensors, buffers, and operator codes by their index, without verifying that the index is within bounds. The FlatBuffers verifier only ensures structural validity of the FlatBuffer fields, not that index values are valid references.1// CircleImport.cpp:855 — TENSOR INDEX OOB
2auto &const_tensor = *subgraph.tensors[input_num]; // input_num from op->inputs()
3
4// CircleImport.cpp:875 — BUFFER INDEX OOB
5buffer = buffers[const_tensor.buffer]->data; // tensor.buffer from FlatBuffer
6
7// CircleImport.cpp:1059 — OPCODE INDEX OOB
8auto func_or_error = ConvertSubgraph(..., model->operator_codes, ...);
9// Inside ConvertSubgraph: opcodes[op->opcode_index] is used uncheckedCircleImport.cpp:1if (input_num < 0 || input_num >= subgraph.tensors.size()) { /* error */ return; }
2if (const_tensor.buffer >= buffers.size()) { /* error */ return; }
3if (opcode_index >= operator_codes.size()) { /* error */ return; }operator[] with .at() which throws std::out_of_range.tensor_index_fuzz_poc.circle (670 bytes) — verified by libFuzzer + ASan; triggers heap-buffer-overflow at tensor index accessbuffer_opcode_manual_poc.circle (524 bytes) — manually crafted with tensor.buffer=999 and opcode_index=999redzone_read_poc.circle (670 bytes) — fuzz-discovered; triggers SEGV via FlatBuffers offset past buffer endreport.md — Full vulnerability report