티스토리 뷰

반응형

직렬화

  • java.io.Serializable 인터페이스를 상속받은 객체를 외부의 자바 시스템에서도 사용할 수 있도록 byte 형태로 데이터를 변환하는 기술
  • 직렬화의 문제는 공격범위가 너무 넓고 지속적으로 더 넓어져 방어하기 어렵다는 점 (객체를 역직렬화할 수 있어서 공격에 위험함)
    • 역직렬화 : 직렬화와 반대로 byte로 변환된 데이터를 객체로 변환하는 기술
  • 자바의 표준 라이브러리, 서드파티 라이브러리, 애플리케이션 자신의 클래스들 모두 공격범위에 포함된다.

 

 

가젯

  • 보안 전문가들이 찾은 자바 라이브러리와 서드파티 라이브러리에서 직렬화 가능 타입들을 연구하여 역직렬화 과정에서 호출되어 잠재적으로 위험한 동작을 수행하는 메서드들
  • 여러 가젯을 사용하여 네이티브 코드를 마음대로 실행하는 공격을 하기도 함 → 아주 신중하게 만든 바이트 스트림만 역직렬화해야함

 

 

역직렬화 폭탄

  • 가젯까지 갈 것도 없이 역직렬화에 시간이 오래 걸리는 짧은 스트림을 역직렬화하는 것만으로도 서비스 거부 공격에 쉽게 노출될 수 있고, 이런 스트림을 역직렬화 폭탄이라고 한다.
  • 직렬화 위험을 회피하는 가장 좋은 방법은 아무것도 역직렬화하지 않는 것
  • 작성하려는 새로운 시스템에서 자바 직렬화를 써야하는 이유는 전혀 없음
    • 레거시 시스템때문에 써야한다면 신뢰할 수 없는 데이터는 절대 역직렬화하지 않는 것이 차선책

 

 

크로스-플랫폼 구조화된 데이터 표현

  • 객체와 바이트 시퀀스를 변환해주면서 자바 직렬화의 여러 위험을 피하는 메커니즘
  • 자바 직렬화보다 간단하고 임의 객체 그래프를 자동으로 직렬화/역직렬화 하지 않음 → 속성-값 쌍 집합으로 구성된 데이터 객체 사용

1) JSON

  • 브라우저와 서버의 통신용으로 설계
  • 언어 중립적이지만 자바 스크립트용으로 만들어졌음
  • 텍스트 기반이라 사람이 읽을 수 있음

2) 프로토콜 버퍼

  • 서버 사이에 데이터를 교환/저장하기 위해 설계
  • C++용으로 만들어졌음
  • 이진 표현이라 효율이 훨씬 높음

 

 

객체 역직렬화 필터링

  • 자바9에 추가된 java.io.ObjectInputFilter를 사용하자.
  • 데이터 스트림이 역직렬화되기 전에 필터를 설치하는 것으로, 특정 클래스를 수용/거부할 수 있음
  • 블랙리스트 방식(잠재적으로 위험한 클래스 거부)보다는 화이트리스트 방식(안전하다고 알려진 클래스들만 수용)을 추천
  • 메모리의 과한 사용과 객체 그래프가 너무 깊어지는 것은 막을 수 있으나, 직렬화 폭탄은 막지 못함

 

 

결론

  • 직렬화는 위험하니 피하라. → JSON이나 프로토콜 버퍼 같은 대안 사용
  • 신뢰할 수 없는 데이터는 역직렬화하지 말자.
  • 레거시 시스템때문에 자바 직렬화를 사용해야한다면 객체 역직렬화 필터링을 사용하자, 그치만 이것도 모든 공격을 막을 순 없음
  • 클래스가 직렬화를 지원하도록 만들지 말고 꼭 그래야한다면 정말 신경써서 작성하라.
반응형
댓글
반응형
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday