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

Reference binding to nullptr in `SdcaOptimizer`

CVE-2021-29572

Description

TensorFlow is an end-to-end open source platform for machine learning. The implementation of tf.raw_ops.SdcaOptimizer triggers undefined behavior due to dereferencing a null pointer. The implementation(https://github.com/tensorflow/tensorflow/blob/60a45c8b6192a4699f2e2709a2645a751d435cc3/tensorflow/core/kernels/sdca_internal.cc) does not validate that the user supplied arguments satisfy all constraints expected by the op(https://www.tensorflow.org/api_docs/python/tf/raw_ops/SdcaOptimizer). 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
f7cc8755ac66

Add several missing validations in SDCA

https://github.com/tensorflow/tensorflowMihai MaruseacMay 5, 2021via ghsa
1 file changed · +36 0
  • tensorflow/core/kernels/sdca_internal.cc+36 0 modified
    @@ -99,17 +99,31 @@ Status ModelWeights::Initialize(OpKernelContext* const context) {
       OpInputList sparse_weights_inputs;
       TF_RETURN_IF_ERROR(
           context->input_list("sparse_weights", &sparse_weights_inputs));
    +  if (sparse_indices_inputs.size() != sparse_weights_inputs.size())
    +    return errors::InvalidArgument(
    +        "sparse_indices and sparse_weights must have the same length, got ",
    +        sparse_indices_inputs.size(), " and ", sparse_weights_inputs.size());
       OpInputList dense_weights_inputs;
       TF_RETURN_IF_ERROR(
           context->input_list("dense_weights", &dense_weights_inputs));
     
       OpOutputList sparse_weights_outputs;
       TF_RETURN_IF_ERROR(context->output_list("out_delta_sparse_weights",
                                               &sparse_weights_outputs));
    +  if (sparse_weights_outputs.size() != sparse_weights_inputs.size())
    +    return errors::InvalidArgument(
    +        "out_delta_sparse_weights and sparse_weights must have the same "
    +        "length, got ",
    +        sparse_weights_outputs.size(), " and ", sparse_weights_inputs.size());
     
       OpOutputList dense_weights_outputs;
       TF_RETURN_IF_ERROR(
           context->output_list("out_delta_dense_weights", &dense_weights_outputs));
    +  if (dense_weights_outputs.size() != dense_weights_inputs.size())
    +    return errors::InvalidArgument(
    +        "out_delta_dense_weights and dense_weights must have the same length, "
    +        "got ",
    +        dense_weights_outputs.size(), " and ", dense_weights_inputs.size());
     
       for (int i = 0; i < sparse_weights_inputs.size(); ++i) {
         Tensor* delta_t;
    @@ -327,13 +341,28 @@ Status Examples::Initialize(OpKernelContext* const context,
       OpInputList sparse_example_indices_inputs;
       TF_RETURN_IF_ERROR(context->input_list("sparse_example_indices",
                                              &sparse_example_indices_inputs));
    +  if (sparse_example_indices_inputs.size() != num_sparse_features)
    +    return errors::InvalidArgument(
    +        "Expected ", num_sparse_features,
    +        " tensors in sparse_example_indices but got ",
    +        sparse_example_indices_inputs.size());
       OpInputList sparse_feature_indices_inputs;
       TF_RETURN_IF_ERROR(context->input_list("sparse_feature_indices",
                                              &sparse_feature_indices_inputs));
    +  if (sparse_feature_indices_inputs.size() != num_sparse_features)
    +    return errors::InvalidArgument(
    +        "Expected ", num_sparse_features,
    +        " tensors in sparse_feature_indices but got ",
    +        sparse_feature_indices_inputs.size());
       OpInputList sparse_feature_values_inputs;
       if (num_sparse_features_with_values > 0) {
         TF_RETURN_IF_ERROR(context->input_list("sparse_feature_values",
                                                &sparse_feature_values_inputs));
    +    if (sparse_feature_values_inputs.size() != num_sparse_features_with_values)
    +      return errors::InvalidArgument(
    +          "Expected ", num_sparse_features_with_values,
    +          " tensors in sparse_feature_values but got ",
    +          sparse_feature_values_inputs.size());
       }
     
       const Tensor* example_weights_t;
    @@ -400,6 +429,13 @@ Status Examples::CreateSparseFeatureRepresentation(
               sparse_example_indices_inputs[i].template flat<int64>();
           auto feature_indices =
               sparse_feature_indices_inputs[i].template flat<int64>();
    +      if (example_indices.size() != feature_indices.size()) {
    +        mutex_lock l(mu);
    +        result = errors::InvalidArgument(
    +            "Found mismatched example_indices and feature_indices [",
    +            example_indices, "] vs [", feature_indices, "]");
    +        return;
    +      }
     
           // Parse features for each example. Features for a particular example
           // are at the offsets (start_id, end_id]
    

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.