Skip to content
KitploitKITPLOIT
HerramientasBlog
Log in
Enviar
HerramientasBlog
Enviar

¡Herramientas de Hacking, PenTest y Ciberseguridad para tu Arsenal de Seguridad!

Kitploit es un directorio de herramientas de hacking, ciberseguridad y pentesting. Descubre las últimas actualizaciones de proyectos para encontrar vulnerabilidades, analizar sistemas, automatizar pruebas y fortalecer tu seguridad.

··Feeds·Contacto·Privacidad·© 2026 Kitploit

Directorio de Herramientas

Categorías

Ver todas las categorías
Loading categories
study-struts2-s2-054_055-jackson-cve-2017-7525_cve-2017-15095 — Informe de investigación sobre las vulnerabilidades S2-045 y S2-055 de Struts2, y las vulnerabilidades CVE-2017-7525 y CVE-2017-15095 de Jackson | Kitploit
Herramientas/GitHubGitHub/secureskytechnology/study-struts2-s2-054_055-jackson-cve-2017-7525_cve-2017-15095
Análisis de VulnerabilidadesAnálisis de CódigoExplotación de Aplicaciones WebPapers e InvestigaciónAprendizaje y EducaciónArchived
GitHubsecureskytechnology/study-struts2-s2-054_055-jackson-cve-2017-7525_cve-2017-15095

study-struts2-s2-054_055-jackson-cve-2017-7525_cve-2017-15095

Informe de investigación sobre las vulnerabilidades S2-045 y S2-055 de Struts2, y las vulnerabilidades CVE-2017-7525 y CVE-2017-15095 de Jackson

Ver Repositorio
1062114hace 8 añosAún no revisado

Más Populares

Ver todos →

Descubre las herramientas más usadas por nuestra comunidad.

Explora todas las herramientas

Explora nuestra colección de herramientas

Ver todas las herramientas →
Compartir

Informe de investigación sobre las vulnerabilidades S2-054, S2-055 de Struts2 y las vulnerabilidades CVE-2017-7525, CVE-2017-15095 de Jackson

Publicamos un artículo resumido que resume los puntos clave y lo hace fácil de leer. Recomendado para quienes deseen conocer primero el panorama general o no tengan tiempo suficiente.

  • SSTtechlog 08 S2-054, S2-055 y las vulnerabilidades de jackson-databind CVE-2017-7525, CVE-2017-15095 | SST SecureSky Technology Co., Ltd.
    • https://www.securesky-tech.com/column/techlog/08.html

El 1 de diciembre de 2017 se publicó una actualización de seguridad de Struts2. Antes de la publicación, corría el rumor en la lista de correo de que las vulnerabilidades de Jackson (una popular biblioteca JSON para Java) estaban relacionadas, y el autor, que también utiliza Jackson en sistemas y herramientas internas, estaba interesado en los detalles concretos.

  • https://lists.apache.org/thread.html/ed74083f2d7187e71ee5ed644c5e45ba58d0792b515d1d1cc28bfadf@%3Cdev.struts.apache.org%3E

En cuanto al contenido realmente publicado, se corrigieron los siguientes dos problemas de seguridad. La vulnerabilidad de jackson-databind, un componente de Jackson, solo afecta a S2-055.

  • S2-055 : https://cwiki.apache.org/confluence/display/WW/S2-055
    • Esta es la corrección correspondiente a CVE-2017-7525 de jackson-databind.
    • Se ha actualizado jackson-databind a la versión 2.9.2 en las dependencias de Struts. Con esto, también se cubre CVE-2017-15095, que se menciona más adelante.
    • https://cwiki.apache.org/confluence/display/WW/Version+Notes+2.5.14.1
  • S2-054 : https://cwiki.apache.org/confluence/display/WW/S2-054
    • Esta es una corrección donde el plugin REST utilizaba una biblioteca JSON antigua llamada JSON-lib (http://json-lib.sourceforge.net/), pero se señaló un problema de DoS, por lo que se cambió a Jackson.

En el plugin REST, parece que desde antes se incluían tanto un manejador que usaba JSON-lib como uno que usaba Jackson, y el usuario podía elegir entre ellos. Se cree que el panorama completo de esta corrección es que en S2-054 se cambió el manejador predeterminado a Jackson, y además, en S2-055 se actualizó la versión anterior de Jackson a la más reciente.

Entonces, ¿qué tipo de vulnerabilidad es CVE-2017-7525? Dado que el propio autor utiliza Jackson habitualmente para procesar JSON en Java, investigó este problema durante el fin de semana del 2 y 3 de diciembre, y ese es el contenido de este artículo.


Entorno del autor utilizado para la verificación del código de muestra:

  • SO : Windows 10 Pro 64 bits
  • Java : Oracle JDK 1.8.0_92 64 bits
  • Groovy : 2.3.1

Acerca de la vulnerabilidad de jackson-databind CVE-2017-7525

En el blog de Adam Caudill se publicó una explicación de CVE-2017-7525.

  • https://adamcaudill.com/2017/10/04/exploiting-jackson-rce-cve-2017-7525/

Resumiendo en mis propias palabras, jackson-databind proporciona la función de mapear JSON a objetos Java (clase ObjectMapper). Al llamar a ObjectMapper.enableDefaultTyping(), es posible mapear usando nombres de clases incrustados de forma arbitraria en el JSON. Creo que algunos de ustedes ya habrán tenido un mal presentimiento al saber que "se puede especificar un nombre de clase desde el JSON de entrada", y precisamente ese mal presentimiento se hizo realidad con CVE-2017-7525.

Antes de entrar en la explicación de la vulnerabilidad, explicaré por qué se implementó dicha función en primer lugar.

Acerca de la función ObjectMapper.enableDefaultTyping()

Consulte el siguiente código de muestra para conocer el uso básico de la deserialización con jackson-databind. (En este artículo, se usa Groovy para los códigos de muestra de Jackson. Es conveniente poder cambiar fácilmente la versión de jackson-databind con @Grab).

  • objectmapper-demo.groovy

En el código de muestra anterior, simplemente la clave "animal" se puede mapear directamente a la clase Animal. Entonces, ¿qué pasa en el siguiente caso?```java class Zoo { Animal animal; }

abstract class Animal { String name; protected Animal() { } }

class Dog extends Animal { double barkVolume; Dog() { } }

class Cat extends Animal { boolean likesCream; int lives; Cat() { } }

En esta configuración, aparecen dos casos: el contenido de la clave "animal" puede referirse a la clase Dog o a la clase Cat. Por lo tanto, se necesita información adicional para saber con qué clase realizar el mapeo.

Para resolver esto, jackson-databind incorporó un procesamiento personalizado que permite incrustar el nombre de la clase de mapeo en el JSON.
Por ejemplo, como se muestra a continuación, el contenido de la clave "animal" se convierte en un arreglo, y el primer elemento especifica el nombre de la clase.```
{"animal":["Dog",{"name":"dog1","barkVolume":1.2}]}

Esto permite que ObjectMapper.readValue() reconozca el contenido de la clave "animal" como la clase Dog y realice el mapeo. Por supuesto, de esta manera no se puede distinguir si el contenido de la clave "animal" era originalmente un array o si contenía información de nombre de clase propia de jackson-databind. Para cambiar esto se utiliza el método ObjectMapper.enableDefaultTyping(). También existe la posibilidad de definir la anotación @JsonTypeInfo en la clase. Para más detalles, consulte la documentación de Jackson a continuación:

  • JacksonPolymorphicDeserialization
    • https://github.com/FasterXML/jackson-docs/wiki/JacksonPolymorphicDeserialization

A continuación se muestra un código de ejemplo que utiliza el método ObjectMapper.enableDefaultTyping().

  • enable-default-type-demo.groovy

Mitigación de CVE-2017-7525 mediante la lista negra de nombres de clase

Como hemos visto, proporcionando un nombre de clase seguido de sus propiedades en JSON, es posible, aunque con ciertas limitaciones, instanciar cualquier clase con cualquier propiedad. La vulnerabilidad CVE-2017-7525 explota esto, y el informe que probablemente la desencadenó es el siguiente:

  • Java Unmarshaller Security - Turning your data into code execution
    • https://github.com/mbechler/marshalsec

Se ha informado sobre el peligro de que la manipulación de nombres de clase en bibliotecas de serialización/deserialización muy utilizadas en Java, como Jackson, pueda conducir a la ejecución de código arbitrario, y se han enumerado nombres de clase concretos que son peligrosos.

No sabemos si fue en respuesta a esto, pero cronológicamente, justo después del primer commit del repositorio anterior, se creó el siguiente issue en jackson-databind y comenzó la mitigación.

  • Jackson Deserializer security vulnerability
    • https://github.com/FasterXML/jackson-databind/issues/1599

¿Cómo serían realmente los datos JSON y el código Java que explotan esta vulnerabilidad? El código de prueba de jackson-databind 2.8.9, que mitiga este issue, contiene pistas:

  • https://github.com/FasterXML/jackson-databind/blob/jackson-databind-2.8.9/src/test/java/com/fasterxml/jackson/databind/interop/IllegalTypesCheckTest.java

Basándonos en este código de prueba, hemos preparado un código de ejemplo ajustado para poder probar su funcionamiento:

  • cve-2017-7525-check.groovy
Descargar herramienta