안전하지않은 역직렬화 (Insecure Deserialization)

정보보안학
한 줄 정의: 신뢰할 수 없는 출처의 직렬화된 데이터를 검증 없이 객체로 복원하는 과정에서 임의 코드 실행 등의 공격이 발생할 수 있는 취약점입니다.

쉽게 풀면

직렬화는 프로그램 안의 데이터를 저장하거나 전송하기 좋은 형태로 포장하는 것이고, 역직렬화는 그 포장을 풀어 원래의 데이터 형태로 되돌리는 과정입니다. 안전하지 않은 역직렬화는 마치 발신자를 확인하지 않고 낯선 소포를 그대로 뜯어서 안의 내용물이 시키는 대로 행동하는 것과 같습니다. 공격자가 조작한 직렬화 데이터를 서버가 아무 의심 없이 복원하는 순간, 그 안에 숨겨진 악성 명령이 실행될 수 있습니다.

왜 중요한가

안전하지 않은 역직렬화는 원격 코드 실행으로 이어질 수 있는 심각도가 높은 취약점이기 때문에 웹 애플리케이션 보안의 주요 위협 목록에서도 꾸준히 다뤄지는 주제입니다. 다양한 프로그래밍 언어와 프레임워크에서 반복적으로 발견되어 범용적인 방어 기법 연구의 필요성이 큽니다.

논문에서는 이렇게 쓰입니다

"해당 애플리케이션은 사용자가 전달한 직렬화 객체를 서명 검증 없이 역직렬화하여, 공격자가 임의 코드를 실행할 수 있는 취약점이 확인되었다."

검증 없는 역직렬화가 원격 코드 실행으로 이어지는 구조를 설명하는 문장입니다.

"본 연구는 역직렬화 과정에서 호출되는 클래스와 메서드를 화이트리스트 방식으로 제한하여 공격 표면을 줄이는 방어 기법을 제안한다."

역직렬화 대상을 제한하는 방어 기법 연구를 소개하는 문장입니다.

조금 더 깊게 보면

공격자는 대상 애플리케이션이 사용하는 라이브러리 안에 존재하는, 역직렬화 과정에서 자동으로 호출되는 특정 메서드 체인(가젯 체인)을 악용해 임의 코드 실행에 도달하는 경우가 많습니다. 이 때문에 단순히 입력값을 필터링하는 것만으로는 막기 어렵고, 역직렬화 대상 클래스를 명시적으로 제한하거나 서명 검증을 추가하는 방식이 주요 대응책으로 제시됩니다.

주의할 점

역직렬화 자체가 위험한 것이 아니라, 신뢰할 수 없는 출처에서 온 데이터를 검증 없이 역직렬화하는 것이 문제이므로, 데이터의 출처와 무결성 검증 여부를 함께 살펴야 합니다.

관련 용어