본문 바로가기
tmp

직렬화(Serialization)와 역직렬화(Deserialization)

by m_.9m 2023. 1. 20.

1.마샬링의 정의

마샬링이라고도 부르는 개체 직렬화는 객체의 상태를 변환하는 과정이다. 쉽게 데이터를 메세지로 보내거나 데이터 베이스에 데이터로, 텍스트 파일로 저장할 수 있다.  데이터는 JSON, XML, Binary 형식으로 직렬화한다.

이미지 출처 https://klezvirus.github.io/Advanced-Web-Hacking/Serialisation/

 

2.마샬링(Marshalling) vs 직렬화(Serialization)

마샬링은 직렬화와 비슷한 개념으로 큰 개념인 변화하는 과정을 의미한다. 직렬화의 과정에 마샬링이 포함되며 두 개를 같은 것으로 봐도 무방하다. 직렬화는 객체가 대상이지만 마샬링은 변환 자체에 의미가 있기 때문에 서로 다른 언어간의 데이터 전송은 마샬링이라고 한다.

 

직렬화는 객체를 바이트 스트림으로 바꾸는 것, 객체에 저장된 데이터를 스트림에 쓰기 위해 연속적인 데이터로 변환시키는 것이다. 메모리의 구조에서 값의 형식은 두가지로 나뉘게 되는데 값 형식(char, int..) 과 참조 형식(0x00034322) 데이터가 있다. 값 형식 데이터는 직접 접근해서 데이터로 전송되는데 큰 무리가 없지만 참조 형식의 데이터는 메모리 주소 형식이기때문에 통신에 사용될 수 없다.

 

그래서 등장한 것이 직렬화인데, 이는 실제로 의미하는 값들을 다 끌어와 유의미한 데이터로 변조하는 작업을 직렬화라고 한다. 

 

 

3. 역직렬화(Deserialization)

역직렬화는 디스크에 저장된 데이터를 읽거나 네트워크 통신으로 받은 데이터를 메모리에 쓸 수 있도록 변환하는 것이다. 역직렬화는 사용한다고 해서 소스코드가 취약해지진 않지만 안전하지 않은 역직렬화를 구현할 시 취약한 상태가 될 수 있다. 

 

역직렬화의 기본 아이디어는 특정 조건에서 사용자가 역정렬 프로세스 중 임의의 클래스 개체를 로드하도록 강제할 수 있다는 것이다. 악용이 가능할 시 DDoS(서비스 거부)나 RCE(원격 코드 실행)까지 기대해볼 수 있다. 이를 이해하기 위해서는 가젯에 대한 이해가 필요한데, 가젯(Gadget)은 프로그램 상에서 코드 조각, 명령어 조각을 말한다. 이러한 가젯은 추가 클래스를 호출하거나 다른 코드를 실행하기 위해 추가로 결합/연결될 수 있다. 

 

역직렬화 공격의 일반 구조는 아래와 같다.

1. 사용자가 제어할 수 있는 데이터를 역직렬화 하는 애플리케이션 앤드포인트 찾기

2. 악용을 위한 가제트 찾기

3. 페이로드를 구축하기 위한 직렬 변환기 개발

4. 엔드포인트에 대해 페이로드 사용

 

역직렬화의 Exploit에 예시는 이곳을 참고한다.