해당 포스팅은 아래 포트스위거의 web-security를 기반으로 진행되었습니다.
▶ https://portswigger.net/web-security/deserialization
Serialization vs deserialization
직렬화는 객체와 같은 복잡한 데이터 구조를 순차적인 바이트 스트림으로 변환하는 과정이다. 이를 통해 데이터를 파일로 저장하거나 네트워크를 통해 전송할 수 있다.
역직렬화는 직렬화된 바이트 스트림을 원래의 객체로 복원하는 과정이다. 즉, 직렬화의 반대 과정이며, 이 과정을 통해 원래의 데이터 구조와 상태를 되찾을 수 있다.
What is insecure deserialization?
Insecure deserialization 이란 웹사이트에서 사용자가 제어할 수 있는 데이터를 역직렬화하는 것을 의미한다. 이를 통해 공격자는 직렬화된 객체를 조작하여 애플리케이션 코드에 유해한 데이터를 전달할 수 있다.
심지어 직렬화된 객체를 완전히 다른 클래스의 객체로 대체하는 것도 가능하다. 놀랍게도 웹 사이트에서 사용할 수 있는 모든 클래스의 객체는 예상했던 클래스와 상관없이 역직렬화 및 인스턴스화된다. 이러한 이유로 Insecure deserialization를 object injection 취약점이라고도 부른다.
예상치 못한 (unexpected) 클래스의 객체가 예외를 일으킬 수 있다. 그러나 이때는 이미 피해가 발생한 후일 수 있다. 많은 역직렬화 기반 공격은 역직렬화가 완료되기 전에 완료된다. 즉, 웹 사이트의 자체 기능이 악성 개체와 직접 상호 작용하지 않더라도 역직렬화 프로세스 자체가 공격을 시작할 수 있다. 이러한 이유로 로직이 강력하게 입력된 언어를 기반으로 하는 웹 사이트도 이러한 기법에 취약할 수 있다.
How do insecure deserialization vulnerabilities arise?
Insecure deserialization 취약점은 일반적으로 사용자가 제어할 수 있는 데이터를 역직렬화하는 것이 얼마나 위험한지에 대한 이해가 부족하기에 발생한다. 이상적으로는 사용자 입력이 전혀 역직렬화되지 않아야 한다.
하지만 웹 사이트 소유자는 역직렬화된 데이터에 대해 몇가지 형태의 추가 검사를 구현하기 때문에 안전하다고 생각하는 경우가 있다. 이러한 접근 방식은 모든 상황을 고려한 유효성 검사나 위생 처리를 구현하는 것이 사실상 불가능하기 때문에 비효율적인 경우가 많다. 또한 이러한 검사는 데이터가 역직렬화된 후에 데이터를 검사하는데 의존하기 때문에 근본적으로 결함이 있으며, 대부분의 공격을 막기에는 너무 늦다.
역직렬화된 객체를 신뢰할 수 있는 것으로 간주하기 때문에 취약점이 발생할 수 있다. 특히 바이너리 직렬화 형식의 언어를 사용하는 경우, 개발자는 사용자가 데이터를 효과적으로 읽거나 조작할 수 없다고 생각할 수 있다. 그러나 더 많은 노력이 필요할 뿐, 문자열 기반 형식을 악용하는 것과 마찬가지로 바이너리 직렬화된 객체를 악용하는 것도 가능하다.
또한 최신 웹 사이트에 존재하는 수 많은 종속성 때문에 발생할 수 있다. 일반적인 사이트는 여러 가지 라이브러리를 구현할 수 있으며, 각 라이브러리에는 자체적인 종속성도 있다. 이로 인해 안전하게 관리하기 어려운 방대한 양의 클래스와 메서드 풀이 생성된다. 공격자가 이러한 클래스의 인스턴스를 만들 수 있기 때문에 악성 데이터에 어떤 메서드가 호출될 수 있는지 예측하기 어렵다. 공격자가 예상치 못한 일련의 메서드 호출을 길게 연결하여 초기 소스와 전혀 관련이 없는 싱크에 데이터를 전달할 수 있는 경우 특히 그렇다. 따라서 악성 데이터의 흐름을 예측하고, 모든 잠재적 요인을 막는 것은 거의 불가능하다.
요컨대, 신뢰할 수 없는 입력을 안전하게 역직렬화하는 것은 불가능하다고 볼 수 있다.
What is the impact of insecure deserialization?
안전하지 않은 역직렬화는 공격 표면을 크게 증가시키는 진입점을 제공하기 때문에 그 영향은 매우 심각할 수 있다. 공격자가 기존 애플리케이션 코드를 유해한 방식으로 재사용할 수 있어 RCE 실행을 비롯한 수많은 취약점이 발생할 수 있다.
RCE 실행이 불가능한 경우에도 안전하지 않은 역직렬화는 권한 상승, 임의의 파일 액세스, DoS 공격으로 이어질 수 있다.
How to prevent insecure deserialization vulnerabilities
일반적으로 사용자 입력의 역직렬화는 꼭 필요한 경우가 아니라면 피해야 한다. 역직렬화로 인해 발생할 수 있는 악용의 심각성과 이를 방지하는 데 따르는 어려움은 많은 경우 이점을 상회한다.
신뢰할 수 없는 데이터를 역직렬화해야 하는 경우, 데이터가 변조되지 않았는지 확인하기 위한 강력한 조치를 취해야 한다. 예를 들어, 데이터의 무결성을 확인하기 위해 디지털 서명을 구현할 수도 있다. 그러나 모든 검사는 역직렬화 프로세스를 시작하기 전에 이루어져야 한다는 점을 기억해야 한다. 그렇지 않으면 소용이 없다.
가능하면 일반적인 역직렬화 기능은 아얘 사용하지 않는 것이 좋다. 이러한 메서드에서 직렬화된 데이터에는 민감한 정보를 포함할 가능성이 있는 비공개 필드를 포함하여 원본 객체의 모든 속성이 포함된다. 대신, 최소한 어떤 필드가 노출되는지 제어할 수 있도록 클래스 별 직렬화 메서드를 직접 만들 수 있다.
...