이야기박스

Effective java 3/E - 직렬화 (item 85~90) 본문

Programming Language/JAVA

Effective java 3/E - 직렬화 (item 85~90)

박스님 2019. 1. 16. 15:29
반응형

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

보안에 매우 취약함

자바 직렬화란?

- 자바 직렬화란 자바 시스템 내부에서 사용되는 객체 또는 데이터를 외부의 자바 시스템에서도 사용할 수 있도록 바이트(byte) 형태로 데이터 변환하는 기술과 바이트로 변환된 데이터를 다시 객체로 변환하는 기술(역직렬화)을 아울러서 이야기합니다.

- 시스템적으로 이야기하자면 JVM(Java Virtual Machine 이하 JVM)의 메모리에 상주(힙 또는 스택)되어 있는 객체 데이터를 바이트 형태로 변환하는 기술과 직렬화된 바이트 형태의 데이터를 객체로 변환해서 JVM으로 상주시키는 형태를 같이 이야기합니다.


- 참고 -


< 폭탄을 만드는 코드 >

역직렬화를 하는순간 컴퓨터는 폭팔할 예정

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");
t2.add("boo");

s1.add(t1);
s1.add(t2);

s2.add(t1);
s2.add(t2);

s1 = t1;
s2 = t2;
}

return serialize(root);
}

static byte[] serialize(Set<Object> set) {
byte[] result = new byte[set.size()];

Iterator<Object> iterator = set.iterator();
for (int i = 0; i < set.size(); i++) {
result[i] = Byte.parseByte((String) iterator.next());
}

return result;
}

15:54 INFO  chapter12.item85.SerializableBomb - now : 0, root : [[boo], [foo]]

15:55 INFO  chapter12.item85.SerializableBomb - now : 1, root : [[boo, [boo], [foo]], [[boo], foo, [foo]]]

15:56 INFO  chapter12.item85.SerializableBomb - now : 2, root : [[boo, [boo, [boo], [foo]], [[boo], foo, [foo]]], [[boo, [boo], [foo]], foo, [[boo], foo, [foo]]]]


" 직렬화 위험을 회피하는 가장 좋은 방법은 아무것도 역직렬화하지 않는 것이다. "

" 승리하는 유일한 길은 정쟁하지 않는 것이다"

==> 자바 직렬화를 써야하는 어떠한 이유도 없다



Cross-Platform Structured-Data Representation 사용할 것

- json, protocol buffer, avro, etc...

신뢰할 수 없는 데이터는 절대로 역 직렬화를 하지 말 것
굳이 해야한다면 필터링을 설치할  것 --> 블랙리스트 or 화이트리스트 방식으로 필터링 함

저자의 추천, 화이트리스트 --> 새로운 잠재위험이 들어오면 블랙리스트는 걸러주지 못함

* 화이트리스트 생성 도구 --> SWAT (Serial Whitelist Application Trainer)

자바 직렬화를 아직 쓰고 있다면, 크로스 플랫폼으로 마이그레이션 진지하게 고려해 볼 것


반응형