CVE-2020-15211: TensorFlow Lite: heap OOB RW via flatbuffer tensor index
MEDIUM PoC AVAILABLEAny deployment loading TFLite flatbuffer models from untrusted sources — edge devices, model serving APIs, mobile apps — is exposed to heap out-of-bounds read/write, potentially leading to code execution or memory disclosure. Patch immediately to TFLite 1.15.4, 2.0.3, 2.1.2, 2.2.1, or 2.3.1; if patching is delayed, add a custom Verifier that rejects -1 tensor indices on non-optional operators. This is a 2020 vulnerability — if your TFLite versions are still unpatched in 2026, your AI supply chain hygiene needs urgent attention.
Risk Assessment
CVSS 4.8 medium with high attack complexity underestimates operational risk for organizations exposing model-loading endpoints. The write gadget is offset-constrained, reducing arbitrary-RCE likelihood, but read/write primitives on heap-allocated tensor arrays in model serving infrastructure can enable memory disclosure of inference inputs or lateral movement within ML pipelines. Attack complexity is high because exploiting this requires crafting a precisely malformed flatbuffer model, but this craft is well within reach of skilled adversaries with knowledge of the TFLite format. Not in CISA KEV and no public active exploitation confirmed as of analysis date.
Affected Systems
| Package | Ecosystem | Vulnerable Range | Patched |
|---|---|---|---|
| tensorflow | pip | — | No patch |
| leap | — | — | No patch |
Severity & Risk
Attack Surface
Recommended Action
5 steps-
PATCH
Upgrade TFLite to 1.15.4, 2.0.3, 2.1.2, 2.2.1, or 2.3.1 — patches applied across 6 commits (46d5b08, 00302787, e11f5558, cd31fd0c, 1970c21, fff2c83).
-
WORKAROUND (if patching delayed): Implement a custom Verifier at model load time that enforces: (a) only operators explicitly supporting optional inputs may use -1 tensor index; (b) -1 is only permitted on tensor slots declared as optional in the operator spec.
-
DETECT
Audit model loading code for flatbuffer deserialization without index validation. Scan artifact repositories for .tflite files with unexpected negative index values using flatbuffers tooling.
-
HARDEN
Never load TFLite models from untrusted or unverified sources without schema validation. Apply input validation at model ingestion boundaries.
-
INVENTORY
Identify all TFLite consumers in your ML supply chain, including third-party SDK dependencies that bundle TFLite.
Classification
Compliance Impact
This CVE is relevant to:
Frequently Asked Questions
What is CVE-2020-15211?
Any deployment loading TFLite flatbuffer models from untrusted sources — edge devices, model serving APIs, mobile apps — is exposed to heap out-of-bounds read/write, potentially leading to code execution or memory disclosure. Patch immediately to TFLite 1.15.4, 2.0.3, 2.1.2, 2.2.1, or 2.3.1; if patching is delayed, add a custom Verifier that rejects -1 tensor indices on non-optional operators. This is a 2020 vulnerability — if your TFLite versions are still unpatched in 2026, your AI supply chain hygiene needs urgent attention.
Is CVE-2020-15211 actively exploited?
Proof-of-concept exploit code is publicly available for CVE-2020-15211, increasing the risk of exploitation.
How to fix CVE-2020-15211?
1. PATCH: Upgrade TFLite to 1.15.4, 2.0.3, 2.1.2, 2.2.1, or 2.3.1 — patches applied across 6 commits (46d5b08, 00302787, e11f5558, cd31fd0c, 1970c21, fff2c83). 2. WORKAROUND (if patching delayed): Implement a custom Verifier at model load time that enforces: (a) only operators explicitly supporting optional inputs may use -1 tensor index; (b) -1 is only permitted on tensor slots declared as optional in the operator spec. 3. DETECT: Audit model loading code for flatbuffer deserialization without index validation. Scan artifact repositories for .tflite files with unexpected negative index values using flatbuffers tooling. 4. HARDEN: Never load TFLite models from untrusted or unverified sources without schema validation. Apply input validation at model ingestion boundaries. 5. INVENTORY: Identify all TFLite consumers in your ML supply chain, including third-party SDK dependencies that bundle TFLite.
What systems are affected by CVE-2020-15211?
This vulnerability affects the following AI/ML architecture patterns: model serving, edge AI deployments, inference pipelines, training pipelines.
What is the CVSS score for CVE-2020-15211?
CVE-2020-15211 has a CVSS v3.1 base score of 4.8 (MEDIUM). The EPSS exploitation probability is 0.34%.
Technical Details
NVD Description
In TensorFlow Lite before versions 1.15.4, 2.0.3, 2.1.2, 2.2.1 and 2.3.1, saved models in the flatbuffer format use a double indexing scheme: a model has a set of subgraphs, each subgraph has a set of operators and each operator has a set of input/output tensors. The flatbuffer format uses indices for the tensors, indexing into an array of tensors that is owned by the subgraph. This results in a pattern of double array indexing when trying to get the data of each tensor. However, some operators can have some tensors be optional. To handle this scenario, the flatbuffer model uses a negative `-1` value as index for these tensors. This results in special casing during validation at model loading time. Unfortunately, this means that the `-1` index is a valid tensor index for any operator, including those that don't expect optional inputs and including for output tensors. Thus, this allows writing and reading from outside the bounds of heap allocated arrays, although only at a specific offset from the start of these arrays. This results in both read and write gadgets, albeit very limited in scope. The issue is patched in several commits (46d5b0852, 00302787b7, e11f5558, cd31fd0ce, 1970c21, and fff2c83), and is released in TensorFlow versions 1.15.4, 2.0.3, 2.1.2, 2.2.1, or 2.3.1. A potential workaround would be to add a custom `Verifier` to the model loading code to ensure that only operators which accept optional inputs use the `-1` special value and only for the tensors that they expect to be optional. Since this allow-list type approach is erro-prone, we advise upgrading to the patched code.
Exploitation Scenario
Adversary targets an inference API that accepts user-uploaded TFLite models for on-device or server-side evaluation. They craft a malicious flatbuffer model where a non-optional operator (e.g., a Conv2D layer) has its output tensor index set to -1. The model passes basic structural validation but at inference time, TFLite dereferences the -1 index, accessing heap memory before the tensor array. The attacker iterates payload variants to leak heap contents (e.g., adjacent model weights or input tensor data), enabling reconnaissance of the inference pipeline. In a more advanced scenario, the OOB write primitive at the constrained offset is chained with a heap grooming technique to corrupt function pointers or vtable entries, achieving code execution within the TFLite process.
CVSS Vector
CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:L/I:L/A:N References
- lists.opensuse.org/opensuse-security-announce/2020-10/msg00065.html Mailing List 3rd Party
- github.com/tensorflow/tensorflow/commit/00302787b788c5ff04cb6f62aed5a74d936e86c0 Patch 3rd Party
- github.com/tensorflow/tensorflow/commit/1970c2158b1ffa416d159d03c3370b9a462aee35 Patch 3rd Party
- github.com/tensorflow/tensorflow/commit/46d5b0852528ddfd614ded79bccc75589f801bd9 Patch 3rd Party
- github.com/tensorflow/tensorflow/commit/cd31fd0ce0449a9e0f83dcad08d6ed7f1d6bef3f Patch 3rd Party
- github.com/tensorflow/tensorflow/commit/e11f55585f614645b360563072ffeb5c3eeff162 Patch 3rd Party
- github.com/tensorflow/tensorflow/commit/fff2c8326280c07733828f990548979bdc893859 Patch 3rd Party
- github.com/tensorflow/tensorflow/releases/tag/v2.3.1 3rd Party
- github.com/tensorflow/tensorflow/security/advisories/GHSA-cvpc-8phh-8f45 Exploit 3rd Party
Timeline
Related Vulnerabilities
CVE-2020-15196 9.9 TensorFlow: heap OOB read in sparse/ragged count ops
Same package: tensorflow CVE-2020-15205 9.8 TensorFlow: heap overflow in StringNGrams, ASLR bypass
Same package: tensorflow CVE-2020-15208 9.8 TFLite: OOB read/write via tensor dimension mismatch
Same package: tensorflow CVE-2019-16778 9.8 TensorFlow: heap overflow in UnsortedSegmentSum op
Same package: tensorflow CVE-2022-23587 9.8 TensorFlow: integer overflow in Grappler enables RCE
Same package: tensorflow
AI Threat Alert