Vulnerability: Integer overflow in TFLite concatentation ### Impact
The TFLite implementation of concatenation is [vulnerable to an integer overflow issue](https://github.com/tensorflow/tensorflow/blob/7b7352a724b690b11bfaae2cd54bc3907daf6285/tensorflow/lite/kernels/concatenation.cc#L70-L76):

```cc
for (int d = 0; d < t0->dims->size; ++d) {
  if (d == axis) { 
    sum_axis += t->dims->data[axis]; 
  } else {
    TF_LITE_ENSURE_EQ(context, t->dims->data[d], t0->dims->data[d]);
  }
}
```

An attacker can craft a model such that the dimensions of one of the concatenation input overflow the values of `int`. TFLite uses `int` to represent tensor dimensions, whereas TF uses `int64`. Hence, valid TF models can trigger an integer overflow when converted to TFLite format.

### Patches
We have patched the issue in GitHub commit [4253f96a58486ffe84b61c0415bb234a4632ee73](https://github.com/tensorflow/tensorflow/commit/4253f96a58486ffe84b61c0415bb234a4632ee73).

The fix will be included in TensorFlow 2.5.0. We will also cherrypick this commit on TensorFlow 2.4.2, TensorFlow 2.3.3, TensorFlow 2.2.3 and TensorFlow 2.1.4, as these are also affected and still in supported range.

### For more information
Please 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.

### Attribution
This vulnerability has been reported by members of the Aivul Team from Qihoo 360.
Vulnerability ID: GHSA-9c84-4hx6-xmm4
CWE: CWE-190
Severity score: 6.3
Project: https://github.com/tensorflow/tensorflow
Published: 2021-05-21
File: tensorflow/lite/kernels/concatenation.cc
Commit message: Fix integer overflow in TFLite concat

PiperOrigin-RevId: 371013841
Change-Id: I6a4782ce7ca753e23ff31e7fb6aeb7f9d412cd29
Commit author: Mihai Maruseac

Vulnerable version (before fix):
 limitations under the License.  #include <stdint.h>  #include "tensorflow/lite/c/builtin_op_data.h" #include "tensorflow/lite/c/common.h" #include "tensorflow/lite/kernels/internal/compatibility.h" TfLiteStatus Prepare(TfLiteContext* context, TfLiteNode* node) {     TF_LITE_ENSURE_EQ(context, t->type, input_type);     for (int d = 0; d < t0->dims->size; ++d) {       if (d == axis) {         sum_axis += t->dims->data[axis];       } else {         TF_LITE_ENSURE_EQ(context, t->dims->data[d], t0->dims->data[d]);

Fixed version (after fix):
 limitations under the License.  #include <stdint.h>  #include <limits>  #include "tensorflow/lite/c/builtin_op_data.h" #include "tensorflow/lite/c/common.h" #include "tensorflow/lite/kernels/internal/compatibility.h" TfLiteStatus Prepare(TfLiteContext* context, TfLiteNode* node) {     TF_LITE_ENSURE_EQ(context, t->type, input_type);     for (int d = 0; d < t0->dims->size; ++d) {       if (d == axis) {         // Avoid integer overflow in sum_axis below         TF_LITE_ENSURE(context, t->dims->data[axis] >= 0);         TF_LITE_ENSURE(context, t->dims->data[axis] <=                                     std::numeric_limits<int>::max() - sum_axis);         sum_axis += t->dims->data[axis];       } else {         TF_LITE_ENSURE_EQ(context, t->dims->data[d], t0->dims->data[d]);

Patch:
patch: @@ -16,6 +16,8 @@ limitations under the License.
 
 #include <stdint.h>
 
+#include <limits>
+
 #include "tensorflow/lite/c/builtin_op_data.h"
 #include "tensorflow/lite/c/common.h"
 #include "tensorflow/lite/kernels/internal/compatibility.h"
@@ -69,6 +71,10 @@ TfLiteStatus Prepare(TfLiteContext* context, TfLiteNode* node) {
     TF_LITE_ENSURE_EQ(context, t->type, input_type);
     for (int d = 0; d < t0->dims->size; ++d) {
       if (d == axis) {
+        // Avoid integer overflow in sum_axis below
+        TF_LITE_ENSURE(context, t->dims->data[axis] >= 0);
+        TF_LITE_ENSURE(context, t->dims->data[axis] <=
+                                    std::numeric_limits<int>::max() - sum_axis);
         sum_axis += t->dims->data[axis];
       } else {
         TF_LITE_ENSURE_EQ(context, t->dims->data[d], t0->dims->data[d]);
path: tensorflow/lite/kernels/concatenation.cc