184.5. Jackson ObjectMapper
184.5.1. 오브젝트 매핑이란 무엇입니까? 링크 복사링크가 클립보드에 복사되었습니다!
jackson은 com.fasterxml.jackson.databind.ObjectMapper
클래스를 사용하여 Java 개체를 직렬화하는 메커니즘을 제공합니다. 예를 들어 다음과 같이 ObjectMapper
를 사용하여 MyClass
java 개체를 직렬화할 수 있습니다.
ObjectMapper objectMapper = new ObjectMapper(); MyClass myobject = new MyClass("foo", "bar"); objectMapper.writeValue(new File("myobject.json"), myobject);
ObjectMapper objectMapper = new ObjectMapper();
MyClass myobject = new MyClass("foo", "bar");
objectMapper.writeValue(new File("myobject.json"), myobject);
오브젝트인 myobject
는 JSON 형식으로 직렬화되고 파일에 작성되며, myobject.json
(Jackson은 XML 및 YAML 형식으로의 변환도 지원함)
파일의 JSON 콘텐츠 myobject.json
을 역직렬화하려면 다음과 같이 ObjectMapper
를 호출할 수 있습니다.
ObjectMapper objectMapper = new ObjectMapper(); MyClass myobject = objectMapper.readValue(new File("myobject.json"), MyClass.class);
ObjectMapper objectMapper = new ObjectMapper();
MyClass myobject = objectMapper.readValue(new File("myobject.json"), MyClass.class);
수신자는 클래스 유형을 사전에 알아야 하며 유형을 MyClass.class
, readValue()
에 대한 두 번째 인수로 지정해야 합니다.
184.5.2. 다형성 오브젝트 매핑이란 무엇입니까? 링크 복사링크가 클립보드에 복사되었습니다!
경우에 따라 직렬화된 오브젝트의 수신자가 오브젝트 유형을 미리 알 수 없습니다. 예를 들어, 이는 다형성 오브젝트 배열의 경우에 적용됩니다. 추상 유형, ECDHE 및 해당 하위 유형, TriECDHE ,
, so on을 고려하십시오.
다음과 같이 Mellanox (ListOfShape
)의 배열 목록을 인스턴스화하고 직렬화 할 수 있습니다.
그러나 이제 수신자 측에 문제가 있습니다. 이 유형을 readValue()
의 두 번째 인수로 지정하여 수신자에게 ListOfShape
오브젝트를 예상하도록 지시할 수 있습니다. :
MyClass myobject = objectMapper.readValue(serialized, ListOfShape.class); ObjectMapper objectMapper = new ObjectMapper();
MyClass myobject = objectMapper.readValue(serialized, ListOfShape.class);
ObjectMapper objectMapper = new ObjectMapper();
그러나, 수신자가 목록의 첫 번째 요소가 트리밍이고 두 번째 요소는 만기임을 알 수 있는 방법은 없습니다
. 이 문제를 해결하려면 다음 섹션에 설명된 대로 다형성 오브젝트 매핑 을 활성화해야 합니다.
184.5.3. 다형성 오브젝트 매핑을 활성화하는 방법 링크 복사링크가 클립보드에 복사되었습니다!
다형식 개체 매핑은 배열의 개체 유형을 식별하는 직렬화된 배열에 추가 메타데이터를 제공하여 추상 클래스의 배열을 직렬화 및 역직렬화하는 메커니즘입니다.
다형성 오브젝트 매핑은 발신자 가 인스턴스화할 클래스를 선택할 수 있도록 하기 때문에 고유의 보안 위험을 초래하며, 이는 발신자의 공격을 기반으로 형성될 수 있습니다. Red Hat의 FasterXML Jackson 라이브러리 배포에는 화이트리스트 메커니즘이 포함되어 있어 이러한 위협에 대한 추가적인 수준의 보호 기능을 제공합니다. 이러한 추가 보호 계층을 얻으려면 Red Hat의 jackson-databind 라이브러리(Fuse 버전 7.7 이상에서 제공)를 사용하고 있는지 확인해야 합니다. 자세한 내용은 184.5.5절. “다형성 직렬화로 인한 보안 위험” 에서 참조하십시오.
수신자가 배열의 개체를 역직렬화할 수 있도록 하려면 직렬화된 데이터에 형식 메타데이터를 제공해야 합니다. 기본적으로 Jackson은 직렬화된 개체에 대한 유형 메타데이터를 인코딩하지 않으므로 이 기능을 사용하려면 추가 코드를 작성해야 합니다.
다형식 오브젝트 매핑을 활성화하려면 다음 단계를 수행합니다(예: ListOfShape
사용).
목록의 요소(subclasses of the list)일 수 있는 각 클래스에 대해 다음과 같이
@JsonTypeInfo
로 클래스에 주석을 답니다.@JsonTypeInfo(use=JsonTypeInfo.Id.CLASS, include=JsonTypeInfo.As.PROPERTY) public class Triangle extends Shape { ... }
@JsonTypeInfo(use=JsonTypeInfo.Id.CLASS, include=JsonTypeInfo.As.PROPERTY) public class Triangle extends Shape { ... }
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Tri
ECDHE
클래스가 JSON 형식으로 직렬화되면 다음과 같은 형식이 있습니다.{"@class":"com.example.Triangle", "property1":"value1", "property2":"value2", ...}
{"@class":"com.example.Triangle", "property1":"value1", "property2":"value2", ...}
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 이러한 클래스를 deserialization
화이트
리스트에
추가하여 수신자를 구성해야합니다. 허용 목록을 구성하려면jackson.deserialization.whitelist.packages
시스템 속성을 쉼표로 구분된 클래스 및 패키지 목록으로 설정합니다. 예를 들어 TriECDHE 클래스의 역직렬화를 허용하려면 다음과 같이 시스템 속성을 설정합니다.For example, to allow deserialization of the TriECDHE , ECDHE classes, set the system property as follows:-Djackson.deserialization.whitelist.packages=com.example.Triangle,com.example.Square
-Djackson.deserialization.whitelist.packages=com.example.Triangle,com.example.Square
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 또는 전체
com.example
패키지를 허용하도록 system 속성을 설정할 수 있습니다.-Djackson.deserialization.whitelist.packages=com.example
-Djackson.deserialization.whitelist.packages=com.example
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 참고이 화이트리스트 메커니즘은 Red Hat의 jackson-databind 라이브러리 배포에서만 사용할 수 있습니다. 표준 jackson-databind 라이브러리는 대신 블랙리스트 메커니즘을 사용하므로 잠재적으로 위험한 새로운 가젯 클래스가 검색될 때마다 업데이트해야 합니다.
184.5.4. 다형성 직렬화에 대한 기본 매핑 링크 복사링크가 클립보드에 복사되었습니다!
지정된 Java 클래스( com.example.MyClass
)가 허용 목록에 없는 경우에도 클래스 인스턴스를 직렬화할 수 있지만 수신 측에서는 일반 기본 매핑을 사용하여 인스턴스가 역직렬화됩니다.
Jackson에서 다형성 개체 매핑을 사용하도록 설정하는 경우 개체를 인코딩하는 몇 가지 다른 방법이 있습니다.
@JsonTypeInfo(use=JsonTypeInfo.Id.CLASS, include=JsonTypeInfo.As.PROPERTY)
:{"@class":"com.example.MyClass", "property1":"value1", "property2":"value2", ...}
{"@class":"com.example.MyClass", "property1":"value1", "property2":"value2", ...}
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 이 경우 인스턴스는 속성이 있는
Object
로 역직렬화됩니다.@JsonTypeInfo(use=JsonTypeInfo.Id.CLASS, include=JsonTypeInfo.As.WRAPPER_ARRAY)
:["com.example.MyClass", {"property1":"value1", "property2":"value2", ...}]
["com.example.MyClass", {"property1":"value1", "property2":"value2", ...}]
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 이 경우 인스턴스는 두 개의 필드를 포함하는 JSON 배열로 역직렬화됩니다.
-
값이
com.example.MyClass
인문자열
-
두
개 이상의 속성이 있는 오브젝트
-
값이
@JsonTypeInfo(use=JsonTypeInfo.Id.CLASS, include=JsonTypeInfo.As.WRAPPER_OBJECT)
:{"com.example.MyClass":{"property1":"value1", "property2":"value2", ...}}
{"com.example.MyClass":{"property1":"value1", "property2":"value2", ...}}
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 이 경우 인스턴스는 단일 필드
com.example.MyClass
, 값이 두 개(또는 그 이상) 속성이 있는Object
인 JSON 맵으로 역직렬화됩니다.
184.5.5. 다형성 직렬화로 인한 보안 위험 링크 복사링크가 클립보드에 복사되었습니다!
FasterXML jackson-databind
라이브러리를 사용하여 JSON 콘텐츠를 역직렬화하여 Java 개체를 인스턴스화하는 애플리케이션은 원격 코드 실행 공격에 잠재적으로 취약합니다. 그러나 이 취약점은 자동이 아니며 적절한 완화 단계를 수행하면 방지할 수 있습니다.
최소한 공격이 이루어지기 전에 다음 사전 요구 사항을 모두 충족해야 합니다.
jackson-databind
에서 JSON 콘텐츠의 역직렬화에 대해 다형성 유형 처리를 활성화했습니다. Jackson JSON에서 다형성 유형 처리를 가능하게 하는 두 가지 다른 방법이 있습니다.-
@JsonTypeInfo
및@JsonSubTypes
주석의 조합을 사용합니다. -
ObjectMapper.enableDefaultTyping()
메서드를 호출합니다. 이 옵션은 전 세계적으로 다형성 입력을 효과적으로 가능하므로 특히 위험합니다.
-
- Java 클래스 경로에는 하나 이상의 가젯 클래스가 있습니다. 가젯 클래스는 생성자 또는 setter 메서드를 실행하는 데 중요한(필요하게 악용 가능) 작업을 수행하는 모든 클래스로 정의됩니다(비저방화 중에 호출할 수 있는 메서드).
-
Java 클래스 경로에서 하나 이상의 가젯 클래스가 아직
jackson-databind
의 현재 버전에 의해 차단되지 않았습니다. jackson-databind 라이브러리의 표준 배포를 사용하는 경우 Jackson JSON 라이브러리에서 유지 관리하는 가젯 블랙리스트는 원격 코드 실행 취약점에 대한 마지막 줄입니다. -
(Red Hat 배포 jackson-databind 라이브러리만 해당) 가젯 클래스 중 하나를 수신자의 역직렬화 화이트리스트(
jackson.deserialization.whitelist.packages
시스템 속성을 설정하여)에 명시적으로 추가합니다. 이것이 거의 불가능하기 때문에 화이트리스트 메커니즘은 기본적으로 모든 가젯 클래스에 대해 효과적인 보호를 제공합니다.