설명
신뢰할 수 없는 데이터의 역직렬화는 공격자가 악의적으로 조작된 직렬화 데이터를 애플리케이션에 주입하여 임의의 코드를 실행시키거나 애플리케이션의 동작을 변경하는 취약성입니다. 이는 주로 직렬화된 객체를 네트워크를 통해 전송받아 역직렬화하는 과정에서 발생합니다.
잠재적 영향
- 임의 코드 실행: 공격자가 임의의 코드를 실행하여 시스템을 손상시킬 수 있습니다.
- 데이터 변조: 공격자가 데이터를 조작하여 애플리케이션의 무결성을 해칠 수 있습니다.
- 정보 유출: 민감한 데이터가 공격자에게 노출될 수 있습니다.
해결 방법
- 신뢰할 수 없는 데이터에
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 객체 생성을 막습니다. 입력 크기와 구조 검증은 별도로 필요합니다.