VYPR
Low severityNVD Advisory· Published May 14, 2021· Updated Aug 3, 2024

Heap buffer overflow in `MaxPool3DGradGrad`

CVE-2021-29576

Description

TensorFlow is an end-to-end open source platform for machine learning. The implementation of tf.raw_ops.MaxPool3DGradGrad is vulnerable to a heap buffer overflow. The implementation(https://github.com/tensorflow/tensorflow/blob/596c05a159b6fbb9e39ca10b3f7753b7244fa1e9/tensorflow/core/kernels/pooling_ops_3d.cc#L694-L696) does not check that the initialization of Pool3dParameters completes successfully. Since the constructor(https://github.com/tensorflow/tensorflow/blob/596c05a159b6fbb9e39ca10b3f7753b7244fa1e9/tensorflow/core/kernels/pooling_ops_3d.cc#L48-L88) uses OP_REQUIRES to validate conditions, the first assertion that fails interrupts the initialization of params, making it contain invalid data. In turn, this might cause a heap buffer overflow, depending on default initialized values. 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.

Affected packages

Versions sourced from the GitHub Security Advisory.

PackageAffected versionsPatched versions
tensorflowPyPI
< 2.1.42.1.4
tensorflowPyPI
>= 2.2.0, < 2.2.32.2.3
tensorflowPyPI
>= 2.3.0, < 2.3.32.3.3
tensorflowPyPI
>= 2.4.0, < 2.4.22.4.2
tensorflow-cpuPyPI
< 2.1.42.1.4
tensorflow-cpuPyPI
>= 2.2.0, < 2.2.32.2.3
tensorflow-cpuPyPI
>= 2.3.0, < 2.3.32.3.3
tensorflow-cpuPyPI
>= 2.4.0, < 2.4.22.4.2
tensorflow-gpuPyPI
< 2.1.42.1.4
tensorflow-gpuPyPI
>= 2.2.0, < 2.2.32.2.3
tensorflow-gpuPyPI
>= 2.3.0, < 2.3.32.3.3
tensorflow-gpuPyPI
>= 2.4.0, < 2.4.22.4.2

Affected products

1

Patches

1
63c6a29d0f2d

Add missing validation, prevent heap OOB

https://github.com/tensorflow/tensorflowMihai MaruseacMay 6, 2021via ghsa
1 file changed · +12 0
  • tensorflow/core/kernels/pooling_ops_3d.cc+12 0 modified
    @@ -693,6 +693,7 @@ class MaxPooling3dGradGradOp : public OpKernel {
     
         Pool3dParameters params{context,  ksize_,       stride_,
                                 padding_, data_format_, tensor_in.shape()};
    +    if (!context->status().ok()) return;  // params is invalid
     
         Tensor* output = nullptr;
         OP_REQUIRES_OK(context, context->forward_input_or_allocate_output(
    @@ -710,6 +711,17 @@ class MaxPooling3dGradGradOp : public OpKernel {
             context, out_grad_backprop.NumElements() > 0,
             errors::InvalidArgument("received empty tensor out_grad_backprop: ",
                                     out_grad_backprop.DebugString()));
    +    OP_REQUIRES(context,
    +                tensor_in.NumElements() == out_grad_backprop.NumElements(),
    +                errors::InvalidArgument("tensor_in and out_grad_backprop must "
    +                                        "have same number of elements, got <",
    +                                        tensor_in.DebugString(), "> and <",
    +                                        out_grad_backprop.DebugString(), ">"));
    +    OP_REQUIRES(
    +        context, tensor_out.NumElements() == output->NumElements(),
    +        errors::InvalidArgument(
    +            "tensor_out and output must have same number of elements, got <",
    +            tensor_out.DebugString(), "> and <", output->DebugString(), ">"));
     
         LaunchMaxPooling3dGradGradOp<Device, T>::launch(
             context, params, tensor_in, tensor_out, out_grad_backprop, output);
    

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

7

News mentions

0

No linked articles in our index yet.