Spring 4 Shell (CVE-2022-22965)
Nos últimos dias uma nova vulnerabilidade Zero-Day foi descoberta no Framework Java Spring.
A vulnerabilidade foi nomeada Spring4Shell, ela permite RCE (Remote Code Execution) nas aplicações sem a necessidade de estar autenticado.
O Spring Framework é uma aplicação muito popular a qual permite que os desenvolvedores criem de forma fácil e rápida aplicações Java com recursos de nível enterprise.
Segundo o blog oficial da Spring:
A vulnerabilidade impacta o Spring MVC e aplicações Spring WebFlux rodando sobre JDK 9+.
Para a exploração específica é necessário que a aplicação esteja executando o Tomcat como uma implantação WAR.
Caso a aplicação utilize um JAR executável do Spring Boot, o padrão, ele não estará vulnerável ao exploit.
No entanto o blog ressalta que pode haver outras maneiras de explorá-la.
Como saber se está vulnerável?
Abaixo estão os requisitos citados no relatório:
- A aplicação deve estar executando no JDK 9 ou superior
- O Apache Tomcat está como o contêiner Servlet.
- Empacotado como um WAR tradicional e implantado em uma instância independente do Tomcat. As implantações típicas do
- Spring Boot usando um contêiner de Servlet Embedded ou um Reactive Web Server não são afetadas.
- Dependência spring-webmvc ou spring-webflux.
- Spring Framework nas versões 5.3.0 a 5.3.17, 5.2.0 a 5.2.19 ou versões mais antigas.
CVEs
Segundo a empresa Check Point, estão ocorrendo diversas tentativas de exploração contra as seguintes vulnerabilidades entre seus clientes nos EUA e na Europa:
- CVE-2022-22947– official VMware post
- CVE-2022-22963 – official Spring project post
- CVE-2022-22965 – official Spring project post
POC
Para validarmos a POC vamos usar o script em Python do Github Spring4Shell-POC em uma imagem docker vulnerável.
Primeiramente vamos baixar o código completo do GitHub.
$ sudo git clone https://github.com/BobTheShoplifter/Spring4Shell-POC.git
Logo após acessamos a pasta.
$ cd Spring4Shell-POC
Então instalamos os requisitos
$ sudo pip3 install -r requirements.txt
Agora podemos testar o script em Python
$ python3 poc.py
Com o script em Python já podemos testar se o alvo é vulnerável ao ataque, mas iremos agora criar a imagem vulnerável.
Vamos seguir o exemplo de uma aplicação Tomcat vulnerável disponibilizada no próprio repositório.
Pré-requisitos
- Java
- Java JDK
- Maven
Na minha máquina já tinha o Java instalado, precisei somente instalar o Maven.
Para instalar o Maven no Kali basta seguir os comandos abaixo, o mesmo processo vale para o Ubuntu:
$ sudo apt-get update
$sudo apt-get -y install maven
Após instalarmos o Maven basta digitar a sequência de comandos abaixo.
$ cd spring-war
$ mvn clean package
$ cd target
$ mv spring-form.war ../../ # Linux move the war file to vunerable-tomcat
$ move spring-form.war ../../ # Windows
$ cd ../../
Enfim para iniciarmos a máquina vulnerável:
$ docker build -t vulnerable-tomcat .
$ docker run -it --rm -p 8888:8080 vulnerable-tomcat
Basta aguardarmos 20 segundos para testarmos o script Python na máquina criada.
Rodamos o comando
$ python3 poc.py --url http://localhost:8888/spring-form/greeting
Recebemos a resposta que o alvo está vulnerável e o endereço para a Shell.
Ao acessarmos temos o RCE
Rodamos mais um comando com pwd e recebemos a resposta
Agora que exploramos e obtivemos o RCE, vamos entender como se proteger seguindo as diretrizes da Spring.
Como se proteger do Spring4Shell?
A forma mais fácil de se proteger é fazendo o update que contém as correções do Spring Framework, as versões 5.3.18 e 5.2.20 foram lançados.
Também foram lançados o Spring Boot 2.6.6 e 2.5.12 que dependem do Spring Framework 5.3.18.
CVE-2022-22965 foi publicado.
O Apache Tomcat lançou as versões 10.0.20, 9.0.62 e 8.5.78 que protegem o vetor de ataque do lado do Tomcat, veja a mitigação alternativa do Spring Framework RCE.
Soluções alternativas sugeridas
A melhor opção é atualizar para Spring Framework 5.3.18 e 5.2.20 ou superior.
Se você fizer isso, nenhuma solução alternativa será necessária.
No entanto, as vezes a atualização não é possível fazer rapidamente. Por esse motivo, existem algumas soluções alternativas abaixo.
Atualizando o Tomcat
Para as versões mais antigas e não suportadas do Spring Framework, você deve atualizar para o Apache Tomcat 10.0.20, 9.0.62 ou 8.5.78 que já fornecem uma proteção adequada.
Fazendo downgrade para Java 8
Outra alternativa é fazer downgrade para Java 8, caso você não puder atualizar o Spring Framework nem atualizar o Apache Tomcat.
Disallowed Fields (campos não permitidos)
Outra solução viável é desabilitar o vínculo a campos específicos definindo disallowedFields em WebDataBinder globalmente. Para ver mais detalhes pode acessar diretamente o site do Spring
Como pudemos perceber, a vulnerabilidade é crítica e de fácil exploração, é necessário que as providências na parte de segurança sejam feitas o mais breve possível para evitar a exploração por terceiros mal intencionados.
0 comentários: