VYPR
High severityNVD Advisory· Published Aug 12, 2021· Updated Aug 4, 2024

Arbitrary code execution due to YAML deserialization

CVE-2021-37678

Description

TensorFlow is an end-to-end open source platform for machine learning. In affected versions TensorFlow and Keras can be tricked to perform arbitrary code execution when deserializing a Keras model from YAML format. The implementation uses yaml.unsafe_load which can perform arbitrary code execution on the input. Given that YAML format support requires a significant amount of work, we have removed it for now. We have patched the issue in GitHub commit 23d6383eb6c14084a8fc3bdf164043b974818012. The fix will be included in TensorFlow 2.6.0. We will also cherrypick this commit on TensorFlow 2.5.1, TensorFlow 2.4.3, and TensorFlow 2.3.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.3.42.3.4
tensorflowPyPI
>= 2.4.0, < 2.4.32.4.3
tensorflowPyPI
>= 2.5.0, < 2.5.12.5.1
tensorflow-cpuPyPI
< 2.3.42.3.4
tensorflow-cpuPyPI
>= 2.4.0, < 2.4.32.4.3
tensorflow-cpuPyPI
>= 2.5.0, < 2.5.12.5.1
tensorflow-gpuPyPI
< 2.3.42.3.4
tensorflow-gpuPyPI
>= 2.4.0, < 2.4.32.4.3
tensorflow-gpuPyPI
>= 2.5.0, < 2.5.12.5.1

Affected products

1

Patches

4
a09ab4e77afd

Use the safer `safe_load` function instead of `unsafe_load` when possible

https://github.com/tensorflow/tensorflowMihai MaruseacAug 3, 2021via ghsa
4 files changed · +18 55
  • tensorflow/python/keras/engine/functional.py+1 1 modified
    @@ -53,7 +53,7 @@ class Functional(training_lib.Model):
       than with subclassed `Model`s, specifically:
     
       - Model cloning (`keras.models.clone`)
    -  - Serialization (`model.get_config()/from_config`, `model.to_json()/to_yaml()`
    +  - Serialization (`model.get_config()/from_config`, `model.to_json()`
       - Whole-model saving (`model.save()`)
     
       A `Functional` model can be instantiated by passing two arguments to
    
  • tensorflow/python/keras/engine/functional_test.py+0 13 modified
    @@ -47,11 +47,6 @@
     from tensorflow.python.platform import test
     from tensorflow.python.training.tracking.util import Checkpoint
     
    -try:
    -  import yaml  # pylint:disable=g-import-not-at-top
    -except ImportError:
    -  yaml = None
    -
     
     class NetworkConstructionTest(keras_parameterized.TestCase):
     
    @@ -627,10 +622,6 @@ def test_multi_input_multi_output_recursion(self):
           json_str = model.to_json()
           models.model_from_json(json_str)
     
    -      if yaml is not None:
    -        yaml_str = model.to_yaml()
    -        models.model_from_yaml(yaml_str)
    -
       @combinations.generate(combinations.combine(mode=['graph', 'eager']))
       def test_invalid_graphs(self):
         a = layers.Input(shape=(32,), name='input_a')
    @@ -1361,10 +1352,6 @@ def test_constant_initializer_with_numpy(self):
         json_str = model.to_json()
         models.model_from_json(json_str)
     
    -    if yaml is not None:
    -      yaml_str = model.to_yaml()
    -      models.model_from_yaml(yaml_str)
    -
       def test_subclassed_error_if_init_not_called(self):
     
         class MyNetwork(training_lib.Model):
    
  • tensorflow/python/keras/engine/training.py+8 10 modified
    @@ -84,11 +84,6 @@
       import h5py
     except ImportError:
       h5py = None
    -
    -try:
    -  import yaml
    -except ImportError:
    -  yaml = None
     # pylint: enable=g-import-not-at-top
     
     
    @@ -2382,6 +2377,9 @@ def to_json(self, **kwargs):
       def to_yaml(self, **kwargs):
         """Returns a yaml string containing the network configuration.
     
    +    Note: Since TF 2.6, this method is no longer supported and will raise a
    +    RuntimeError.
    +
         To load a network from a yaml save file, use
         `keras.models.model_from_yaml(yaml_string, custom_objects={})`.
     
    @@ -2397,12 +2395,12 @@ def to_yaml(self, **kwargs):
             A YAML string.
     
         Raises:
    -        ImportError: if yaml module is not found.
    +        RuntimeError: announces that the method poses a security risk
         """
    -    if yaml is None:
    -      raise ImportError(
    -          'Requires yaml module installed (`pip install pyyaml`).')
    -    return yaml.dump(self._updated_config(), **kwargs)
    +    raise RuntimeError(
    +        'Method `model.to_yaml()` has been removed due to security risk of '
    +        'arbitrary code execution. Please use `model.to_json()` instead.'
    +    )
     
       def reset_states(self):
         for layer in self.layers:
    
  • tensorflow/python/keras/saving/model_config.py+9 31 modified
    @@ -18,18 +18,11 @@
     from tensorflow.python.keras.saving.saved_model import json_utils
     from tensorflow.python.util.tf_export import keras_export
     
    -# pylint: disable=g-import-not-at-top
    -try:
    -  import yaml
    -except ImportError:
    -  yaml = None
    -# pylint: enable=g-import-not-at-top
    -
     
     @keras_export('keras.models.model_from_config')
     def model_from_config(config, custom_objects=None):
       """Instantiates a Keras model from its config.
    - 
    +
       Usage:
       ```
       # for a Functional API model
    @@ -63,17 +56,8 @@ def model_from_config(config, custom_objects=None):
     def model_from_yaml(yaml_string, custom_objects=None):
       """Parses a yaml model configuration file and returns a model instance.
     
    -  Usage:
    -
    -  >>> model = tf.keras.Sequential([
    -  ...     tf.keras.layers.Dense(5, input_shape=(3,)),
    -  ...     tf.keras.layers.Softmax()])
    -  >>> try:
    -  ...   import yaml
    -  ...   config = model.to_yaml()
    -  ...   loaded_model = tf.keras.models.model_from_yaml(config)
    -  ... except ImportError:
    -  ...   pass
    +  Note: Since TF 2.6, this method is no longer supported and will raise a
    +  RuntimeError.
     
       Args:
           yaml_string: YAML string or open file encoding a model configuration.
    @@ -85,19 +69,13 @@ def model_from_yaml(yaml_string, custom_objects=None):
           A Keras model instance (uncompiled).
     
       Raises:
    -      ImportError: if yaml module is not found.
    +      RuntimeError: announces that the method poses a security risk
       """
    -  if yaml is None:
    -    raise ImportError('Requires yaml module installed (`pip install pyyaml`).')
    -  # The method unsafe_load only exists in PyYAML 5.x+, so which branch of the
    -  # try block is covered by tests depends on the installed version of PyYAML.
    -  try:
    -    # PyYAML 5.x+
    -    config = yaml.unsafe_load(yaml_string)
    -  except AttributeError:
    -    config = yaml.load(yaml_string)
    -  from tensorflow.python.keras.layers import deserialize  # pylint: disable=g-import-not-at-top
    -  return deserialize(config, custom_objects=custom_objects)
    +  raise RuntimeError(
    +      'Method `model_from_yaml()` has been removed due to security risk of '
    +      'arbitrary code execution. Please use `Model.to_json()` and '
    +      '`model_from_json()` instead.'
    +  )
     
     
     @keras_export('keras.models.model_from_json')
    
8e47a685785b

Use the safer `safe_load` function instead of `unsafe_load` when possible

https://github.com/tensorflow/tensorflowMihai MaruseacAug 3, 2021via ghsa
4 files changed · +18 55
  • tensorflow/python/keras/engine/functional.py+1 1 modified
    @@ -58,7 +58,7 @@ class Functional(training_lib.Model):
       than with subclassed `Model`s, specifically:
     
       - Model cloning (`keras.models.clone`)
    -  - Serialization (`model.get_config()/from_config`, `model.to_json()/to_yaml()`
    +  - Serialization (`model.get_config()/from_config`, `model.to_json()`
       - Whole-model saving (`model.save()`)
     
       A `Functional` model can be instantiated by passing two arguments to
    
  • tensorflow/python/keras/engine/functional_test.py+0 13 modified
    @@ -52,11 +52,6 @@
     from tensorflow.python.platform import test
     from tensorflow.python.training.tracking.util import Checkpoint
     
    -try:
    -  import yaml  # pylint:disable=g-import-not-at-top
    -except ImportError:
    -  yaml = None
    -
     
     class NetworkConstructionTest(keras_parameterized.TestCase):
     
    @@ -632,10 +627,6 @@ def test_multi_input_multi_output_recursion(self):
           json_str = model.to_json()
           models.model_from_json(json_str)
     
    -      if yaml is not None:
    -        yaml_str = model.to_yaml()
    -        models.model_from_yaml(yaml_str)
    -
       @combinations.generate(combinations.combine(mode=['graph', 'eager']))
       def test_invalid_graphs(self):
         a = layers.Input(shape=(32,), name='input_a')
    @@ -1391,10 +1382,6 @@ def test_constant_initializer_with_numpy(self):
         json_str = model.to_json()
         models.model_from_json(json_str)
     
    -    if yaml is not None:
    -      yaml_str = model.to_yaml()
    -      models.model_from_yaml(yaml_str)
    -
       def test_subclassed_error_if_init_not_called(self):
     
         class MyNetwork(training_lib.Model):
    
  • tensorflow/python/keras/engine/training.py+8 10 modified
    @@ -91,11 +91,6 @@
       import h5py
     except ImportError:
       h5py = None
    -
    -try:
    -  import yaml
    -except ImportError:
    -  yaml = None
     # pylint: enable=g-import-not-at-top
     
     
    @@ -2281,6 +2276,9 @@ def to_json(self, **kwargs):
       def to_yaml(self, **kwargs):
         """Returns a yaml string containing the network configuration.
     
    +    Note: Since TF 2.6, this method is no longer supported and will raise a
    +    RuntimeError.
    +
         To load a network from a yaml save file, use
         `keras.models.model_from_yaml(yaml_string, custom_objects={})`.
     
    @@ -2296,12 +2294,12 @@ def to_yaml(self, **kwargs):
             A YAML string.
     
         Raises:
    -        ImportError: if yaml module is not found.
    +        RuntimeError: announces that the method poses a security risk
         """
    -    if yaml is None:
    -      raise ImportError(
    -          'Requires yaml module installed (`pip install pyyaml`).')
    -    return yaml.dump(self._updated_config(), **kwargs)
    +    raise RuntimeError(
    +        'Method `model.to_yaml()` has been removed due to security risk of '
    +        'arbitrary code execution. Please use `model.to_json()` instead.'
    +    )
     
       def reset_states(self):
         for layer in self.layers:
    
  • tensorflow/python/keras/saving/model_config.py+9 31 modified
    @@ -23,18 +23,11 @@
     
     from tensorflow.python.util.tf_export import keras_export
     
    -# pylint: disable=g-import-not-at-top
    -try:
    -  import yaml
    -except ImportError:
    -  yaml = None
    -# pylint: enable=g-import-not-at-top
    -
     
     @keras_export('keras.models.model_from_config')
     def model_from_config(config, custom_objects=None):
       """Instantiates a Keras model from its config.
    - 
    +
       Usage:
       ```
       # for a Functional API model
    @@ -68,17 +61,8 @@ def model_from_config(config, custom_objects=None):
     def model_from_yaml(yaml_string, custom_objects=None):
       """Parses a yaml model configuration file and returns a model instance.
     
    -  Usage:
    -
    -  >>> model = tf.keras.Sequential([
    -  ...     tf.keras.layers.Dense(5, input_shape=(3,)),
    -  ...     tf.keras.layers.Softmax()])
    -  >>> try:
    -  ...   import yaml
    -  ...   config = model.to_yaml()
    -  ...   loaded_model = tf.keras.models.model_from_yaml(config)
    -  ... except ImportError:
    -  ...   pass
    +  Note: Since TF 2.6, this method is no longer supported and will raise a
    +  RuntimeError.
     
       Arguments:
           yaml_string: YAML string or open file encoding a model configuration.
    @@ -90,19 +74,13 @@ def model_from_yaml(yaml_string, custom_objects=None):
           A Keras model instance (uncompiled).
     
       Raises:
    -      ImportError: if yaml module is not found.
    +      RuntimeError: announces that the method poses a security risk
       """
    -  if yaml is None:
    -    raise ImportError('Requires yaml module installed (`pip install pyyaml`).')
    -  # The method unsafe_load only exists in PyYAML 5.x+, so which branch of the
    -  # try block is covered by tests depends on the installed version of PyYAML.
    -  try:
    -    # PyYAML 5.x+
    -    config = yaml.unsafe_load(yaml_string)
    -  except AttributeError:
    -    config = yaml.load(yaml_string)
    -  from tensorflow.python.keras.layers import deserialize  # pylint: disable=g-import-not-at-top
    -  return deserialize(config, custom_objects=custom_objects)
    +  raise RuntimeError(
    +      'Method `model_from_yaml()` has been removed due to security risk of '
    +      'arbitrary code execution. Please use `Model.to_json()` and '
    +      '`model_from_json()` instead.'
    +  )
     
     
     @keras_export('keras.models.model_from_json')
    
1df5a69e9f1a

Use the safer `safe_load` function instead of `unsafe_load` when possible

https://github.com/tensorflow/tensorflowMihai MaruseacAug 3, 2021via ghsa
4 files changed · +17 54
  • tensorflow/python/keras/engine/functional.py+1 1 modified
    @@ -58,7 +58,7 @@ class Functional(training_lib.Model):
       than with subclassed `Model`s, specifically:
     
       - Model cloning (`keras.models.clone`)
    -  - Serialization (`model.get_config()/from_config`, `model.to_json()/to_yaml()`
    +  - Serialization (`model.get_config()/from_config`, `model.to_json()`
       - Whole-model saving (`model.save()`)
     
       A `Functional` model can be instantiated by passing two arguments to
    
  • tensorflow/python/keras/engine/functional_test.py+0 13 modified
    @@ -52,11 +52,6 @@
     from tensorflow.python.platform import test
     from tensorflow.python.training.tracking.util import Checkpoint
     
    -try:
    -  import yaml  # pylint:disable=g-import-not-at-top
    -except ImportError:
    -  yaml = None
    -
     
     class NetworkConstructionTest(keras_parameterized.TestCase):
     
    @@ -620,10 +615,6 @@ def test_multi_input_multi_output_recursion(self):
           json_str = model.to_json()
           models.model_from_json(json_str)
     
    -      if yaml is not None:
    -        yaml_str = model.to_yaml()
    -        models.model_from_yaml(yaml_str)
    -
       @combinations.generate(combinations.combine(mode=['graph', 'eager']))
       def test_invalid_graphs(self):
         a = layers.Input(shape=(32,), name='input_a')
    @@ -1261,10 +1252,6 @@ def test_constant_initializer_with_numpy(self):
         json_str = model.to_json()
         models.model_from_json(json_str)
     
    -    if yaml is not None:
    -      yaml_str = model.to_yaml()
    -      models.model_from_yaml(yaml_str)
    -
       def test_subclassed_error_if_init_not_called(self):
     
         class MyNetwork(training_lib.Model):
    
  • tensorflow/python/keras/engine/training.py+8 10 modified
    @@ -88,11 +88,6 @@
       import h5py
     except ImportError:
       h5py = None
    -
    -try:
    -  import yaml
    -except ImportError:
    -  yaml = None
     # pylint: enable=g-import-not-at-top
     
     
    @@ -2258,6 +2253,9 @@ def to_json(self, **kwargs):
       def to_yaml(self, **kwargs):
         """Returns a yaml string containing the network configuration.
     
    +    Note: Since TF 2.6, this method is no longer supported and will raise a
    +    RuntimeError.
    +
         To load a network from a yaml save file, use
         `keras.models.model_from_yaml(yaml_string, custom_objects={})`.
     
    @@ -2273,12 +2271,12 @@ def to_yaml(self, **kwargs):
             A YAML string.
     
         Raises:
    -        ImportError: if yaml module is not found.
    +        RuntimeError: announces that the method poses a security risk
         """
    -    if yaml is None:
    -      raise ImportError(
    -          'Requires yaml module installed (`pip install pyyaml`).')
    -    return yaml.dump(self._updated_config(), **kwargs)
    +    raise RuntimeError(
    +        'Method `model.to_yaml()` has been removed due to security risk of '
    +        'arbitrary code execution. Please use `model.to_json()` instead.'
    +    )
     
       def reset_states(self):
         for layer in self.layers:
    
  • tensorflow/python/keras/saving/model_config.py+8 30 modified
    @@ -23,13 +23,6 @@
     
     from tensorflow.python.util.tf_export import keras_export
     
    -# pylint: disable=g-import-not-at-top
    -try:
    -  import yaml
    -except ImportError:
    -  yaml = None
    -# pylint: enable=g-import-not-at-top
    -
     
     @keras_export('keras.models.model_from_config')
     def model_from_config(config, custom_objects=None):
    @@ -59,17 +52,8 @@ def model_from_config(config, custom_objects=None):
     def model_from_yaml(yaml_string, custom_objects=None):
       """Parses a yaml model configuration file and returns a model instance.
     
    -  Usage:
    -
    -  >>> model = tf.keras.Sequential([
    -  ...     tf.keras.layers.Dense(5, input_shape=(3,)),
    -  ...     tf.keras.layers.Softmax()])
    -  >>> try:
    -  ...   import yaml
    -  ...   config = model.to_yaml()
    -  ...   loaded_model = tf.keras.models.model_from_yaml(config)
    -  ... except ImportError:
    -  ...   pass
    +  Note: Since TF 2.6, this method is no longer supported and will raise a
    +  RuntimeError.
     
       Arguments:
           yaml_string: YAML string or open file encoding a model configuration.
    @@ -81,19 +65,13 @@ def model_from_yaml(yaml_string, custom_objects=None):
           A Keras model instance (uncompiled).
     
       Raises:
    -      ImportError: if yaml module is not found.
    +      RuntimeError: announces that the method poses a security risk
       """
    -  if yaml is None:
    -    raise ImportError('Requires yaml module installed (`pip install pyyaml`).')
    -  # The method unsafe_load only exists in PyYAML 5.x+, so which branch of the
    -  # try block is covered by tests depends on the installed version of PyYAML.
    -  try:
    -    # PyYAML 5.x+
    -    config = yaml.unsafe_load(yaml_string)
    -  except AttributeError:
    -    config = yaml.load(yaml_string)
    -  from tensorflow.python.keras.layers import deserialize  # pylint: disable=g-import-not-at-top
    -  return deserialize(config, custom_objects=custom_objects)
    +  raise RuntimeError(
    +      'Method `model_from_yaml()` has been removed due to security risk of '
    +      'arbitrary code execution. Please use `Model.to_json()` and '
    +      '`model_from_json()` instead.'
    +  )
     
     
     @keras_export('keras.models.model_from_json')
    
23d6383eb6c1

Use the safer `safe_load` function instead of `unsafe_load` when possible

https://github.com/tensorflow/tensorflowMihai MaruseacAug 3, 2021via ghsa
5 files changed · +22 55
  • RELEASE.md+4 0 modified
    @@ -15,6 +15,10 @@
         `if x.shape.rank == 1: x = tf.expand_dims(x, axis=-1)`.
         Functional models as well as Sequential models built with an explicit
         input shape are not affected.
    +  * The methods `Model.to_yaml()` and `keras.models.model_from_yaml` have been
    +    replaced to raise a `RuntimeError` as they can be abused to cause arbitrary
    +    code execution. It is recommended to use JSON serialization instead of YAML,
    +    or, a better alternative, serialize to H5.
     
     * `tf.lite`:
       * Rename fields `SignatureDef` table in schema to maximize the parity with
    
  • tensorflow/python/keras/engine/functional.py+1 1 modified
    @@ -53,7 +53,7 @@ class Functional(training_lib.Model):
       than with subclassed `Model`s, specifically:
     
       - Model cloning (`keras.models.clone`)
    -  - Serialization (`model.get_config()/from_config`, `model.to_json()/to_yaml()`
    +  - Serialization (`model.get_config()/from_config`, `model.to_json()`
       - Whole-model saving (`model.save()`)
     
       A `Functional` model can be instantiated by passing two arguments to
    
  • tensorflow/python/keras/engine/functional_test.py+0 13 modified
    @@ -47,11 +47,6 @@
     from tensorflow.python.platform import test
     from tensorflow.python.training.tracking.util import Checkpoint
     
    -try:
    -  import yaml  # pylint:disable=g-import-not-at-top
    -except ImportError:
    -  yaml = None
    -
     
     class NetworkConstructionTest(keras_parameterized.TestCase):
     
    @@ -627,10 +622,6 @@ def test_multi_input_multi_output_recursion(self):
           json_str = model.to_json()
           models.model_from_json(json_str)
     
    -      if yaml is not None:
    -        yaml_str = model.to_yaml()
    -        models.model_from_yaml(yaml_str)
    -
       @combinations.generate(combinations.combine(mode=['graph', 'eager']))
       def test_invalid_graphs(self):
         a = layers.Input(shape=(32,), name='input_a')
    @@ -1361,10 +1352,6 @@ def test_constant_initializer_with_numpy(self):
         json_str = model.to_json()
         models.model_from_json(json_str)
     
    -    if yaml is not None:
    -      yaml_str = model.to_yaml()
    -      models.model_from_yaml(yaml_str)
    -
       def test_subclassed_error_if_init_not_called(self):
     
         class MyNetwork(training_lib.Model):
    
  • tensorflow/python/keras/engine/training.py+8 10 modified
    @@ -87,11 +87,6 @@
       import h5py
     except ImportError:
       h5py = None
    -
    -try:
    -  import yaml
    -except ImportError:
    -  yaml = None
     # pylint: enable=g-import-not-at-top
     
     
    @@ -2416,6 +2411,9 @@ def to_json(self, **kwargs):
       def to_yaml(self, **kwargs):
         """Returns a yaml string containing the network configuration.
     
    +    Note: Since TF 2.6, this method is no longer supported and will raise a
    +    RuntimeError.
    +
         To load a network from a yaml save file, use
         `keras.models.model_from_yaml(yaml_string, custom_objects={})`.
     
    @@ -2431,12 +2429,12 @@ def to_yaml(self, **kwargs):
             A YAML string.
     
         Raises:
    -        ImportError: if yaml module is not found.
    +        RuntimeError: announces that the method poses a security risk
         """
    -    if yaml is None:
    -      raise ImportError(
    -          'Requires yaml module installed (`pip install pyyaml`).')
    -    return yaml.dump(self._updated_config(), **kwargs)
    +    raise RuntimeError(
    +        'Method `model.to_yaml()` has been removed due to security risk of '
    +        'arbitrary code execution. Please use `model.to_json()` instead.'
    +    )
     
       def reset_states(self):
         for layer in self.layers:
    
  • tensorflow/python/keras/saving/model_config.py+9 31 modified
    @@ -18,18 +18,11 @@
     from tensorflow.python.keras.saving.saved_model import json_utils
     from tensorflow.python.util.tf_export import keras_export
     
    -# pylint: disable=g-import-not-at-top
    -try:
    -  import yaml
    -except ImportError:
    -  yaml = None
    -# pylint: enable=g-import-not-at-top
    -
     
     @keras_export('keras.models.model_from_config')
     def model_from_config(config, custom_objects=None):
       """Instantiates a Keras model from its config.
    - 
    +
       Usage:
       ```
       # for a Functional API model
    @@ -63,17 +56,8 @@ def model_from_config(config, custom_objects=None):
     def model_from_yaml(yaml_string, custom_objects=None):
       """Parses a yaml model configuration file and returns a model instance.
     
    -  Usage:
    -
    -  >>> model = tf.keras.Sequential([
    -  ...     tf.keras.layers.Dense(5, input_shape=(3,)),
    -  ...     tf.keras.layers.Softmax()])
    -  >>> try:
    -  ...   import yaml
    -  ...   config = model.to_yaml()
    -  ...   loaded_model = tf.keras.models.model_from_yaml(config)
    -  ... except ImportError:
    -  ...   pass
    +  Note: Since TF 2.6, this method is no longer supported and will raise a
    +  RuntimeError.
     
       Args:
           yaml_string: YAML string or open file encoding a model configuration.
    @@ -85,19 +69,13 @@ def model_from_yaml(yaml_string, custom_objects=None):
           A Keras model instance (uncompiled).
     
       Raises:
    -      ImportError: if yaml module is not found.
    +      RuntimeError: announces that the method poses a security risk
       """
    -  if yaml is None:
    -    raise ImportError('Requires yaml module installed (`pip install pyyaml`).')
    -  # The method unsafe_load only exists in PyYAML 5.x+, so which branch of the
    -  # try block is covered by tests depends on the installed version of PyYAML.
    -  try:
    -    # PyYAML 5.x+
    -    config = yaml.unsafe_load(yaml_string)
    -  except AttributeError:
    -    config = yaml.load(yaml_string)
    -  from tensorflow.python.keras.layers import deserialize  # pylint: disable=g-import-not-at-top
    -  return deserialize(config, custom_objects=custom_objects)
    +  raise RuntimeError(
    +      'Method `model_from_yaml()` has been removed due to security risk of '
    +      'arbitrary code execution. Please use `Model.to_json()` and '
    +      '`model_from_json()` instead.'
    +  )
     
     
     @keras_export('keras.models.model_from_json')
    

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

10

News mentions

0

No linked articles in our index yet.