Skip to content

Commit 35f262f

Browse files
tigerlily-hejenkins
authored and
jenkins
committed
util-jackson: Block unsafe polymorphic base type deserialization
Problem: Jackson ObjectMapper can suffer from CVEs that exploit the permissive nature of class-name-based polymorphic deserialization. This is a concern if JSON is accepted by untrusted clients and polymorphic handling is enabled. The two ways of enabling polymorphic handling are `enableDefaultTyping()` and annotating properties with `@JsonTypeInfo`. Solution: Util-Jackson's ScalaObjectMapper is not at risk for this type of CVE because default typing is not enabled by default. Out of security precaution, enable BLOCK_UNSAFE_POLYMORPHIC_BASE_TYPES in ScalaObjectMapper. Result: Turning on this mapper feature blocks the use of a set of "unsafe" base types. Even if `enableDefaultTyping` is configured on a custom ScalaObjectMapper, the mapper will be protected from this CVE. JIRA Issues: CSL-11410 Differential Revision: https://phabricator.twitter.biz/D780863
1 parent f2758b4 commit 35f262f

File tree

2 files changed

+24
-9
lines changed

2 files changed

+24
-9
lines changed

CHANGELOG.rst

+4
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,10 @@ Runtime Behavior Changes
1212

1313
* util-cache: Update Caffeine cache library to version 2.9.2 ``PHAB_ID=D771893``
1414

15+
* util-jackson: Enable `BLOCK_UNSAFE_POLYMORPHIC_BASE_TYPES` in ScalaObjectMapper to
16+
guard against Remote Code Execution (RCE) security vulnerability. This blocks
17+
polymorphic deserialization from unsafe base types. ``PHAB_ID=D780863``
18+
1519
21.10.0
1620
-------
1721

util-jackson/src/main/scala/com/twitter/util/jackson/ScalaObjectMapper.scala

+20-9
Original file line numberDiff line numberDiff line change
@@ -3,21 +3,27 @@ package com.twitter.util.jackson
33
import com.fasterxml.jackson.annotation.JsonInclude
44
import com.fasterxml.jackson.annotation.JsonInclude.Include
55
import com.fasterxml.jackson.core.json.JsonWriteFeature
6-
import com.fasterxml.jackson.core.util.{DefaultIndenter, DefaultPrettyPrinter}
7-
import com.fasterxml.jackson.core.{JsonFactory, JsonFactoryBuilder, JsonParser, TSFBuilder}
6+
import com.fasterxml.jackson.core.util.DefaultIndenter
7+
import com.fasterxml.jackson.core.util.DefaultPrettyPrinter
8+
import com.fasterxml.jackson.core.JsonFactory
9+
import com.fasterxml.jackson.core.JsonFactoryBuilder
10+
import com.fasterxml.jackson.core.JsonParser
11+
import com.fasterxml.jackson.core.TSFBuilder
812
import com.fasterxml.jackson.databind.util.ByteBufferBackedInputStream
913
import com.fasterxml.jackson.databind.{ObjectMapper => JacksonObjectMapper, _}
10-
import com.fasterxml.jackson.dataformat.yaml.{YAMLFactory, YAMLFactoryBuilder}
14+
import com.fasterxml.jackson.dataformat.yaml.YAMLFactory
15+
import com.fasterxml.jackson.dataformat.yaml.YAMLFactoryBuilder
1116
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule
12-
import com.fasterxml.jackson.module.scala.{
13-
DefaultScalaModule,
14-
ScalaObjectMapper => JacksonScalaObjectMapper
15-
}
17+
import com.fasterxml.jackson.module.scala.DefaultScalaModule
18+
import com.fasterxml.jackson.module.scala.{ScalaObjectMapper => JacksonScalaObjectMapper}
1619
import com.twitter.io.Buf
1720
import com.twitter.util.jackson.caseclass.CaseClassJacksonModule
18-
import com.twitter.util.jackson.serde.{DefaultSerdeModule, LongKeyDeserializers}
21+
import com.twitter.util.jackson.serde.DefaultSerdeModule
22+
import com.twitter.util.jackson.serde.LongKeyDeserializers
1923
import com.twitter.util.validation.ScalaValidator
20-
import java.io.{ByteArrayOutputStream, InputStream, OutputStream}
24+
import java.io.ByteArrayOutputStream
25+
import java.io.InputStream
26+
import java.io.OutputStream
2127
import java.nio.ByteBuffer
2228

2329
object ScalaObjectMapper {
@@ -392,6 +398,11 @@ object ScalaObjectMapper {
392398
this.additionalMapperConfigurationFns.foreach(_(underlying))
393399

394400
underlying.setPropertyNamingStrategy(this.propertyNamingStrategy)
401+
// Block use of a set of "unsafe" base types such as java.lang.Object
402+
// to prevent exploitation of Remote Code Execution (RCE) vulnerability
403+
// This line can be removed when this feature is enabled by default in Jackson 3
404+
underlying.enable(MapperFeature.BLOCK_UNSAFE_POLYMORPHIC_BASE_TYPES)
405+
395406
this.jacksonModules.foreach(underlying.registerModule)
396407

397408
underlying

0 commit comments

Comments
 (0)