Headline
CVE-2022-35959: Fix security vulnerability with AvgPool3DGrad. · tensorflow/tensorflow@9178ac9
TensorFlow is an open source platform for machine learning. The implementation of AvgPool3DGradOp
does not fully validate the input orig_input_shape
. This results in an overflow that results in a CHECK
failure which can be used to trigger a denial of service attack. We have patched the issue in GitHub commit 9178ac9d6389bdc54638ab913ea0e419234d14eb. The fix will be included in TensorFlow 2.10.0. We will also cherrypick this commit on TensorFlow 2.9.1, TensorFlow 2.8.1, and TensorFlow 2.7.2, as these are also affected and still in supported range. There are no known workarounds for this issue.
@@ -18,6 +18,7 @@
from tensorflow.python.eager import context
from tensorflow.python.framework import constant_op
from tensorflow.python.framework import dtypes
from tensorflow.python.framework import errors
from tensorflow.python.framework import errors_impl
from tensorflow.python.framework import test_util
@@ -67,7 +68,7 @@ def _VerifyOneTest(self, pool_func, input_sizes, window, strides, padding,
# Initializes the input tensor with array containing incrementing
# numbers from 1.
x = [f * 1.0 for f in range(1, total_size + 1)]
with self.cached_session(use_gpu=use_gpu) as sess:
with self.cached_session(use_gpu=use_gpu):
t = constant_op.constant(x, shape=input_sizes)
window = [1] + list(window) + [1]
strides = [1] + list(strides) + [1]
@@ -124,6 +125,23 @@ def testAvgPool3dSamePaddingDifferentStrides(self):
padding="SAME",
expected=expected_output)
def testMaxPool3dGrad(self):
with self.assertRaises(
(errors.ResourceExhaustedError, errors.InvalidArgumentError)):
with self.cached_session():
orig_input_shape = constant_op.constant(
1879048192, shape=[5], dtype=dtypes.int32)
grad = constant_op.constant(
1, shape=[1, 3, 2, 4, 2], dtype=dtypes.float32)
t = gen_nn_ops.AvgPool3DGrad(
orig_input_shape=orig_input_shape,
grad=grad,
ksize=[1, 1, 1, 1, 1],
strides=[1, 1, 1, 1, 1],
padding="SAME",
data_format="NDHWC")
self.evaluate(t)
def testMaxPool3dValidPadding(self):
expected_output = [40.0, 41.0, 42.0]
self._VerifyValues(
Related news
### Impact The implementation of `AvgPool3DGradOp` does not fully validate the input `orig_input_shape`. This results in an overflow that results in a `CHECK` failure which can be used to trigger a denial of service attack: ```python import tensorflow as tf ksize = [1, 1, 1, 1, 1] strides = [1, 1, 1, 1, 1] padding = "SAME" data_format = "NDHWC" orig_input_shape = tf.constant(1879048192, shape=[5], dtype=tf.int32) grad = tf.constant(1, shape=[1,3,2,4,2], dtype=tf.float32) tf.raw_ops.AvgPool3DGrad(orig_input_shape=orig_input_shape, grad=grad, ksize=ksize, strides=strides, padding=padding, data_format=data_format) ``` ### Patches We have patched the issue in GitHub commit [9178ac9d6389bdc54638ab913ea0e419234d14eb](https://github.com/tensorflow/tensorflow/commit/9178ac9d6389bdc54638ab913ea0e419234d14eb). The fix will be included in TensorFlow 2.10.0. We will also cherrypick this commit on TensorFlow 2.9.1, TensorFlow 2.8.1, and TensorFlow 2.7.2, as these are also affected and still in ...