반응형

**Insecure Deserialization(취약한 역직렬화)**란
애플리케이션이 **신뢰할 수 없는 데이터(입력값)**를 그대로 역직렬화(deserialize)할 때 발생하는 취약점이야.
즉, 공격자가 조작한 직렬화 데이터를 서버가 풀어 읽으면서 임의 코드 실행, 권한 상승, 데이터 변조 등이 일어날 수 있어.


🔍 직렬화 / 역직렬화란?

✔ 직렬화(Serialization)

데이터(객체)를 파일·네트워크 전송용으로 문자열/바이트 형태로 변환하는 과정

✔ 역직렬화(Deserialization)

직렬화된 데이터를 다시 객체로 복원하는 과정

문제는…
역직렬화 시 데이터가 신뢰할 수 없는 출처라면, 공격자가 악의적인 객체를 넣을 수 있다는 것!


⚠ Insecure Deserialization은 왜 위험해?

서버는 역직렬화를 할 때 객체 내부의 함수나 생성자, 메소드 호출을 자동으로 실행할 때가 많아.
이 틈을 이용해 공격자는 다음을 할 수 있어:

🔥 가능한 공격

  • RCE(Remote Code Execution)
    → 서버에서 명령어 실행
  • 권한 상승
  • 데이터 변조/삭제
  • 세션 탈취
  • Dos 공격 (무거운 객체를 통해 서버 자원 고갈)

🧨 공격 예시 (개념)

서버가 쿠키를 직렬화된 객체로 저장한다고 가정하자:

 
eyJ1c2VyTmFtZSI6ICJpc2FrIn0= # 정상 base64 데이터

공격자는 객체 구조를 알고 있다면 이렇게 바꿀 수 있음:

 
악성 payload 를 담은 직렬화 데이터(base64)

서버가 이것을 그대로 역직렬화하면
→ 공격자의 악성 객체 안 메소드가 자동 실행될 수 있음
→ 결과적으로 서버에서 명령이 실행되기도 함.

특히 Java의 Serializable,
PHP의 unserialize(),
Python pickle,
Ruby Marshal.load,
.NET BinaryFormatter 등이 취약한 대표적 사례.


🛡 방어 방법

✔ 1) 역직렬화 대상은 반드시 신뢰된 데이터만

  • 사용자 입력값을 절대 역직렬화하지 않기

✔ 2) 직렬화를 JSON, JWT 등 안전한 포맷으로 변경

  • 객체 기반 직렬화 사용하지 않기

✔ 3) 허용된 클래스만 역직렬화

  • “화이트리스트” 기반

✔ 4) 역직렬화 전에 입력값 검증

  • 크기 제한
  • 비정상 패턴 필터링

✔ 5) 라이브러리 취약점 패치

  • Java Commons Collections, Jackson 등의 취약점 패치 중요

✔ 6) WAF 정책 적용

  • 직렬화 Payload(예: Java gadget chain signatures) 차단
반응형

+ Recent posts