Skip to content
KitploitKITPLOIT
FerramentasExploitsBlog
Log in
Enviar
FerramentasExploitsBlog
Enviar

Ferramentas de Hacking, PenTest e Cibersegurança para o seu Arsenal de Segurança!

Kitploit é um diretório de ferramentas de hacking, cibersegurança e pentesting. Descubra as últimas atualizações de projetos para encontrar vulnerabilidades, analisar sistemas, automatizar testes e fortalecer sua segurança.

··Feeds·Contato·Privacidade·© 2026 Kitploit

Diretório de Ferramentas

Categorias

Ver todas as categorias
Loading categories
study-struts2-s2-054_055-jackson-cve-2017-7525_cve-2017-15095 — Relatório de investigação sobre as vulnerabilidades S2-045, S2-055 do Struts2 e as vulnerabilidades CVE-2017-7525, CVE-2017-15095 do Jackson | Kitploit
Ferramentas/GitHubGitHub/secureskytechnology/study-struts2-s2-054_055-jackson-cve-2017-7525_cve-2017-15095
Análise de VulnerabilidadesAnálise de CódigoExploração de Aplicações WebPapers e PesquisaAprendizado e EducaçãoArchived
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

Relatório de investigação sobre as vulnerabilidades S2-045, S2-055 do Struts2 e as vulnerabilidades CVE-2017-7525, CVE-2017-15095 do Jackson

Ver Repositório
1062114há 8 anosAinda não revisado

Mais Populares

Ver todos →

Descubra as ferramentas mais usadas pela nossa comunidade.

Explore todas as ferramentas

Navegue pela nossa coleção de ferramentas

Ver todas as ferramentas →
Compartilhar

Relatório de investigação sobre as vulnerabilidades S2-054, S2-055 do Struts2 e as vulnerabilidades CVE-2017-7525, CVE-2017-15095 do Jackson

Publicamos um resumo simplificado e de fácil leitura. Recomendado para quem deseja uma visão geral ou tem pouco tempo.

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

Em 1º de dezembro de 2017, foi publicada uma atualização de segurança do Struts2. Antes da publicação, já circulava na lista de discussão a informação de que as vulnerabilidades do Jackson (biblioteca JSON popular em Java) estavam relacionadas. O autor, que utiliza Jackson em sistemas e ferramentas internas, também estava preocupado com o conteúdo específico.

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

Quanto ao conteúdo realmente divulgado, os dois problemas de segurança a seguir foram corrigidos. A vulnerabilidade do jackson-databind, componente do Jackson, afeta apenas o S2-055.

  • S2-055 : https://cwiki.apache.org/confluence/display/WW/S2-055
    • Esta é a correção correspondente ao CVE-2017-7525 do jackson-databind.
    • A dependência do Struts foi atualizada para jackson-databind 2.9.2. Com isso, também é compatível com o CVE-2017-15095 mencionado posteriormente.
    • 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 correção substitui o uso da antiga biblioteca JSON-lib (http://json-lib.sourceforge.net/) no plugin REST, que apresentava problemas de DoS, pela biblioteca Jackson.

No plugin REST, parece que anteriormente já estavam integrados handlers que usavam JSON-lib e handlers que usavam Jackson, permitindo que o usuário escolhesse. Acredita-se que a correção completa desta vez consiste em: no S2-054, alterar o handler padrão para Jackson e, no S2-055, atualizar a versão antiga do Jackson para a mais recente.

Afinal, que tipo de vulnerabilidade é o CVE-2017-7525? Como o autor costuma usar Jackson ao processar JSON em Java, este artigo é o resultado de uma investigação sobre o problema durante o fim de semana de 2 e 3 de dezembro.


Ambiente do autor utilizado para verificação do código de amostra:

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

Sobre a vulnerabilidade do jackson-databind CVE-2017-7525

No blog de Adam Caudill, foi publicada uma explicação sobre o CVE-2017-7525.

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

Em resumo, com minhas próprias palavras: o jackson-databind fornece a funcionalidade de mapear JSON para objetos Java (classe ObjectMapper). Ao chamar ObjectMapper.enableDefaultTyping(), é possível mapear usando um nome de classe inserido de forma personalizada no JSON. Quem pensou "quando é possível especificar o nome da classe a partir do JSON de entrada, já dá um mau pressentimento" acertou em cheio: esse mau pressentimento se concretizou no CVE-2017-7525.

Antes de entrar na explicação da vulnerabilidade, explico por que essa funcionalidade foi implementada.

Sobre a funcionalidade ObjectMapper.enableDefaultTyping()

Consulte o código de amostra a seguir para o uso básico da desserialização com jackson-databind. (Neste artigo, usamos Groovy para os códigos de amostra do Jackson. É conveniente poder alternar facilmente a versão do jackson-databind com @Grab.)

  • objectmapper-demo.groovy

No código de amostra acima, a chave "animal" pode ser mapeada diretamente para a classe Animal. E nos casos a seguir, como fica?```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() { } }

Nesta configuração, surgem dois tipos de conteúdo para a chave "animal": um apontando para a classe Dog e outro para a classe Cat. Portanto, são necessárias informações adicionais para saber qual classe deve ser usada no mapeamento.

Para resolver isso, o jackson-databind incorporou um processamento próprio que permite embutir o nome da classe a ser mapeada no JSON.
Por exemplo, como mostrado a seguir, o conteúdo da chave "animal" é transformado em um array, e o primeiro elemento especifica o nome da classe.```
{"animal":["Dog",{"name":"dog1","barkVolume":1.2}]}

Isso permite que ObjectMapper.readValue() reconheça o conteúdo da chave "animal" como da classe Dog e realize o mapeamento.

Naturalmente, não é possível distinguir, apenas com isso, se o conteúdo da chave "animal" era originalmente um array ou se continha informações de nome de classe específicas do jackson-databind.

Quem faz essa alternância é o método ObjectMapper.enableDefaultTyping().

Também existe a possibilidade de definir a anotação @JsonTypeInfo na classe. Para mais detalhes, consulte a documentação do Jackson abaixo:

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

A seguir, apresentamos um código de exemplo que realmente utiliza o método ObjectMapper.enableDefaultTyping():

  • enable-default-type-demo.groovy

Correlação do CVE-2017-7525 com a verificação da lista negra de nomes de classe

Como vimos acima, ao fornecer o nome da classe e suas propriedades em JSON, é possível, embora com algumas limitações, instanciar classes arbitrárias com propriedades arbitrárias.

A vulnerabilidade CVE-2017-7525 explora exatamente isso, e acredita-se que o gatilho tenha sido o seguinte relatório:

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

Bibliotecas de serialização/desserialização comuns em Java, como Jackson, foram relatadas como perigosas, pois manipulações de nomes de classe podem levar à execução de código arbitrário. Além disso, foram listados nomes de classes concretas que representam risco.

Não se sabe se foi em resposta a isso, mas cronologicamente, logo após o primeiro commit do repositório acima, foi aberta a seguinte Issue no jackson-databind e iniciou-se o tratamento:

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

Como seriam, na prática, os dados JSON e o código Java que exploram essa vulnerabilidade?

O código de teste do jackson-databind 2.8.9, que tratou essa Issue, fornece uma dica:

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

Com base nesse código de teste, apresentamos a seguir um exemplo de código ajustado para permitir verificação de funcionamento:

  • cve-2017-7525-check.groovy

Se você executar especificando a versão 2.8.9 com @Grab, será exibido your jackson version IS SAFE to CVE-2017-7525. Isso ocorre porque a correção da versão 2.8.9 adicionou uma verificação de lista negra para nomes de classes que são instanciadas.

Baixar ferramenta