신뢰할 수 없는 데이터의 역직렬화

Deserialization of Untrusted Data

설명

신뢰할 수 없는 데이터의 역직렬화는 공격자가 악의적으로 조작된 직렬화 데이터를 애플리케이션에 주입하여 임의의 코드를 실행시키거나 애플리케이션의 동작을 변경하는 취약성입니다. 이는 주로 직렬화된 객체를 네트워크를 통해 전송받아 역직렬화하는 과정에서 발생합니다.

잠재적 영향

  • 임의 코드 실행: 공격자가 임의의 코드를 실행하여 시스템을 손상시킬 수 있습니다.
  • 데이터 변조: 공격자가 데이터를 조작하여 애플리케이션의 무결성을 해칠 수 있습니다.
  • 정보 유출: 민감한 데이터가 공격자에게 노출될 수 있습니다.

해결 방법

  • 신뢰할 수 없는 데이터에 pickle이나 임의 객체를 생성하는 로더를 사용하지 않습니다.
  • 데이터 검증: 역직렬화하기 전에 데이터의 무결성과 신뢰성을 검증합니다.
  • JSON이나 yaml.safe_load처럼 임의 객체를 생성하지 않는 파서를 사용하고, 입력 크기와 데이터 구조도 검증합니다.

예시

pickle / JSON

변경 전

python
# Unsafe pickle deserialization
import pickle

def unsafe_loads(data):
    return pickle.loads(data)

변경 후

python
# Safe json deserialization
import json

def safe_loads(data):
    return json.loads(data)

설명:

  • 변경 전: pickle 모듈을 사용하여 역직렬화할 경우, 악의적으로 조작된 데이터가 임의의 코드를 실행할 수 있습니다.
  • 변경 후: json으로 데이터를 읽어 임의 Python 객체 생성을 피합니다. 입력 크기와 구조 검증은 별도로 필요합니다.

YAML

변경 전

python
# Unsafe YAML deserialization
import yaml

def unsafe_load(data):
    return yaml.load(data, Loader=yaml.Loader)

변경 후

python
# Safe YAML deserialization
import yaml

def safe_load(data):
    return yaml.safe_load(data)

설명:

  • 변경 전: yaml.load를 사용할 경우, 악의적으로 조작된 데이터가 임의의 코드를 실행할 수 있습니다.
  • 변경 후: yaml.safe_load로 임의 Python 객체 생성을 막습니다. 입력 크기와 구조 검증은 별도로 필요합니다.

참조