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

  • 직렬화의 장점이 단점을 넘어선다 생각했기에 자바에 도입했지만, 경험상 그 반대였다.

    • 샌프란시스코 교통국 (SFMTA) 랜섬웨어 공격사례

  • ObjectInputStream의 readObject 메서드를 호출하면 객체 그래프 역직렬화로 거의 모든 타입의 객체를 만들어 낼수 있다. 즉, 모든 타입들이 공격 범위에 들어간다.

  • 신중하게 제작된 바이트 스트림만 역직렬화 해야한다.

잘못된 serialize 사례

  • 루트 HashSet을에 담긴 두원소는 각각 다른 HashSet 2개씩을 원소로 갖는다.

  • 루트 HashSet을 역직렬화 하려면, hashCode 메서드를 2^100 만큼 호출해야한다.

static byte[] bomb() {
    Set<Object> root = new HashSet<>();
    Set<Object> s1 = root;
    Set<Object> s2 = new HashSet<>();
    for (int i = 0; i < 100; i++) {
        Set<Object> t1 = new HashSet<>();
        Set<Object> t2 = new HashSet<>();
        t1.add("foo"); // Make t1 unequal to t2
        s1.add(t1); s1.add(t2);
        s2.add(t1); s2.add(t2);
        s1 = t1;
        s2 = t2;
    }
    return serialize(root); // Method omitted for brevity
}

해결법

  • cross-platform structured-data representation

  • 속성-값 쌍 집합으로 구성된 객체 사용

    • 예를들어, JSON 또는 protobuf

  • 주의

    • 레거시 시스템을 위해 직렬화를 해야될때는 신뢰할 수 없는 데이터는 절대 역직렬화를 하지 말자.

    • 만약 직렬화를 해야될지 확신이 안선다면, java.io.ObjectInputFilter 사용

      • 역직렬화 전 필터 설치

      • 하지만, 앞서 본 직렬화 bomb 은 해결 못한다

Last updated