강좌 강좌
신뢰할 수 없는 데이터의 역직렬화: 되살리기 전에 확인이 필요한 이유
역직렬화는 저장하거나 전달하기 좋은 형태로 바꿔 둔 데이터를 프로그램이 다시 쓸 수 있는 형태로 되돌리는 작업입니다. 이 강좌는 그 되돌리는 지점에서 왜 검증이 필요한지를 하나의 가상 예시로 끝까지 따라가며 설명합니다.
이 강좌를 마치면 세 가지를 할 수 있습니다. 첫째, 직렬화와 역직렬화의 뜻을 자기 말로 설명하기. 둘째, 검증이 빠졌을 때 어떤 보안 결과가 가능하다고 알려져 있는지 공개된 범위에서 설명하기. 셋째, 공개된 취약점 정보에서 위험도 점수와 실제 악용 여부를 구분해 읽기. 사전지식은 많지 않습니다. 프로그램이 네트워크로 다른 컴퓨터와 데이터를 주고받는다는 정도면 충분합니다.
한 문장으로 이해하기
신뢰할 수 없는 데이터의 역직렬화란, 프로그램이 외부에서 받은 데이터를 적절히 검증하지 않고 살아 있는 객체나 코드 구조로 되돌리는 것을 말합니다. 여기서 객체는 프로그램이 데이터와 그에 딸린 동작을 함께 다루기 위해 쓰는 구조입니다. 직렬화는 프로그램 안의 데이터를 저장하거나 전달할 수 있는 표현으로 바꾸는 과정입니다. 역직렬화는 그 표현을 다시 프로그램이 쓸 수 있는 형태로 되돌리는 과정입니다. ‘신뢰할 수 없는’은 그 데이터를 만들어 보낸 쪽이 안전하다고 보장되지 않는다는 뜻입니다.
왜 필요한가
직렬화와 역직렬화 자체는 문제가 아닙니다. 역직렬화는 저장하거나 전달할 수 있게 바꿔 둔 표현을 프로그램이 사용할 형태로 되돌리는 작업입니다. 문제는 되돌리는 쪽에서 데이터의 출처와 내용을 충분히 확인하지 않을 때 생깁니다. 사용자가 제어할 수 있는 데이터를 적절한 검증 없이 활성 객체나 코드 구조로 되돌리면 코드 실행, 서비스 거부, 접근 통제 우회로 이어질 수 있다고 알려져 있습니다. 그래서 이 개념의 핵심은 ‘되살린다’가 아니라 ‘확인하지 않고 되살린다’에 있습니다.
어떻게 이루어지는가
- 프로그램이 외부에서 데이터 한 덩어리를 받습니다. 이 데이터는 보낸 쪽이 내용을 정할 수 있습니다.
- 프로그램이 그 데이터를 처리하기 전에 출처와 내용을 검증해야 하는데, 이 단계가 빠지거나 충분하지 않습니다.
- 프로그램이 그 데이터를 역직렬화해, 단순한 값이 아니라 활성 객체나 코드 구조로 되돌립니다.
- 이 조건이 갖춰지면 코드 실행, 서비스 거부, 접근 통제 우회 같은 결과가 가능해집니다.
하나의 예시로 따라가기
다음은 가상 예시입니다. 사내 일정 공유 프로그램이 다른 서버가 보낸 ‘일정 묶음’ 데이터를 받아 화면에 표시한다고 해 봅시다. 1단계에서 프로그램은 네트워크로 그 묶음을 받습니다. 보내는 쪽이 내용을 정하므로 이것은 신뢰할 수 없는 데이터입니다. 2단계에서 개발자가 ‘어차피 우리 쪽 서버가 보낸다’고 여겨 형식과 출처 확인을 넣지 않았다고 합시다. 3단계에서 프로그램은 받은 묶음을 곧바로 역직렬화해 일정 객체들로 되돌립니다. 4단계에서, 실제로 보낸 쪽이 우리 편이 아니었다면 이 지점은 코드 실행이나 접근 통제 우회로 이어질 수 있는 자리가 됩니다. 실제 보고에도 이 유형의 사례가 있습니다. 마이크로소프트는 클라우드 기반 신원 및 접근 관리 서비스인 Entra ID(과거 이름 Azure Active Directory)에서 이 유형의 취약점을 식별 번호 CVE-2026-69836으로 공개했습니다. 마이크로소프트의 설명에 따르면 이 취약점은 신뢰할 수 없는 데이터의 역직렬화로 인해 권한이 없는 공격자가 네트워크를 통해 코드를 실행할 수 있는 문제였습니다. 다만 위 가상 예시의 흐름이 이 사례의 실제 작동 방식과 같다고 볼 수는 없습니다. 공개 자료에는 구체적인 공격 방식에 관한 세부 정보가 제시되지 않았기 때문입니다. 마이크로소프트는 서버 측에서 완화를 마쳐 고객이 추가로 취할 조치는 없다고 밝혔습니다.
언제 쓰고 언제 쓰지 않는가
이 개념은 세 가지 조건이 함께 있을 때 적용됩니다. 사용자가 제어할 수 있는 데이터가 들어오고, 그 데이터에 대한 검증이 적절하지 않으며, 그것을 활성 객체나 코드 구조로 되돌리는 경우입니다. 이 조건들이 어디에 해당하는지 확인하는 것이 이 용어를 실제로 쓰는 방법입니다. 오해하기 쉬운 점도 짚어 둡니다. 첫째, 역직렬화를 한다는 사실만으로 취약점이 되는 것은 아닙니다. 둘째, 위험도 점수와 실제 피해는 다른 정보입니다. 앞의 사례에서 공통 취약점 등급 시스템(CVSS) 점수는 10.0으로 보도됐지만, 마이크로소프트는 처음에 이 취약점을 실제 악용된 것으로 표시했다가 2026년 8월 21일 악용되지 않음으로 정정했습니다. 셋째, 이 사례에서 마이크로소프트가 서버 측 조치를 마쳤다는 사실은 그 사례에 관한 정보이며, 여기서 더 넓은 책임 규칙을 끌어낼 수는 없습니다. 한계도 분명합니다. 공개된 자료만으로는 세부 작동 방식을 알 수 없으므로, 이 강좌는 개념과 공개 사실의 범위에서만 설명합니다.
핵심 정리와 확인문제
정리하면, 역직렬화는 정상적인 변환 작업이고, 신뢰할 수 없는 데이터를 적절히 검증하지 않고 활성 객체나 코드 구조로 되돌릴 때 보안 문제가 생길 수 있습니다.
- 다음 중 역직렬화에 해당하는 것은? (가) 프로그램 안의 데이터를 저장하거나 전달할 수 있는 표현으로 바꾸는 일 (나) 그렇게 바꾼 표현을 다시 프로그램이 쓸 수 있는 형태로 되돌리는 일
- 빈칸을 채우세요. 위험이 성립하려면 사용자가 제어할 수 있는 데이터가 들어오고, 적절한 ( )이 없으며, 그 데이터를 활성 객체나 코드 구조로 되돌린다는 조건이 함께 있어야 합니다.
- CVE-2026-69836은 마이크로소프트 공지에서 최종적으로 실제 악용된 취약점으로 표시되어 있나요?
1번 정답: (나). 해설: (가)는 직렬화입니다. 두 작업은 방향이 반대인 짝입니다.
2번 정답: 검증. 해설: 세 조건 중 하나라도 빠지면 이 용어가 가리키는 상황과 달라집니다. 위험의 핵심은 되돌린다는 사실이 아니라 확인 없이 되돌린다는 데 있습니다.
3번 정답: 아니요. 해설: 마이크로소프트는 처음에 악용됨으로 표시했다가 2026년 8월 21일 악용되지 않음으로 정정했습니다.