본문 바로가기

📦 신뢰할 수 없는 데이터의 역직렬화 - 실습 시뮬레이터

CWE-502: Deserialization of Untrusted Data

KISA 소프트웨어 보안약점 진단가이드(2021) · 코드오류
💡 쉽게 말하면
모르는 사람이 준 상자(직렬화 데이터)를 그대로 열면 폭탄(코드 실행)일 수 있습니다. 허용 목록만 열거나 JSON 같은 안전한 포맷을 씁니다.
✅ 학습 진행도
  • ⬜ 진단 시작
  • ⬜ 역직렬화 위험 식별
  • ⬜ 입력 필터 적용
☕ Java 코드 에디터 취약한 코드
Receiver.java 💡 역직렬화 허용 클래스를 화이트리스트로 제한하세요.
// [취약] 신뢰할 수 없는 입력을 그대로 역직렬화 → RCE 위험
ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
Object obj = ois.readObject();
💡 수정 가이드 (KISA 기준)
1. 역직렬화 필터

허용 클래스 화이트리스트 적용.

ObjectInputStream ois = new ObjectInputStream(in); ois.setObjectInputFilter(ObjectInputFilter.Config .createFilter("com.bank.dto.*;!*")); // 허용 클래스만 Object obj = ois.readObject();
📊 분석 결과 및 설명
🎯 목표

신뢰할 수 없는 데이터 역직렬화 시 허용 클래스를 제한하거나 안전한 포맷을 씁니다.

⚠️ 현재 취약점

Untrusted Deserialization

임의 객체 역직렬화로 RCE가 가능합니다.

✅ 학습 진행도
  • ⬜ 진단 시작
  • ⬜ pickle 위험 식별
  • ⬜ JSON 전환
🐍 Python 코드 에디터 취약한 코드
receiver.py 💡 pickle.loads 대신 json.loads를 사용하세요.
import pickle
# [취약] 신뢰할 수 없는 데이터를 pickle로 역직렬화 → 임의 코드 실행
obj = pickle.loads(request.body)
💡 수정 가이드 (KISA 기준)
1. 안전한 포맷

실행 위험 없는 JSON 사용.

import json # pickle 대신 데이터 전용 포맷 obj = json.loads(request.body)
📊 분석 결과 및 설명
🎯 목표

신뢰할 수 없는 입력에는 코드 실행 위험이 없는 직렬화 포맷을 사용합니다.

⚠️ 현재 취약점

Insecure Deserialization

pickle 역직렬화로 임의 코드가 실행됩니다.

📰 실제 사고사례 & 표준 매핑
2015년 Apache Commons Collections 자바 역직렬화 취약점으로 WebLogic·Jenkins 등 수많은 시스템에서 원격코드실행이 가능했습니다.
🏷️ CWE-502 OWASP A08 Software & Data Integrity
※ 공개적으로 알려진 사례 기반 교육용 요약 · CWE/OWASP는 공개 표준 분류