{"id":"CVE-2020-15200","aliases":["BIT-tensorflow-2020-15200","EUVD-2020-0196","GHSA-x7rp-74x2-mjf3","PYSEC-2020-123","PYSEC-2020-280","PYSEC-2020-315"],"status":"published","title":"Segfault in Tensorflow","description":"In Tensorflow before version 2.3.1, the `RaggedCountSparseOutput` implementation does not validate that the input arguments form a valid ragged tensor. In particular, there is no validation that the values in the `splits` tensor generate a valid partitioning of the `values` tensor. Thus, the code sets up conditions to cause a heap buffer overflow. A `BatchedMap` is equivalent to a vector where each element is a hashmap. However, if the first element of `splits_values` is not 0, `batch_idx` will never be 1, hence there will be no hashmap at index 0 in `per_batch_counts`. Trying to access that in the user code results in a segmentation fault. The issue is patched in commit 3cbb917b4714766030b28eba9fb41bb97ce9ee02 and is released in TensorFlow version 2.3.1.","severity":{"version":"3.1","score":5.9,"vector":"CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:N/I:N/A:H","level":"medium","assessor":"cna","from":"cve"},"epss":{"day":"2026-11-10","score":0.00851,"percentile":0.58526,"model":"v2026.06.15"},"facts":{"in_kev":false,"known_exploited":false,"public_exploit":false,"fix_available":true},"cwes":["CWE-122","CWE-20","CWE-787"],"published":"2020-09-25T18:28:32Z","modified":"2026-10-20T14:10:43Z","fixes":[{"ecosystem":"PyPI","package":"tensorflow","fixed_in":["2.3.1"],"sources":["ghsa","osv"]},{"ecosystem":"PyPI","package":"tensorflow-cpu","fixed_in":["2.3.1"],"sources":["ghsa","osv"]},{"ecosystem":"PyPI","package":"tensorflow-gpu","fixed_in":["2.3.1"],"sources":["ghsa","osv"]},{"ecosystem":"Bitnami","package":"tensorflow","fixed_in":["2.3.1"],"sources":["osv"]}],"affected":[{"source":"ghsa","ecosystem":"PyPI","package":"tensorflow","ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"2.3.0"},{"last_affected":"2.3.0"},{"fixed":"2.3.1"}]}],"versions":["2.3.0"]},{"source":"ghsa","ecosystem":"PyPI","package":"tensorflow-cpu","ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"2.3.0"},{"last_affected":"2.3.0"},{"fixed":"2.3.1"}]}],"versions":["2.3.0"]},{"source":"ghsa","ecosystem":"PyPI","package":"tensorflow-gpu","ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"2.3.0"},{"last_affected":"2.3.0"},{"fixed":"2.3.1"}]}],"versions":["2.3.0"]},{"source":"osv","ecosystem":"Bitnami","package":"tensorflow","ranges":[{"type":"SEMVER","events":[{"introduced":"2.3.0"},{"fixed":"2.3.1"}]}]},{"source":"osv","ecosystem":"PyPI","package":"tensorflow","ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"2.3.0"},{"fixed":"2.3.1"}]}],"versions":["2.3.0"]},{"source":"osv","ecosystem":"PyPI","package":"tensorflow-cpu","ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"2.3.0"},{"fixed":"2.3.1"}]}],"versions":["2.3.0"]},{"source":"osv","ecosystem":"PyPI","package":"tensorflow-gpu","ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"2.3.0"},{"fixed":"2.3.1"}]}],"versions":["2.3.0"]},{"source":"osv","ecosystem":"PyPI","package":"tensorflow","ranges":[{"type":"GIT","events":[{"introduced":"0"},{"fixed":"3cbb917b4714766030b28eba9fb41bb97ce9ee02"}]},{"type":"ECOSYSTEM","events":[{"introduced":"0"},{"fixed":"2.3.1"}]}],"versions":["0.12.0rc0","0.12.0rc1","0.12.0","0.12.1","1.0.0","1.0.1","1.1.0rc0","1.1.0rc1","1.1.0rc2","1.1.0","1.2.0rc0","1.2.0rc1","1.2.0rc2","1.2.0","1.2.1","1.3.0rc0","1.3.0rc1","1.3.0rc2","1.3.0","1.4.0rc0","1.4.0rc1","1.4.0","1.4.1","1.5.0rc0","1.5.0rc1","1.5.0","1.5.1","1.6.0rc0","1.6.0rc1","1.6.0","1.7.0rc0","1.7.0rc1","1.7.0","1.7.1","1.8.0rc0","1.8.0rc1","1.8.0","1.9.0rc0","1.9.0rc1","1.9.0rc2","1.9.0","1.10.0rc0","1.10.0rc1","1.10.0","1.10.1","1.11.0rc0","1.11.0rc1","1.11.0rc2","1.11.0","1.12.0rc0","1.12.0rc1","1.12.0rc2","1.12.0","1.12.2","1.12.3","1.13.0rc0","1.13.0rc1","1.13.0rc2","1.13.1","1.13.2","1.14.0rc0","1.14.0rc1","1.14.0","1.15.0rc0","1.15.0rc1","1.15.0rc2","1.15.0rc3","1.15.0","1.15.2","1.15.3","1.15.4","1.15.5","2.0.0a0","2.0.0b0","2.0.0b1","2.0.0rc0","2.0.0rc1","2.0.0rc2","2.0.0","2.0.1","2.0.2","2.0.3","2.0.4","2.1.0rc0","2.1.0rc1","2.1.0rc2","2.1.0","2.1.1","2.1.2","2.1.3","2.2.0rc0","2.2.0rc1","2.2.0rc2","2.2.0rc3","2.2.0rc4","2.2.0","2.2.1","2.2.2","2.3.0rc0","2.3.0rc1","2.3.0rc2","2.3.0","2.1.4","2.2.3"]},{"source":"osv","ecosystem":"PyPI","package":"tensorflow-cpu","ranges":[{"type":"GIT","events":[{"introduced":"0"},{"fixed":"3cbb917b4714766030b28eba9fb41bb97ce9ee02"}]},{"type":"ECOSYSTEM","events":[{"introduced":"0"},{"fixed":"2.3.1"}]}],"versions":["1.15.0","2.1.0","2.1.1","2.1.2","2.1.3","2.1.4","2.2.0","2.2.1","2.2.2","2.2.3","2.3.0"]},{"source":"osv","ecosystem":"PyPI","package":"tensorflow-gpu","ranges":[{"type":"GIT","events":[{"introduced":"0"},{"fixed":"3cbb917b4714766030b28eba9fb41bb97ce9ee02"}]},{"type":"ECOSYSTEM","events":[{"introduced":"0"},{"fixed":"2.3.1"}]}],"versions":["0.12.0","0.12.1","1.0.0","1.0.1","1.1.0","1.10.0","1.10.1","1.11.0","1.12.0","1.12.2","1.12.3","1.13.1","1.13.2","1.14.0","1.15.0","1.15.2","1.15.3","1.15.4","1.15.5","1.2.0","1.2.1","1.3.0","1.4.0","1.4.1","1.5.0","1.5.1","1.6.0","1.7.0","1.7.1","1.8.0","1.9.0","2.0.0","2.0.1","2.0.2","2.0.3","2.0.4","2.1.0","2.1.1","2.1.2","2.1.3","2.1.4","2.2.0","2.2.1","2.2.2","2.2.3","2.3.0"]}],"products":[{"vendor":"google","product":"tensorflow"},{"vendor":"tensorflow","product":"tensorflow"}],"references":[{"url":"https://github.com/tensorflow/tensorflow/releases/tag/v2.3.1","tags":["x_refsource_MISC","x_transferred","Third Party Advisory","advisory","web"]},{"url":"https://github.com/tensorflow/tensorflow/security/advisories/GHSA-x7rp-74x2-mjf3","tags":["x_refsource_CONFIRM","x_transferred","Exploit","Third Party Advisory","advisory","evidence","web"]},{"url":"https://github.com/tensorflow/tensorflow/commit/3cbb917b4714766030b28eba9fb41bb97ce9ee02","tags":["x_refsource_MISC","x_transferred","Patch","Third Party Advisory","advisory","fix","web"]},{"url":"https://nvd.nist.gov/vuln/detail/CVE-2020-15200","tags":["web","advisory"]},{"url":"https://github.com/pypa/advisory-database/tree/main/vulns/tensorflow-cpu/PYSEC-2020-280.yaml","tags":["web"]},{"url":"https://github.com/pypa/advisory-database/tree/main/vulns/tensorflow-gpu/PYSEC-2020-315.yaml","tags":["web"]},{"url":"https://github.com/pypa/advisory-database/tree/main/vulns/tensorflow/PYSEC-2020-123.yaml","tags":["web"]},{"url":"https://github.com/advisories/GHSA-x7rp-74x2-mjf3"},{"url":"https://github.com/tensorflow/tensorflow","tags":["package"]}],"sources":{"cve":[{"id":"CVE-2020-15200","title":"Segfault in Tensorflow","description":"In Tensorflow before version 2.3.1, the `RaggedCountSparseOutput` implementation does not validate that the input arguments form a valid ragged tensor. In particular, there is no validation that the values in the `splits` tensor generate a valid partitioning of the `values` tensor. Thus, the code sets up conditions to cause a heap buffer overflow. A `BatchedMap` is equivalent to a vector where each element is a hashmap. However, if the first element of `splits_values` is not 0, `batch_idx` will never be 1, hence there will be no hashmap at index 0 in `per_batch_counts`. Trying to access that in the user code results in a segmentation fault. The issue is patched in commit 3cbb917b4714766030b28eba9fb41bb97ce9ee02 and is released in TensorFlow version 2.3.1.","status":"published","published":"2020-09-25T18:40:15Z","modified":"2024-08-04T13:08:22.775Z","cvss":[{"version":"3.1","score":5.9,"vector":"CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:N/I:N/A:H","level":"medium","assessor":"cna"}],"cwes":["CWE-20","CWE-122"],"updated_at":"2026-11-02T14:35:50.545879Z"}],"euvd":[{"id":"EUVD-2020-0196","description":"In Tensorflow before version 2.3.1, the `RaggedCountSparseOutput` implementation does not validate that the input arguments form a valid ragged tensor. In particular, there is no validation that the values in the `splits` tensor generate a valid partitioning of the `values` tensor. Thus, the code sets up conditions to cause a heap buffer overflow. A `BatchedMap` is equivalent to a vector where each element is a hashmap. However, if the first element of `splits_values` is not 0, `batch_idx` will never be 1, hence there will be no hashmap at index 0 in `per_batch_counts`. Trying to access that in the user code results in a segmentation fault. The issue is patched in commit 3cbb917b4714766030b28eba9fb41bb97ce9ee02 and is released in TensorFlow version 2.3.1.","status":"published","published":"2020-09-25T18:40:15Z","modified":"2024-08-04T13:08:22Z","cvss":[{"version":"3.1","score":5.9,"vector":"CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:N/I:N/A:H","level":"medium"}],"updated_at":"2026-11-03T03:07:33.100327Z"}],"ghsa":[{"id":"GHSA-x7rp-74x2-mjf3","title":"Segfault in Tensorflow","description":"### Impact\nThe `RaggedCountSparseOutput` implementation does not validate that the input arguments form a valid ragged tensor. In particular, there is no validation that the values in the `splits` tensor generate a valid partitioning of the `values` tensor. Thus, the [following code](https://github.com/tensorflow/tensorflow/blob/0e68f4d3295eb0281a517c3662f6698992b7b2cf/tensorflow/core/kernels/count_ops.cc#L248-L265\n) sets up conditions to cause a heap buffer overflow:\n```cc\n    auto per_batch_counts = BatchedMap\u003cW\u003e(num_batches);\n    int batch_idx = 0;\n    for (int idx = 0; idx \u003c num_values; ++idx) {\n      while (idx \u003e= splits_values(batch_idx)) {\n        batch_idx++;\n      }\n      const auto\u0026 value = values_values(idx);\n      if (value \u003e= 0 \u0026\u0026 (maxlength_ \u003c= 0 || value \u003c maxlength_)) {\n        per_batch_counts[batch_idx - 1][value] = 1;\n      }\n    }\n```\n\nA `BatchedMap` is equivalent to a vector where each element is a hashmap. However, if the first element of `splits_values` is not 0, `batch_idx` will never be 1, hence there will be no hashmap at index 0 in `per_batch_counts`. Trying to access that in the user code results in a segmentation fault.\n\n### Patches\nWe have patched the issue in 3cbb917b4714766030b28eba9fb41bb97ce9ee02 and will release a patch release.\n\nWe recommend users to upgrade to TensorFlow 2.3.1.\n\n### For more information\nPlease consult [our security guide](https://github.com/tensorflow/tensorflow/blob/master/SECURITY.md) for more information regarding the security model and how to contact us with issues and questions.\n\n### Attribution\nThis vulnerability is a variant of [GHSA-p5f8-gfw5-33w4](https://github.com/tensorflow/tensorflow/security/advisories/GHSA-p5f8-gfw5-33w4)","status":"published","published":"2020-09-25T18:28:32Z","modified":"2024-10-28T21:20:07Z","cvss":[{"version":"4.0","score":8.2,"vector":"CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:N/VI:N/VA:H/SC:N/SI:N/SA:N","level":"high"},{"version":"3.1","score":5.9,"vector":"CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:N/I:N/A:H","level":"medium"}],"cwes":["CWE-20","CWE-122","CWE-787"],"updated_at":"2026-11-02T14:38:14.769863Z"}],"nvd":[{"id":"CVE-2020-15200","description":"In Tensorflow before version 2.3.1, the `RaggedCountSparseOutput` implementation does not validate that the input arguments form a valid ragged tensor. In particular, there is no validation that the values in the `splits` tensor generate a valid partitioning of the `values` tensor. Thus, the code sets up conditions to cause a heap buffer overflow. A `BatchedMap` is equivalent to a vector where each element is a hashmap. However, if the first element of `splits_values` is not 0, `batch_idx` will never be 1, hence there will be no hashmap at index 0 in `per_batch_counts`. Trying to access that in the user code results in a segmentation fault. The issue is patched in commit 3cbb917b4714766030b28eba9fb41bb97ce9ee02 and is released in TensorFlow version 2.3.1.","status":"published","published":"2020-09-25T19:15:15.26Z","modified":"2026-06-17T02:56:15.107Z","cvss":[{"version":"3.1","score":5.9,"vector":"CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:N/I:N/A:H","level":"medium","assessor":"secondary"},{"version":"3.1","score":5.9,"vector":"CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:N/I:N/A:H","level":"medium","assessor":"primary"},{"version":"2.0","score":4.3,"vector":"AV:N/AC:M/Au:N/C:N/I:N/A:P","level":"medium","assessor":"primary"}],"cwes":["CWE-20","CWE-122","CWE-787"],"updated_at":"2026-11-02T14:06:17.70091Z"}],"osv":[{"id":"CVE-2020-15200","description":"In Tensorflow before version 2.3.1, the `RaggedCountSparseOutput` implementation does not validate that the input arguments form a valid ragged tensor. In particular, there is no validation that the values in the `splits` tensor generate a valid partitioning of the `values` tensor. Thus, the code sets up conditions to cause a heap buffer overflow. A `BatchedMap` is equivalent to a vector where each element is a hashmap. However, if the first element of `splits_values` is not 0, `batch_idx` will never be 1, hence there will be no hashmap at index 0 in `per_batch_counts`. Trying to access that in the user code results in a segmentation fault. The issue is patched in commit 3cbb917b4714766030b28eba9fb41bb97ce9ee02 and is released in TensorFlow version 2.3.1.","status":"published","published":"2020-09-25T19:15:15.26Z","modified":"2026-10-20T14:10:43.60082472Z","cvss":[{"version":"3.1","score":5.9,"vector":"CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:N/I:N/A:H","level":"medium"}],"updated_at":"2026-11-02T15:44:14.828228Z"},{"id":"GHSA-x7rp-74x2-mjf3","title":"Segfault in Tensorflow","description":"### Impact\nThe `RaggedCountSparseOutput` implementation does not validate that the input arguments form a valid ragged tensor. In particular, there is no validation that the values in the `splits` tensor generate a valid partitioning of the `values` tensor. Thus, the [following code](https://github.com/tensorflow/tensorflow/blob/0e68f4d3295eb0281a517c3662f6698992b7b2cf/tensorflow/core/kernels/count_ops.cc#L248-L265\n) sets up conditions to cause a heap buffer overflow:\n```cc\n    auto per_batch_counts = BatchedMap\u003cW\u003e(num_batches);\n    int batch_idx = 0;\n    for (int idx = 0; idx \u003c num_values; ++idx) {\n      while (idx \u003e= splits_values(batch_idx)) {\n        batch_idx++;\n      }\n      const auto\u0026 value = values_values(idx);\n      if (value \u003e= 0 \u0026\u0026 (maxlength_ \u003c= 0 || value \u003c maxlength_)) {\n        per_batch_counts[batch_idx - 1][value] = 1;\n      }\n    }\n```\n\nA `BatchedMap` is equivalent to a vector where each element is a hashmap. However, if the first element of `splits_values` is not 0, `batch_idx` will never be 1, hence there will be no hashmap at index 0 in `per_batch_counts`. Trying to access that in the user code results in a segmentation fault.\n\n### Patches\nWe have patched the issue in 3cbb917b4714766030b28eba9fb41bb97ce9ee02 and will release a patch release.\n\nWe recommend users to upgrade to TensorFlow 2.3.1.\n\n### For more information\nPlease consult [our security guide](https://github.com/tensorflow/tensorflow/blob/master/SECURITY.md) for more information regarding the security model and how to contact us with issues and questions.\n\n### Attribution\nThis vulnerability is a variant of [GHSA-p5f8-gfw5-33w4](https://github.com/tensorflow/tensorflow/security/advisories/GHSA-p5f8-gfw5-33w4)","status":"published","published":"2020-09-25T18:28:32Z","modified":"2026-07-08T06:28:16.173770625Z","cvss":[{"version":"3.1","score":5.9,"vector":"CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:N/I:N/A:H","level":"medium"},{"version":"4.0","score":8.2,"vector":"CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:N/VI:N/VA:H/SC:N/SI:N/SA:N","level":"high"}],"cwes":["CWE-122","CWE-20","CWE-787"],"updated_at":"2026-11-02T15:46:59.484835Z"},{"id":"BIT-tensorflow-2020-15200","title":"Segfault in Tensorflow","description":"In Tensorflow before version 2.3.1, the `RaggedCountSparseOutput` implementation does not validate that the input arguments form a valid ragged tensor. In particular, there is no validation that the values in the `splits` tensor generate a valid partitioning of the `values` tensor. Thus, the code sets up conditions to cause a heap buffer overflow. A `BatchedMap` is equivalent to a vector where each element is a hashmap. However, if the first element of `splits_values` is not 0, `batch_idx` will never be 1, hence there will be no hashmap at index 0 in `per_batch_counts`. Trying to access that in the user code results in a segmentation fault. The issue is patched in commit 3cbb917b4714766030b28eba9fb41bb97ce9ee02 and is released in TensorFlow version 2.3.1.","status":"published","published":"2024-03-06T11:20:39.865Z","modified":"2026-09-08T08:48:19.897860346Z","updated_at":"2026-11-02T15:28:35.51001Z"},{"id":"PYSEC-2020-123","description":"In Tensorflow before version 2.3.1, the `RaggedCountSparseOutput` implementation does not validate that the input arguments form a valid ragged tensor. In particular, there is no validation that the values in the `splits` tensor generate a valid partitioning of the `values` tensor. Thus, the code sets up conditions to cause a heap buffer overflow. A `BatchedMap` is equivalent to a vector where each element is a hashmap. However, if the first element of `splits_values` is not 0, `batch_idx` will never be 1, hence there will be no hashmap at index 0 in `per_batch_counts`. Trying to access that in the user code results in a segmentation fault. The issue is patched in commit 3cbb917b4714766030b28eba9fb41bb97ce9ee02 and is released in TensorFlow version 2.3.1.","status":"published","published":"2020-09-25T19:15:00Z","modified":"2023-12-06T01:00:16.63849Z","updated_at":"2026-11-02T15:52:52.192131Z"},{"id":"PYSEC-2020-280","description":"In Tensorflow before version 2.3.1, the `RaggedCountSparseOutput` implementation does not validate that the input arguments form a valid ragged tensor. In particular, there is no validation that the values in the `splits` tensor generate a valid partitioning of the `values` tensor. Thus, the code sets up conditions to cause a heap buffer overflow. A `BatchedMap` is equivalent to a vector where each element is a hashmap. However, if the first element of `splits_values` is not 0, `batch_idx` will never be 1, hence there will be no hashmap at index 0 in `per_batch_counts`. Trying to access that in the user code results in a segmentation fault. The issue is patched in commit 3cbb917b4714766030b28eba9fb41bb97ce9ee02 and is released in TensorFlow version 2.3.1.","status":"published","published":"2020-09-25T19:15:00Z","modified":"2023-12-06T01:00:16.63849Z","updated_at":"2026-11-02T15:52:52.682031Z"},{"id":"PYSEC-2020-315","description":"In Tensorflow before version 2.3.1, the `RaggedCountSparseOutput` implementation does not validate that the input arguments form a valid ragged tensor. In particular, there is no validation that the values in the `splits` tensor generate a valid partitioning of the `values` tensor. Thus, the code sets up conditions to cause a heap buffer overflow. A `BatchedMap` is equivalent to a vector where each element is a hashmap. However, if the first element of `splits_values` is not 0, `batch_idx` will never be 1, hence there will be no hashmap at index 0 in `per_batch_counts`. Trying to access that in the user code results in a segmentation fault. The issue is patched in commit 3cbb917b4714766030b28eba9fb41bb97ce9ee02 and is released in TensorFlow version 2.3.1.","status":"published","published":"2020-09-25T19:15:00Z","modified":"2023-12-06T01:00:16.63849Z","updated_at":"2026-11-02T15:52:52.682031Z"}]}}
