Vulnerability: Division by 0 in `Conv2DBackpropFilter` ### Impact
An attacker can trigger a division by 0 in `tf.raw_ops.Conv2DBackpropFilter`:

```python
import tensorflow as tf

input_tensor = tf.constant([], shape=[0, 0, 1, 0], dtype=tf.float32)
filter_sizes = tf.constant([1, 1, 1, 1], shape=[4], dtype=tf.int32)
out_backprop = tf.constant([], shape=[0, 0, 1, 1], dtype=tf.float32)

tf.raw_ops.Conv2DBackpropFilter(input=input_tensor, filter_sizes=filter_sizes,
                                out_backprop=out_backprop,
                                strides=[1, 66, 18, 1], use_cudnn_on_gpu=True,
                                padding='SAME', explicit_paddings=[],
                                data_format='NHWC', dilations=[1, 1, 1, 1])
```                 
                    
This is because the [implementation](https://github.com/tensorflow/tensorflow/blob/496c2630e51c1a478f095b084329acedb253db6b/tensorflow/core/kernels/conv_grad_shape_utils.cc#L130) does a modulus operation where the divisor is controlled by the caller:

```cc 
  if (dims->in_depth % filter_shape.dim_size(num_dims - 2)) { ... }
```
    
### Patches
We have patched the issue in GitHub commit [fca9874a9b42a2134f907d2fb46ab774a831404a](https://github.com/tensorflow/tensorflow/commit/fca9874a9b42a2134f907d2fb46ab774a831404a).

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 Yakun Zhang and Ying Wang of Baidu X-Team.
Vulnerability ID: GHSA-r4pj-74mg-8868
CWE: CWE-369
Severity score: 2.5
Project: https://github.com/tensorflow/tensorflow
Published: 2021-05-21
File: tensorflow/core/kernels/conv_grad_shape_utils.cc
Commit message: Prevent another division by zero.

PiperOrigin-RevId: 369338598
Change-Id: I55471d363e401fdcf8d259670ad4eef672b731e2
Commit author: Mihai Maruseac

Vulnerable version (before fix):
 Status ConvBackpropComputeDimensionsV2(   // dimensions of the filter Tensor.   VLOG(2) << "input vs filter_in depth " << dims->in_depth << " "           << filter_shape.dim_size(num_dims - 2);   if (dims->in_depth % filter_shape.dim_size(num_dims - 2)) {     return errors::InvalidArgument(         label, ": input depth must be evenly divisible by filter depth");

Fixed version (after fix):
 Status ConvBackpropComputeDimensionsV2(   // dimensions of the filter Tensor.   VLOG(2) << "input vs filter_in depth " << dims->in_depth << " "           << filter_shape.dim_size(num_dims - 2);   if (filter_shape.dim_size(num_dims - 2) <= 0) {     return errors ::InvalidArgument(         label, ": filter depth must be strictly greated than zero");   }   if (dims->in_depth % filter_shape.dim_size(num_dims - 2)) {     return errors::InvalidArgument(         label, ": input depth must be evenly divisible by filter depth");

Patch:
patch: @@ -127,6 +127,10 @@ Status ConvBackpropComputeDimensionsV2(
   // dimensions of the filter Tensor.
   VLOG(2) << "input vs filter_in depth " << dims->in_depth << " "
           << filter_shape.dim_size(num_dims - 2);
+  if (filter_shape.dim_size(num_dims - 2) <= 0) {
+    return errors ::InvalidArgument(
+        label, ": filter depth must be strictly greated than zero");
+  }
   if (dims->in_depth % filter_shape.dim_size(num_dims - 2)) {
     return errors::InvalidArgument(
         label, ": input depth must be evenly divisible by filter depth");
path: tensorflow/core/kernels/conv_grad_shape_utils.cc