85. 자바 직렬화의 대안을 찾으라

신명철·2022년 6월 10일
0

Effective Java

목록 보기
80/80

직렬화는 안전하지 않다. 신뢰할 수 없는 스트림을 역직렬화하면 원격 코드 실행, 서비스 거부 등의 공격으로 이어질 수 있다. 역직렬화 과정에서 호출되어서 위험한 동작을 수행하도록 하는 메서드를 가젯이라고 하는데 이런 가젯을 여러개 사용하는 것을 가젯 체인이라고 한다. 가젯 체인을 이용해 HW의 네이티브 코드를 호출해 마음대로 사용하는 공격이 가능할 뿐더러, 역직렬화에 시간이 오래 걸리는 짧은 스트림을 역직렬화하여 서비스 거부 공격에 쉽게 노출될 수 있다.

가장 좋은 해결책은 역직렬화를 하지 않는 것이다. 역직렬화보다 좋은 객체와 바이트 시퀀스를 변환하는 매커니즘이 많다. JSON이나 프로토콜 버퍼 같은 것들이다. JSON은 텍스트 기반이고 프로토콜 버퍼는 이진 표현 기반이다.

레거시 시스템때문에 역직렬화를 포기할 수 없다면 차선책은 신뢰할 수 없는 스트림은 역직렬화하지 않는 것이다. 자바9 에서 추가된 역직렬화 필터링을 이용할 수 있다. 특히 화이트리스트 방식은 화이트리스트에 기록된 안전하다고 알려진 클래스들만 수용하기 때문에 차선책으로 쓸만하다. 하지만 직렬화 폭탄같은 공격에는 취약하다.

profile
내 머릿속 지우개

0개의 댓글