ObjectInputFilter — 역직렬화 중 클래스·배열 길이·그래프 지표 필터링

ObjectInputFilter — 역직렬화 중 클래스·배열 길이·그래프 지표 필터링

ObjectInputFilter는 역직렬화 중 클래스, 배열 길이, 그래프 지표(metric)를 필터링하는 함수형 인터페이스예요. 역직렬화 취약점으로부터 보호하기 위해 각 구성 요소나 라이브러리가 역직렬화할 수 있는 객체를 명확히 설명하고, 각 컨텍스트와 사용 사례에 적절한 필터를 구성하고 적용하는 것이 중요해요.

출처: Java API Reference

본문

경고: 신뢰할 수 없는 데이터의 역직렬화는 본질적으로 위험하며 피해야 해요. 신뢰할 수 없는 데이터는 Java SE 보안 코딩 지침의 "Serialization and Deserialization" 절에 따라 주의 깊게 검증해야 해요. Serialization Filtering은 방어적인 직렬화 필터 사용에 대한 모범 사례를 설명해요.

역직렬화 필터링의 구성 요소는 필터, 복합 필터(composite filter), 필터 팩토리예요. 각 필터는 클래스와 자원 제한에 대한 검사를 수행해 거부(rejected), 허용(allowed), 미결정(undecided) 상태를 결정해요. 필터는 다른 필터로 구성될 수 있고 그 결과를 병합하거나 결합할 수 있어요. 필터 팩토리는 각 ObjectInputStream의 필터를 설정하고 갱신하는 역할을 담당해요.

메서드

  • Status checkInput(FilterInfo filterInfo) — 주어진 FilterInfo로 역직렬화 검사를 수행하고 Status(ALLOWED, REJECTED, UNDECIDED)를 반환해요. 객체를 읽는 동안 0번 이상 호출되며, 클래스, 각 배열의 길이, 스트림에서 읽는 객체 수, 그래프의 깊이 등을 검증해요.

Status 상수

  • Status.ALLOWED — 역직렬화가 허용됨을 나타내요.
  • Status.REJECTED — 역직렬화가 거부됨을 나타내요.
  • Status.UNDECIDED — 결정되지 않았음을 나타내요.

정적 팩토리

  • ObjectInputFilter allowFilter(Predicate<Class<?>> predicate, Status otherStatus) — 클래스 술어에 따라 클래스를 허용하는 필터를 만들어요.
  • ObjectInputFilter rejectFilter(Predicate<Class<?>> predicate, Status otherStatus) — 클래스 술어에 따라 클래스를 거부하는 필터를 만들어요.
  • ObjectInputFilter Config.createFilter(String pattern) — 패턴 문자열로 필터를 만들어요.
  • ObjectInputFilter Config.rejectUndecidedClass(ObjectInputFilter filter) — 미결정인 클래스를 거부하도록 필터를 감싸요.

필터는 패턴 문자열에서 만들거나, 클래스에 대한 술어를 기반으로 클래스를 허용·거부하도록 만들 수 있어요. ObjectInputStream.setObjectInputFilter로 각 스트림에 적용할 수 있어요.

더 알아보기 (Learn more)