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