VYPR
High severityNVD Advisory· Published Nov 18, 2022· Updated Apr 22, 2025

FractionalMaxPool and FractionalAVGPool heap out-of-bounds acess in Tensorflow

CVE-2022-41900

Description

TensorFlow is an open source platform for machine learning. The security vulnerability results in FractionalMax(AVG)Pool with illegal pooling_ratio. Attackers using Tensorflow can exploit the vulnerability. They can access heap memory which is not in the control of user, leading to a crash or remote code execution. We have patched the issue in GitHub commit 216525144ee7c910296f5b05d214ca1327c9ce48. The fix will be included in TensorFlow 2.11.0. We will also cherry pick this commit on TensorFlow 2.10.1.

Affected packages

Versions sourced from the GitHub Security Advisory.

PackageAffected versionsPatched versions
tensorflowPyPI
< 2.8.42.8.4
tensorflowPyPI
>= 2.9.0, < 2.9.32.9.3
tensorflowPyPI
>= 2.10.0, < 2.10.12.10.1
tensorflow-cpuPyPI
< 2.8.42.8.4
tensorflow-gpuPyPI
< 2.8.42.8.4
tensorflow-cpuPyPI
>= 2.9.0, < 2.9.32.9.3
tensorflow-gpuPyPI
>= 2.9.0, < 2.9.32.9.3
tensorflow-cpuPyPI
>= 2.10.0, < 2.10.12.10.1
tensorflow-gpuPyPI
>= 2.10.0, < 2.10.12.10.1

Affected products

1

Patches

1
216525144ee7

Fix security vulnerability with FractionalMax(AVG)Pool with illegal pooling_ratio

https://github.com/tensorflow/tensorflowA. Unique TensorFlowerOct 24, 2022via ghsa
6 files changed · +84 10
  • tensorflow/core/kernels/fractional_avg_pool_op.cc+11 3 modified
    @@ -44,6 +44,12 @@ class FractionalAvgPoolOp : public OpKernel {
         OP_REQUIRES(context, pooling_ratio_.size() == 4,
                     errors::InvalidArgument(
                         "pooling_ratio field must specify 4 dimensions"));
    +    for (std::size_t i = 0; i < pooling_ratio_.size(); ++i) {
    +      OP_REQUIRES(context, pooling_ratio_[i] >= 1,
    +                  errors::InvalidArgument(
    +                      "pooling_ratio cannot be smaller than 1, got: ",
    +                      pooling_ratio_[i]));
    +    }
         OP_REQUIRES(
             context, pooling_ratio_[0] == 1 || pooling_ratio_[3] == 1,
             errors::Unimplemented("Fractional average pooling is not yet "
    @@ -82,9 +88,11 @@ class FractionalAvgPoolOp : public OpKernel {
         for (int i = 0; i < tensor_in_and_out_dims; ++i) {
           input_size[i] = tensor_in.dim_size(i);
           OP_REQUIRES(
    -          context, pooling_ratio_[i] <= input_size[i],
    -          errors::InvalidArgument(
    -              "Pooling ratio cannot be bigger than input tensor dim size."));
    +          context, input_size[i] >= pooling_ratio_[i],
    +          errors::InvalidArgument("Pooling ratio is higher than input "
    +                                  "dimension size for dimension ",
    +                                  i, ". Input dim size: ", input_size[i],
    +                                  " pooling ratio: ", pooling_ratio_[i]));
         }
         // Output size.
         for (int i = 0; i < tensor_in_and_out_dims; ++i) {
    
  • tensorflow/core/kernels/fractional_max_pool_op.cc+6 0 modified
    @@ -45,6 +45,12 @@ class FractionalMaxPoolOp : public OpKernel {
         OP_REQUIRES(context, pooling_ratio_.size() == 4,
                     errors::InvalidArgument("pooling_ratio field must "
                                             "specify 4 dimensions"));
    +    for (std::size_t i = 0; i < pooling_ratio_.size(); ++i) {
    +      OP_REQUIRES(context, pooling_ratio_[i] >= 1,
    +                  errors::InvalidArgument(
    +                      "pooling_ratio cannot be smaller than 1, got: ",
    +                      pooling_ratio_[i]));
    +    }
     
         OP_REQUIRES(
             context, pooling_ratio_[0] == 1 || pooling_ratio_[3] == 1,
    
  • tensorflow/core/ops/nn_ops.cc+7 0 modified
    @@ -63,6 +63,13 @@ Status FractionalPoolShapeFn(InferenceContext* c) {
         }
       }
     
    +  for (std::size_t i = 0; i < pooling_ratio.size(); ++i) {
    +    if (pooling_ratio[i] < 1) {
    +      return errors::InvalidArgument(
    +          "pooling_ratio cannot be smaller than 1, got: ", pooling_ratio[i]);
    +    }
    +  }
    +
       c->set_output(0, c->MakeShape(output_dims));
       c->set_output(1, c->Vector(output_dims[1]));
       c->set_output(2, c->Vector(output_dims[2]));
    
  • tensorflow/core/ops/nn_ops_test.cc+7 6 modified
    @@ -523,7 +523,8 @@ TEST(NNOpsTest, FractionalPool_ShapeFn) {
                            .Finalize(&op.node_def));
         };
     
    -    set_op(std::vector<float>{2.0f, 1, 1 / 1.5f, 1 / 2.0f});
    +    // pooling_ratio must >= 1.0
    +    set_op(std::vector<float>{2.0f, 1, 1.5f, 4.0f});
     
         // Rank check.
         INFER_ERROR("must be rank 4", op, "[?,?,?]");
    @@ -532,11 +533,11 @@ TEST(NNOpsTest, FractionalPool_ShapeFn) {
         INFER_OK(op, "?", "[?,?,?,?];[?];[?]");
         INFER_OK(op, "[?,?,?,?]", "[?,?,?,?];[?];[?]");
     
    -    INFER_OK(op, "[10,20,30,40]", "[5,20,45,80];[20];[45]");
    -    INFER_OK(op, "[?,20,30,40]", "[?,20,45,80];[20];[45]");
    -    INFER_OK(op, "[10,?,30,40]", "[5,?,45,80];[?];[45]");
    -    INFER_OK(op, "[10,20,?,40]", "[5,20,?,80];[20];[?]");
    -    INFER_OK(op, "[10,20,30,?]", "[5,20,45,?];[20];[45]");
    +    INFER_OK(op, "[10,20,30,40]", "[5,20,20,10];[20];[20]");
    +    INFER_OK(op, "[?,20,30,40]", "[?,20,20,10];[20];[20]");
    +    INFER_OK(op, "[10,?,30,40]", "[5,?,20,10];[?];[20]");
    +    INFER_OK(op, "[10,20,?,40]", "[5,20,?,10];[20];[?]");
    +    INFER_OK(op, "[10,20,30,?]", "[5,20,20,?];[20];[20]");
     
         // Wrong number of values for pooling_ratio.
         set_op(std::vector<float>{.5, 1.0, 1.5});
    
  • tensorflow/python/kernel_tests/nn_ops/fractional_avg_pool_op_test.py+35 0 modified
    @@ -333,6 +333,41 @@ def testNegativeSeqValuesForGradOp(self):
     
             self.evaluate(z)
     
    +  def testPoolingRatioHasMoreDimThanInput(self):
    +    with self.cached_session() as _:
    +      with self.assertRaisesRegex(
    +          errors.InvalidArgumentError,
    +          r"Pooling ratio is higher than input dimension size for dimension 1.*"
    +      ):
    +        result = nn_ops.gen_nn_ops.fractional_avg_pool(
    +            value=constant_op.constant(
    +                value=[[[[1, 4, 2, 3]]]], dtype=dtypes.int64),
    +            pooling_ratio=[1.0, 1.44, 1.73, 1.0],
    +            pseudo_random=False,
    +            overlapping=False,
    +            deterministic=False,
    +            seed=0,
    +            seed2=0,
    +            name=None)
    +        self.evaluate(result)
    +
    +  def testPoolingRatioValueOutOfRange(self):
    +    with self.cached_session() as _:
    +      # Whether turn on `TF2_BEHAVIOR` generates different error messages
    +      with self.assertRaisesRegex(
    +          (errors.InvalidArgumentError, ValueError),
    +          r"(pooling_ratio cannot be smaller than 1, got: .*)|(is negative)"):
    +        result = nn_ops.gen_nn_ops.fractional_avg_pool(
    +            value=np.zeros([3, 30, 30, 3]),
    +            pooling_ratio=[1, -1, 3, 1],
    +            pseudo_random=False,
    +            overlapping=False,
    +            deterministic=False,
    +            seed=0,
    +            seed2=0,
    +        )
    +        self.evaluate(result)
    +
     
     class FractionalAvgPoolGradTest(test.TestCase):
       """Tests for FractionalAvgPoolGrad.
    
  • tensorflow/python/kernel_tests/nn_ops/fractional_max_pool_op_test.py+18 1 modified
    @@ -320,7 +320,7 @@ def testDeterminismExceptionThrowing(self):
           nn_ops.fractional_max_pool(
               rand_mat, [1, 1.5, 1.5, 1], seed=1, seed2=1, deterministic=True)
     
    -  def testPoolingRatio(self):
    +  def testPoolingRatioHasMoreDimThanInput(self):
         with self.cached_session() as _:
           with self.assertRaisesRegex(
               errors.InvalidArgumentError,
    @@ -338,6 +338,23 @@ def testPoolingRatio(self):
                 name=None)
             self.evaluate(result)
     
    +  def testPoolingRatioValueOutOfRange(self):
    +    with self.cached_session() as _:
    +      # Whether turn on `TF2_BEHAVIOR` generates different error messages
    +      with self.assertRaisesRegex(
    +          (errors.InvalidArgumentError, ValueError),
    +          r"(pooling_ratio cannot be smaller than 1, got: .*)|(is negative)"):
    +        result = nn_ops.gen_nn_ops.fractional_max_pool(
    +            value=np.zeros([3, 30, 30, 3]),
    +            pooling_ratio=[1, -1, 3, 1],
    +            pseudo_random=False,
    +            overlapping=False,
    +            deterministic=False,
    +            seed=0,
    +            seed2=0,
    +        )
    +        self.evaluate(result)
    +
     
     class FractionalMaxPoolGradTest(test.TestCase):
       """Tests for FractionalMaxPoolGrad.
    

Vulnerability mechanics

Generated by null/stub on May 9, 2026. Inputs: CWE entries + fix-commit diffs from this CVE's patches. Citations validated against bundle.

References

4

News mentions

0

No linked articles in our index yet.