들어가며
직렬화는 안전하지 않다. 신뢰할 수 없는 스트림을 역직렬화하면 원격 코드 실행, 서비스 거부 등의 공격으로 이어질 수 있기 때문이다. 역직렬화 과정에서 호출되어 잠재적으로 위험한 동작을 수행하는 메소드를 가젯이라 하는데 이런 가젯을 여러개 사용하는것을 가젯 체인이라한다. 가젯 체인을 이용해 하드웨어의 네이티브 코드를 호출해 마음대로 실행하는 공격이 가능할 뿐 더러, 역직렬화에 시간이 오래 걸리는 짧은 스트림을 역직렬화 하여 서비스 거부 공격에 쉽게 노출될 수 있다.
가장 좋은 해결책은 역직렬화를 하지 않는 것이다. 역직렬화보다 좋은 객체와 바이트 시퀀스를 변환하는 매커니즘이 많다. JSON이나 프로토콜 버퍼 같은 것들이다. JSON은 텍스트 기반이고 프로토콜 버퍼는 이진 표현 기반이다.
레거시 시스템때문에 역직렬화를 포기할 수 없다면 차선책은 신뢰할 수 없는 스트림은 역직렬화하지 않는 것이다. 자바9 에서 추가된 역직렬화 필터링을 이용할 수 있다. 특히 화이트리스트 방식은 화이트리스트에 기록된 안전하다고 알려진 클래스들만 수용하기 때문에 차선책으로 쓸만하다. 하지만 직렬화 폭탄같은 공격에는 취약하다.