Analisando o heapdump do Spring Boot Actuator

Analisando o heapdump do Spring Boot Actuator

O que é o actuator ?

O actuator é uma biblioteca do Spring Boot que fornece ferramentas para os desenvolvedores monitorarem o estado da aplicação. Ao instalar o actuator no Spring Boot, várias rotas são adicionadas ao projeto em "/actuator/{route}". Algumas dessas rotas informam se a aplicação está funcionando corretamente, e outras mostram as variáveis de ambientes utilizadas para configurar a aplicação, etc...

Quais rotas do actuator podem ser prejudiciais?

O actuator expõe dados confidenciais em alguma de suas rotas. A rota "/actuator/env" mostra todas as variáveis de ambiente do usuário que iniciou a aplicação. Agora, imagine o seguinte cenário: Um usuário definiu o IP, usuário e senha de uma banco de dados nas variáveis de ambiente, o que aconteceria se um atacante acessasse a rota "/actuator/env"? Ele obteria as credenciais para entrar no banco de dados e comprometer todos os dados registrados.

Para prevenir que essas situações aconteçam, o actuator não exibe conteúdos que contém algumas palavras chaves como: secret, password, secret_key.

Quando acessamos a rota "env", vemos que o conteúdo é ocultado:

Veja que a variável "DB_USER" é exibida, pois não contém nenhuma palavra chave para o actuator ocultar seu conteúdo, já a variável "DB_PASSWORD" teve seu conteúdo ocultado.

Acredito que essa proteção é muito superficial, e que não devemos habilitar essa rota em uma aplicação que está em produção, pois caso contenha alguma variável de ambiente com um conteúdo "confidencial" que não possua nenhuma palavra chave, o actuator não vai oculta-la.

Outra rota extremamente prejudicial é a rota "/actuator/heapdump" em que conseguimos fazer o download do "heapdump". Com o heapdump conseguimos fazer um "bypass" na proteção do actuator, conseguindo ler todas as variáveis de ambiente, incluindo as varíaveis que estão "ocultas".

O que é o heapdump ?

O heapdump é um arquivo que faz o dump da memória quando a aplicação spring é iniciada. Para conseguirmos visualizar o conteúdo desse arquivo e analisarmos o heapdump, podemos utilizar algumas ferramentas, mas não será algo simples como um "cat", pois esse arquivo é um binário.

Analisando heapdump

Para analisar o heapdump, estarei utilizando o VisualVM.

Para carregar o heapdump no VisualVM, siga os passos da imagem abaixo:

Após clicar em "Load...", selecione o heapdump.

Para analisarmos o heapdump, utilizaremos o OQL Console para executarmos OQL queries. Siga os passos da imagem abaixo:

Clicando em OQL Console, vemos que abriu um console para executarmos OQL queries. Executando a seguinte query, conseguimos extrair todas as variáveis de ambiente contidas no heapdump: select s from java.lang.String s where s.toString().contains("java:comp/env/"):

Ao executar a query, veremos uma resposta parecida com esta:

Anote o número contido no resultado, pois precisaremos dele nos próximos passos.

Clicando com o botão direito sobre o resultado, vemos as seguintes opções:

Selecionando a opção "Open Class in New Tab" seremos redirecionados para uma nova aba onde podemos ler as variáveis de ambiente. Nessa aba, precisamos "expandir" as strings retornadas clicando no botão demonstrado na imagem abaixo:

Agora veremos diversas instancias. Precisamos expandir a que corresponde com o número que anotamos nas etapas anteriores que era 10242:

Veja que a seta vermelha está apontando para uma instancia que contém as strings 10000 até 11000, então essa é a instancia que devemos analisar.

Expandindo a instancia, conseguimos encontrar as variáveis de ambiente entre as strings:

E depois de algumas strings abaixo, encontramos os seus valores:

Conclusão

Com essa análise, conseguimos fazer um "bypass" na proteção do actuator de ocultar o conteúdo das variáveis de ambiente. Então caso você utilize o actuator em uma de suas aplicações, verifique se as rotas estão configuradas corretamente, pois o correto é expor apenas as rotas necessárias para o funcionamento da nossa aplicação. Caso você deixe exposto o "/actuator/env" ou o "/actuator/heapdump", estará correndo um risco de expor dados sigilosos.

Referências:

Analyzing Java Heap Dumps via OQL queries
Java heap dumps contain sensitive data like Environment files, Passwords, Secret keys. This head dump is exposed by the Spring boot…
spring-boot/heapdump.adoc at main · spring-projects/spring-boot
Spring Boot. Contribute to spring-projects/spring-boot development by creating an account on GitHub.

heapdump utilizando no artigo:

Onde praticar Hacking ?

O Hacking Club é uma plataforma de treinamento em cybersecurity, que permite você aprender hacking de forma totalmente prática.

Temos mais de 50 ambientes com vulnerabilidades reais com write-ups para você treinar e aprender hacking. Semanalmente lançamos máquinas gratuitas para você praticar e se desafiar no hacking!

No Hacking Club, você pode invadir um cenário onde o actuator é utilizado, assim colocando em prática todo o conteúdo ensinado neste artigo!