VYPR
Critical severityNVD Advisory· Published Feb 6, 2018· Updated Sep 17, 2024

CVE-2017-7525

CVE-2017-7525

Description

A deserialization flaw was discovered in the jackson-databind, versions before 2.6.7.1, 2.7.9.1 and 2.8.9, which could allow an unauthenticated user to perform code execution by sending the maliciously crafted input to the readValue method of the ObjectMapper.

Affected packages

Versions sourced from the GitHub Security Advisory.

PackageAffected versionsPatched versions
com.fasterxml.jackson.core:jackson-databindMaven
< 2.6.7.12.6.7.1
com.fasterxml.jackson.core:jackson-databindMaven
>= 2.7.0, < 2.7.9.12.7.9.1
com.fasterxml.jackson.core:jackson-databindMaven
>= 2.8.0, < 2.8.92.8.9

Affected products

1

Patches

7
fa87c1ddbe80

Backport #1599 in 2.6.x

https://github.com/FasterXML/jackson-databindTatu SalorantaJul 11, 2017via ghsa
4 files changed · +87 3
  • pom.xml+1 1 modified
    @@ -10,7 +10,7 @@
     
       <groupId>com.fasterxml.jackson.core</groupId>
       <artifactId>jackson-databind</artifactId>
    -  <version>2.6.8-SNAPSHOT</version>
    +  <version>2.6.7.1-SNAPSHOT</version>
       <name>jackson-databind</name>
       <packaging>bundle</packaging>
       <description>General data-binding functionality for Jackson: works on core streaming API</description>
    
  • release-notes/VERSION+2 1 modified
    @@ -4,9 +4,10 @@ Project: jackson-databind
     === Releases ===
     ------------------------------------------------------------------------
     
    -2.6.8 (if ever released)
    +2.6.7.1 (11-Jul-2017)
     
     #1383: Problem with `@JsonCreator` with 1-arg factory-method, implicit param names
    +#1599: Backport the extra safety checks for polymorphic deserialization
     
     2.6.7 (05-Jun-2016)
     
    
  • src/main/java/com/fasterxml/jackson/databind/deser/BeanDeserializerFactory.java+44 1 modified
    @@ -40,7 +40,32 @@ public class BeanDeserializerFactory
         private final static Class<?>[] INIT_CAUSE_PARAMS = new Class<?>[] { Throwable.class };
     
         private final static Class<?>[] NO_VIEWS = new Class<?>[0];
    -    
    +
    +    /**
    +     * Set of well-known "nasty classes", deserialization of which is considered dangerous
    +     * and should (and is) prevented by default.
    +     */
    +    private final static Set<String> DEFAULT_NO_DESER_CLASS_NAMES;
    +    static {
    +        Set<String> s = new HashSet<String>();
    +        // Courtesy of [https://github.com/kantega/notsoserial]:
    +        // (and wrt [databind#1599]
    +        s.add("org.apache.commons.collections.functors.InvokerTransformer");
    +        s.add("org.apache.commons.collections.functors.InstantiateTransformer");
    +        s.add("org.apache.commons.collections4.functors.InvokerTransformer");
    +        s.add("org.apache.commons.collections4.functors.InstantiateTransformer");
    +        s.add("org.codehaus.groovy.runtime.ConvertedClosure");
    +        s.add("org.codehaus.groovy.runtime.MethodClosure");
    +        s.add("org.springframework.beans.factory.ObjectFactory");
    +        s.add("com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl");
    +        DEFAULT_NO_DESER_CLASS_NAMES = Collections.unmodifiableSet(s);
    +    }
    +
    +    /**
    +     * Set of class names of types that are never to be deserialized.
    +     */
    +    private Set<String> _cfgIllegalClassNames = DEFAULT_NO_DESER_CLASS_NAMES;
    +
         /*
         /**********************************************************
         /* Life-cycle
    @@ -138,6 +163,8 @@ public JsonDeserializer<Object> createBeanDeserializer(DeserializationContext ct
             if (!isPotentialBeanType(type.getRawClass())) {
                 return null;
             }
    +        // For checks like [databind#1599]
    +        checkIllegalTypes(ctxt, type, beanDesc);
             // Use generic bean introspection to build deserializer
             return buildBeanDeserializer(ctxt, type, beanDesc);
         }
    @@ -836,4 +863,20 @@ protected boolean isIgnorableType(DeserializationConfig config, BeanDescription
             // We default to 'false', i.e. not ignorable
             return (status == null) ? false : status.booleanValue(); 
         }
    +
    +    private void checkIllegalTypes(DeserializationContext ctxt, JavaType type,
    +            BeanDescription beanDesc)
    +        throws JsonMappingException
    +    {
    +        // There are certain nasty classes that could cause problems, mostly
    +        // via default typing -- catch them here.
    +        String full = type.getRawClass().getName();
    +
    +        if (_cfgIllegalClassNames.contains(full)) {
    +            String message = String.format("Illegal type (%s) to deserialize: prevented for security reasons",
    +                    full);
    +            throw ctxt.mappingException("Invalid type definition for type %s: %s",
    +                    beanDesc, message);
    +        }
    +    }
     }
    
  • src/test/java/com/fasterxml/jackson/databind/interop/IllegalTypesCheckTest.java+40 0 added
    @@ -0,0 +1,40 @@
    +package com.fasterxml.jackson.databind.interop;
    +
    +import com.fasterxml.jackson.databind.*;
    +
    +/**
    + * Test case(s) to guard against handling of types that are illegal to handle
    + * due to security constraints.
    + */
    +public class IllegalTypesCheckTest extends BaseMapTest
    +{
    +    static class Bean1599 {
    +        public int id;
    +        public Object obj;
    +    }
    +
    +    public void testIssue1599() throws Exception
    +    {
    +        final String JSON = aposToQuotes(
    + "{'id': 124,\n"
    ++" 'obj':[ 'com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl',\n"
    ++"  {\n"
    ++"    'transletBytecodes' : [ 'AAIAZQ==' ],\n"
    ++"    'transletName' : 'a.b',\n"
    ++"    'outputProperties' : { }\n"
    ++"  }\n"
    ++" ]\n"
    ++"}"
    +        );
    +        ObjectMapper mapper = new ObjectMapper();
    +        mapper.enableDefaultTyping();
    +        try {
    +            mapper.readValue(JSON, Bean1599.class);
    +            fail("Should not pass");
    +        } catch (JsonMappingException e) {
    +            verifyException(e, "Illegal type");
    +            verifyException(e, "to deserialize");
    +            verifyException(e, "prevented for security reasons");
    +        }
    +    }
    +}
    \ No newline at end of file
    
680d75b011ed

Merge branch '2.8'

https://github.com/FasterXML/jackson-databindTatu SalorantaApr 27, 2017via ghsa
1 file changed · +1 0
  • src/main/java/com/fasterxml/jackson/databind/deser/BeanDeserializerFactory.java+1 0 modified
    @@ -55,6 +55,7 @@ public class BeanDeserializerFactory
             s.add("org.codehaus.groovy.runtime.MethodClosure");
             s.add("org.springframework.beans.factory.ObjectFactory");
             s.add("com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl");
    +        s.add("org.apache.xalan.xsltc.trax.TemplatesImpl");
             DEFAULT_NO_DESER_CLASS_NAMES = Collections.unmodifiableSet(s);
         }
     
    
90042692085d

Merge branch '2.7' into 2.8

https://github.com/FasterXML/jackson-databindTatu SalorantaApr 27, 2017via ghsa
1 file changed · +1 0
  • src/main/java/com/fasterxml/jackson/databind/deser/BeanDeserializerFactory.java+1 0 modified
    @@ -58,6 +58,7 @@ public class BeanDeserializerFactory
             s.add("org.codehaus.groovy.runtime.MethodClosure");
             s.add("org.springframework.beans.factory.ObjectFactory");
             s.add("com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl");
    +        s.add("org.apache.xalan.xsltc.trax.TemplatesImpl");
             DEFAULT_NO_DESER_CLASS_NAMES = Collections.unmodifiableSet(s);
         }
     
    
3bfbb835e530

Minor improvement wrt #1599 (also cover vanilla xalan impl)

https://github.com/FasterXML/jackson-databindTatu SalorantaApr 27, 2017via ghsa
1 file changed · +1 0
  • src/main/java/com/fasterxml/jackson/databind/deser/BeanDeserializerFactory.java+1 0 modified
    @@ -57,6 +57,7 @@ public class BeanDeserializerFactory
             s.add("org.codehaus.groovy.runtime.MethodClosure");
             s.add("org.springframework.beans.factory.ObjectFactory");
             s.add("com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl");
    +        s.add("org.apache.xalan.xsltc.trax.TemplatesImpl");
             DEFAULT_NO_DESER_CLASS_NAMES = Collections.unmodifiableSet(s);
         }
     
    
fd8dec2c7fab

Merge branch '2.8'

https://github.com/FasterXML/jackson-databindTatu SalorantaApr 13, 2017via ghsa
3 files changed · +95 0
  • release-notes/VERSION+2 0 modified
    @@ -80,6 +80,8 @@ Project: jackson-databind
     #1585: Invoke ServiceLoader.load() inside of a privileged block when loading
       modules using `ObjectMapper.findModules()`
      (contributed by Ivo S)
    +#1599: Jackson Deserializer security vulnerability
    + (reported by ayound@github)
     
     2.8.8 (05-Apr-2017)
     
    
  • src/main/java/com/fasterxml/jackson/databind/deser/BeanDeserializerFactory.java+48 0 modified
    @@ -36,6 +36,35 @@ public class BeanDeserializerFactory
          */
         private final static Class<?>[] INIT_CAUSE_PARAMS = new Class<?>[] { Throwable.class };
     
    +    /**
    +     * Set of well-known "nasty classes", deserialization of which is considered dangerous
    +     * and should (and is) prevented by default.
    +     *
    +     * @since 2.8.9
    +     */
    +    protected final static Set<String> DEFAULT_NO_DESER_CLASS_NAMES;
    +    static {
    +        Set<String> s = new HashSet<>();
    +        // Courtesy of [https://github.com/kantega/notsoserial]:
    +        // (and wrt [databind#1599]
    +        s.add("org.apache.commons.collections.functors.InvokerTransformer");
    +        s.add("org.apache.commons.collections.functors.InstantiateTransformer");
    +        s.add("org.apache.commons.collections4.functors.InvokerTransformer");
    +        s.add("org.apache.commons.collections4.functors.InstantiateTransformer");
    +        s.add("org.codehaus.groovy.runtime.ConvertedClosure");
    +        s.add("org.codehaus.groovy.runtime.MethodClosure");
    +        s.add("org.springframework.beans.factory.ObjectFactory");
    +        s.add("com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl");
    +        DEFAULT_NO_DESER_CLASS_NAMES = Collections.unmodifiableSet(s);
    +    }
    +
    +    /**
    +     * Set of class names of types that are never to be deserialized.
    +     *
    +     * @since 2.8.9
    +     */
    +    protected Set<String> _cfgIllegalClassNames = DEFAULT_NO_DESER_CLASS_NAMES;
    +
         /*
         /**********************************************************
         /* Life-cycle
    @@ -130,6 +159,8 @@ public JsonDeserializer<Object> createBeanDeserializer(DeserializationContext ct
             if (!isPotentialBeanType(type.getRawClass())) {
                 return null;
             }
    +        // For checks like [databind#1599]
    +        checkIllegalTypes(ctxt, type, beanDesc);
             // Use generic bean introspection to build deserializer
             return buildBeanDeserializer(ctxt, type, beanDesc);
         }
    @@ -901,4 +932,21 @@ protected boolean isIgnorableType(DeserializationConfig config, BeanPropertyDefi
             ignoredTypes.put(type, status);
             return status.booleanValue();
         }
    +
    +    /**
    +     * @since 2.8.9
    +     */
    +    protected void checkIllegalTypes(DeserializationContext ctxt, JavaType type,
    +            BeanDescription beanDesc)
    +        throws JsonMappingException
    +    {
    +        // There are certain nasty classes that could cause problems, mostly
    +        // via default typing -- catch them here.
    +        String full = type.getRawClass().getName();
    +
    +        if (_cfgIllegalClassNames.contains(full)) {
    +            ctxt.reportBadTypeDefinition(beanDesc,
    +                    "Illegal type (%s) to deserialize: prevented for security reasons", full);
    +        }
    +    }
     }
    
  • src/test/java/com/fasterxml/jackson/databind/interop/IllegalTypesCheckTest.java+45 0 added
    @@ -0,0 +1,45 @@
    +package com.fasterxml.jackson.databind.interop;
    +
    +import com.fasterxml.jackson.databind.*;
    +import com.fasterxml.jackson.databind.exc.InvalidDefinitionException;
    +
    +/**
    + * Test case(s) to guard against handling of types that are illegal to handle
    + * due to security constraints.
    + */
    +public class IllegalTypesCheckTest extends BaseMapTest
    +{
    +    static class Bean1599 {
    +        public int id;
    +        public Object obj;
    +    }
    +    
    +    public void testIssue1599() throws Exception
    +    {
    +        final String NASTY_CLASS = "com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl";
    +        final String JSON = aposToQuotes(
    + "{'id': 124,\n"
    ++" 'obj':[ '"+NASTY_CLASS+"',\n"
    ++"  {\n"
    ++"    'transletBytecodes' : [ 'AAIAZQ==' ],\n"
    ++"    'transletName' : 'a.b',\n"
    ++"    'outputProperties' : { }\n"
    ++"  }\n"
    ++" ]\n"
    ++"}"
    +        );
    +        ObjectMapper mapper = new ObjectMapper();
    +        mapper.enableDefaultTyping();
    +        try {
    +            mapper.readValue(JSON, Bean1599.class);
    +            fail("Should not pass");
    +        } catch (InvalidDefinitionException e) {
    +            verifyException(e, "Illegal type");
    +            verifyException(e, "to deserialize");
    +            verifyException(e, "prevented for security reasons");
    +            BeanDescription desc = e.getBeanDescription();
    +            assertNotNull(desc);
    +            assertEquals(NASTY_CLASS, desc.getBeanClass().getName());
    +        }
    +    }
    +}
    
60d459cedcf0

Fix #1599 for 2.8.9

https://github.com/FasterXML/jackson-databindTatu SalorantaApr 13, 2017via ghsa
3 files changed · +91 1
  • release-notes/VERSION+2 0 modified
    @@ -8,6 +8,8 @@ Project: jackson-databind
     #1585: Invoke ServiceLoader.load() inside of a privileged block when loading
       modules using `ObjectMapper.findModules()`
      (contributed by Ivo S)
    +#1599: Jackson Deserializer security vulnerability
    + (reported by ayound@github)
     
     2.8.8 (05-Apr-2017)
     
    
  • src/main/java/com/fasterxml/jackson/databind/deser/BeanDeserializerFactory.java+49 1 modified
    @@ -38,7 +38,36 @@ public class BeanDeserializerFactory
         private final static Class<?>[] INIT_CAUSE_PARAMS = new Class<?>[] { Throwable.class };
     
         private final static Class<?>[] NO_VIEWS = new Class<?>[0];
    -    
    +
    +    /**
    +     * Set of well-known "nasty classes", deserialization of which is considered dangerous
    +     * and should (and is) prevented by default.
    +     *
    +     * @since 2.8.9
    +     */
    +    protected final static Set<String> DEFAULT_NO_DESER_CLASS_NAMES;
    +    static {
    +        Set<String> s = new HashSet<>();
    +        // Courtesy of [https://github.com/kantega/notsoserial]:
    +        // (and wrt [databind#1599]
    +        s.add("org.apache.commons.collections.functors.InvokerTransformer");
    +        s.add("org.apache.commons.collections.functors.InstantiateTransformer");
    +        s.add("org.apache.commons.collections4.functors.InvokerTransformer");
    +        s.add("org.apache.commons.collections4.functors.InstantiateTransformer");
    +        s.add("org.codehaus.groovy.runtime.ConvertedClosure");
    +        s.add("org.codehaus.groovy.runtime.MethodClosure");
    +        s.add("org.springframework.beans.factory.ObjectFactory");
    +        s.add("com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl");
    +        DEFAULT_NO_DESER_CLASS_NAMES = Collections.unmodifiableSet(s);
    +    }
    +
    +    /**
    +     * Set of class names of types that are never to be deserialized.
    +     *
    +     * @since 2.8.9
    +     */
    +    protected Set<String> _cfgIllegalClassNames = DEFAULT_NO_DESER_CLASS_NAMES;
    +
         /*
         /**********************************************************
         /* Life-cycle
    @@ -137,6 +166,8 @@ public JsonDeserializer<Object> createBeanDeserializer(DeserializationContext ct
             if (!isPotentialBeanType(type.getRawClass())) {
                 return null;
             }
    +        // For checks like [databind#1599]
    +        checkIllegalTypes(ctxt, type, beanDesc);
             // Use generic bean introspection to build deserializer
             return buildBeanDeserializer(ctxt, type, beanDesc);
         }
    @@ -855,4 +886,21 @@ protected boolean isIgnorableType(DeserializationConfig config, BeanDescription
             ignoredTypes.put(type, status);
             return status.booleanValue();
         }
    +
    +    /**
    +     * @since 2.8.9
    +     */
    +    protected void checkIllegalTypes(DeserializationContext ctxt, JavaType type,
    +            BeanDescription beanDesc)
    +        throws JsonMappingException
    +    {
    +        // There are certain nasty classes that could cause problems, mostly
    +        // via default typing -- catch them here.
    +        String full = type.getRawClass().getName();
    +
    +        if (_cfgIllegalClassNames.contains(full)) {
    +            ctxt.reportBadTypeDefinition(beanDesc,
    +                    "Illegal type (%s) to deserialize: prevented for security reasons", full);
    +        }
    +    }
     }
    
  • src/test/java/com/fasterxml/jackson/databind/interop/IllegalTypesCheckTest.java+40 0 added
    @@ -0,0 +1,40 @@
    +package com.fasterxml.jackson.databind.interop;
    +
    +import com.fasterxml.jackson.databind.*;
    +
    +/**
    + * Test case(s) to guard against handling of types that are illegal to handle
    + * due to security constraints.
    + */
    +public class IllegalTypesCheckTest extends BaseMapTest
    +{
    +    static class Bean1599 {
    +        public int id;
    +        public Object obj;
    +    }
    +    
    +    public void testIssue1599() throws Exception
    +    {
    +        final String JSON = aposToQuotes(
    + "{'id': 124,\n"
    ++" 'obj':[ 'com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl',\n"
    ++"  {\n"
    ++"    'transletBytecodes' : [ 'AAIAZQ==' ],\n"
    ++"    'transletName' : 'a.b',\n"
    ++"    'outputProperties' : { }\n"
    ++"  }\n"
    ++" ]\n"
    ++"}"
    +        );
    +        ObjectMapper mapper = new ObjectMapper();
    +        mapper.enableDefaultTyping();
    +        try {
    +            mapper.readValue(JSON, Bean1599.class);
    +            fail("Should not pass");
    +        } catch (JsonMappingException e) {
    +            verifyException(e, "Illegal type");
    +            verifyException(e, "to deserialize");
    +            verifyException(e, "prevented for security reasons");
    +        }
    +    }
    +}
    
6ce32ffd18fa

Fix #1599 for 2.7(.10)

https://github.com/FasterXML/jackson-databindTatu SalorantaApr 13, 2017via ghsa
3 files changed · +65 0
  • release-notes/VERSION+2 0 modified
    @@ -6,6 +6,8 @@ Project: jackson-databind
     
     2.7.10 (not yet released)
     
    +#1599: Jackson Deserializer security vulnerability
    + (reported by ayound@github)
     - Minor robustification of method resolution in `AnnotatedClass`
     
     2.7.9 (04-Feb-2017)
    
  • src/main/java/com/fasterxml/jackson/databind/deser/BeanDeserializerFactory.java+23 0 modified
    @@ -139,6 +139,8 @@ public JsonDeserializer<Object> createBeanDeserializer(DeserializationContext ct
             if (!isPotentialBeanType(type.getRawClass())) {
                 return null;
             }
    +        // For checks like [databind#1599]
    +        checkIllegalTypes(ctxt, type, beanDesc);
             // Use generic bean introspection to build deserializer
             return buildBeanDeserializer(ctxt, type, beanDesc);
         }
    @@ -834,4 +836,25 @@ protected boolean isIgnorableType(DeserializationConfig config, BeanDescription
             // We default to 'false', i.e. not ignorable
             return (status == null) ? false : status.booleanValue(); 
         }
    +
    +    /**
    +     * @since 2.8.9
    +     */
    +    protected void checkIllegalTypes(DeserializationContext ctxt, JavaType type,
    +            BeanDescription beanDesc)
    +        throws JsonMappingException
    +    {
    +        // There are certain nasty classes that could cause problems, mostly
    +        // via default typing -- catch them here.
    +        Class<?> raw = type.getRawClass();
    +        String name = raw.getSimpleName();
    +
    +        if ("TemplatesImpl".equals(name)) { // [databind#1599] 
    +            if (raw.getName().startsWith("com.sun.org.apache.xalan")) {
    +                throw JsonMappingException.from(ctxt,
    +                        String.format("Illegal type (%s) to deserialize: prevented for security reasons",
    +                                name));
    +            }
    +        }
    +    }
     }
    
  • src/test/java/com/fasterxml/jackson/databind/interop/IllegalTypesCheckTest.java+40 0 added
    @@ -0,0 +1,40 @@
    +package com.fasterxml.jackson.databind.interop;
    +
    +import com.fasterxml.jackson.databind.*;
    +
    +/**
    + * Test case(s) to guard against handling of types that are illegal to handle
    + * due to security constraints.
    + */
    +public class IllegalTypesCheckTest extends BaseMapTest
    +{
    +    static class Bean1599 {
    +        public int id;
    +        public Object obj;
    +    }
    +    
    +    public void testIssue1599() throws Exception
    +    {
    +        final String JSON = aposToQuotes(
    + "{'id': 124,\n"
    ++" 'obj':[ 'com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl',\n"
    ++"  {\n"
    ++"    'transletBytecodes' : [ 'AAIAZQ==' ],\n"
    ++"    'transletName' : 'a.b',\n"
    ++"    'outputProperties' : { }\n"
    ++"  }\n"
    ++" ]\n"
    ++"}"
    +        );
    +        ObjectMapper mapper = new ObjectMapper();
    +        mapper.enableDefaultTyping();
    +        try {
    +            mapper.readValue(JSON, Bean1599.class);
    +            fail("Should not pass");
    +        } catch (JsonMappingException e) {
    +            verifyException(e, "Illegal type");
    +            verifyException(e, "to deserialize");
    +            verifyException(e, "prevented for security reasons");
    +        }
    +    }
    +}
    

Vulnerability mechanics

Generated by null/stub on May 9, 2026. Inputs: CWE entries + fix-commit diffs from this CVE's patches. Citations validated against bundle.

References

84

News mentions

0

No linked articles in our index yet.