신뢰되지 않은 데이터 역직렬화

Deserialization of Untrusted Data

설명

역직렬화는 바이트 형태의 데이터를 다시 객체로 복원하는 과정입니다. Python의 pickle, marshal, PyYAML(yaml.load) 같은 역직렬화 도구는 임의의 객체 생성 및 특수 메서드 실행(reduce, setstate 등)이 가능해, 신뢰되지 않은 입력을 그대로 역직렬화하면 객체 생성자/소멸자에 포함된 코드가 실행될 수 있습니다. 공격자는 조작된 payload를 보내 원격 코드 실행(RCE), 파일 접근, 환경 변수 노출 등을 유발할 수 있습니다.

잠재적 영향

  • 무단 코드 실행(RCE): 악성 payload의 reduce 등을 통해 서버에서 임의 명령이나 코드를 실행할 수 있습니다.

  • 데이터 유출 및 변조: 역직렬화된 객체를 통해 민감정보에 접근하거나 애플리케이션 상태/데이터를 변경할 수 있습니다.

  • 권한 상승: 애플리케이션 권한 범위에서 시스템 명령 수행, 파일 시스템 조작 등을 통해 더 높은 권한을 획득할 수 있습니다.

  • 서비스 거부(DoS): 매우 큰 객체/깊은 구조를 역직렬화하여 메모리/CPU를 소모시키거나 예외를 유발해 서비스 중단을 일으킬 수 있습니다.

해결 방법

  • 가능하면 역직렬화를 피하고 JSON 같은 안전한 포맷을 사용하세요 (json.loads).

  • YAML이 필요하면 yaml.safe_load 또는 Loader=yaml.SafeLoader를 사용하세요. yaml.load의 기본 Loader는 금지하세요.

  • pickle/marshal은 신뢰되지 않은 데이터에 사용하지 마세요. 꼭 필요하면 다음을 모두 적용하세요:

    • HMAC/디지털 서명으로 무결성 검증 후에만 역직렬화

    • 허용 목록 기반 타입 검증(커스텀 Unpickler로 허용된 타입만 복원)

    • 페이로드 크기/중첩 깊이 제한, 타임아웃 등 리소스 제한

    • 역직렬화 로직을 격리된 프로세스/최소권한 컨테이너에서 실행

  • 입력 출처 검증: HTTP Content-Type, 인증/인가 확인, 예상 스키마 검사(필수 필드/타입 체크).

취약한 코드 및 안전한 코드 예시

취약한 코드

안전한 코드

설명:

  • 취약한 코드: 요청 본문을 pickle.loads로 그대로 역직렬화하면, 공격자가 만든 악성 pickle payload의 reduce 등이 실행되어 서버에서 임의 코드가 실행될 수 있습니다. 입력 검증, 포맷 제한, 무결성 검증이 전혀 없으므로 치명적입니다.

  • 안전한 코드: JSON처럼 코드 실행이 수반되지 않는 데이터 포맷으로 파싱하고, 스키마/타입/길이 검증을 수행합니다. 이렇게 하면 역직렬화 중 임의 코드가 실행될 위험이 제거되며, 예상치 못한 구조의 입력도 차단할 수 있습니다.

참조

Last updated