Skip to main content

Configuração Java: como evitar falhas de segurança por configuração incorreta

Escrito por
Java engineering

26 de fevereiro de 2021

0 minutos de leitura

A configuração Java está em toda parte. Com tantos frameworks de aplicação no ecossistema Java, é fácil deixar de lado uma configuração adequada. No entanto, pensar na configuração Java também é importante para evitar problemas de segurança causados por configurações incorretas. A configuração incorreta de segurança faz parte da famosa lista das 10 principais vulnerabilidades da OWASP e ocupa uma posição de destaque: o 6º lugar.

Configurar incorretamente sua aplicação Java pode levar a problemas de segurança. Em primeiro lugar, as configurações padrão podem ser convenientes, pois fazem uma biblioteca ou um framework funcionar imediatamente. Ainda assim, elas nem sempre são as mais seguras: podem revelar informações úteis para depuração, mas também interessantes para invasores.

Problemas de configuração Java

Um dos exemplos mais conhecidos é a configuração incorreta dos parsers XML em Java. No

guia de 10 práticas recomendadas de segurança em Java, já falamos sobre a possibilidade de ataques XXE causados por configurações incorretas. Também expliquei neste vídeo no YouTube que a configuração padrão do Java para todos os parsers XML é vulnerável. Basta aplicar a configuração correta e desabilitar entidades externas para evitar possíveis ataques XXE.

Outro exemplo é configurar corretamente o tratamento de erros em Java. Por mais bem escrita que seja sua aplicação Web Java, uma exceção acaba surgindo. Se uma exceção não for capturada — e, portanto, não for tratada, como pode acontecer em uma aplicação JSP —, o comportamento padrão será exibir a exceção e o rastreamento da pilha no navegador.

Isso não só revela que você está usando Java, mas também qual pacote interno está utilizando. Em muitos casos, essas exceções podem incluir informações específicas, como IDs. Nada disso é útil para o usuário e ainda prejudica a experiência dele. Mais importante: essas informações podem ser valiosas para pessoas mal-intencionadas que usam sua aplicação.

Ao configurar páginas de erro, como mostrado abaixo, você redireciona o usuário com base em um código de resposta ou no tipo de exceção, sem exibir informações internas.

<error-page>
   <error-code>401</error-code>
   <location>/ErrorPage401.jsp</location>
</error-page>

<error-page>
   <exception-type>java.lang.Throwable</exception-type>
   <location>/ErrorPage.jsp</location>
</error-page>

Problemas de configuração em bibliotecas e frameworks Java

Usar bibliotecas Java e pacotes de terceiros para cuidar de parte do trabalho é uma ótima abordagem. No entanto, configurar essas ferramentas corretamente é essencial para sua estratégia de segurança. Felizmente, a maioria dos responsáveis pelas bibliotecas garante que os valores padrão sejam seguros. Alterá-los pode parecer conveniente, mas causar muitos problemas.

Veja, por exemplo, o Jackson, uma biblioteca conhecida e muito usada para converter JSON em POJOs e vice-versa. Se você configurar incorretamente a biblioteca Jackson e permitir a “tipagem padrão”, poderá desserializar objetos arbitrários disponíveis no classpath. Isso pode levar a vulnerabilidades de desserialização semelhantes às que existiam na serialização nativa do Java.

Felizmente, esse recurso vem desabilitado por padrão, o que torna bem menos provável que ocorra um problema de desserialização com execução de código, por exemplo. No entanto, se você alterar essa configuração na sua aplicação Java e habilitar o recurso, poderá introduzir riscos de segurança indesejados. 

Problemas de configuração do Spring

O Spring Framework é o framework de desenvolvimento de aplicações Java mais popular. Seu principal recurso é a injeção de dependências ou a inversão de controle.

O Spring Boot é, basicamente, uma extensão do Spring Framework. Ele permite criar aplicações independentes com configurações mínimas ou nenhuma configuração. O Spring Boot oferece vários componentes iniciais que adicionam recursos simplesmente importando a dependência correta.

Spring Boot Actuator

Ao adicionar a dependência spring-boot-starter-actuator ao seu manifesto, o Spring Boot Actuator disponibiliza vários endpoints úteis para quem mantém e desenvolve aplicações.

Considere, por exemplo, o endpoint env, que mostra propriedades do ambiente, como o conteúdo do classpath; os beans (todos os beans do Spring na aplicação); o endpoint threaddump e o endpoint shutdown. Consulte a documentação para ver a lista completa.

Por padrão, todos esses endpoints estão habilitados, mas, felizmente, nem todos ficam expostos via HTTP. Ainda assim, é fácil configurar esses endpoints padrão e habilitá-los para Web ou JMX. Também é fácil desativá-los ao preparar a aplicação para produção. A linha a seguir nas propriedades expõe todos os endpoints (exceto o endpoint shutdown) na Web:

management.endpoints.web.exposure.include=*

Em produção, habilite e exponha apenas os endpoints de que você realmente precisa. De preferência, bloqueie todos, exceto alguns, em vez de fazer o contrário.

management.endpoints.enabled-by-default=false
management.endpoint.info.enabled=true
management.endpoints.jmx.exposure.include=health,info
management.endpoints.web.exposure.include=env,beans

Além disso, configure corretamente o spring-security para garantir que somente sistemas e pessoas autorizados tenham acesso aos endpoints.

Ferramentas para desenvolvedores do Spring Boot

Como o nome sugere, esse componente do Spring Boot oferece um conjunto adicional de ferramentas que ajuda durante o desenvolvimento e facilita um pouco a experiência de criação de aplicações. Recursos como reinicializações automáticas, depuração remota e atualização remota tornam esse conjunto extremamente útil durante o desenvolvimento.

De acordo com a documentação do Spring, este é o comportamento padrão: "As ferramentas para desenvolvedores são desabilitadas automaticamente quando uma aplicação totalmente empacotada está em execução. Se a aplicação for iniciada com java -jar ou com um classloader especial, ela será considerada uma “aplicação de produção”.

No entanto, você pode substituir o comportamento padrão seguro definindo a propriedade `spring.devtools.restart.enabled`.

Conclusão

De modo geral, devemos ter em mente que configurar sua aplicação Java é tão importante quanto escrever o próprio código. Ao usar frameworks e bibliotecas, você precisa conhecer as configurações padrão e saber se determinadas alterações têm implicações de segurança.

Revelar informações demais, mantendo o registro de depuração ou habilitando endpoints e recursos destinados ao desenvolvimento, prejudica sua aplicação e sua empresa.

Isso vale tanto para frameworks de aplicação e bibliotecas quanto para as configurações do seu servidor Web. Lembre-se: revelar informações pode não parecer prejudicial à primeira vista, mas, quando combinadas, todas essas informações podem dar a um invasor os recursos necessários para agir de forma potencialmente maliciosa.

Usar bibliotecas, frameworks e até servidores de aplicação é muito útil, mas você precisa entender como eles funcionam. A configuração Java e as configurações incorretas são assuntos sérios. Tome cuidado para não dar acesso à sua aplicação por acidente porque deixou de definir uma propriedade específica na configuração.

Leia mais

blog feature ai lilac
Blog

Transforme seu backlog de vulnerabilidades em pull requests com remediação agentiva

O Evo Remediation Agent está em Open Preview e traz a resolução automatizada de dependências para o Evo Agentic AppSec. Agora, as equipes de AppSec podem executar campanhas contínuas de remediação

AI Background min crop
Blog

A IA está acionando todos os riscos que você aceitou: sete insights do painel de segurança de IA sem filtros

A IA está tornando os ataques mais baratos e rápidos, expondo riscos que as organizações já carregam. Quatro líderes de segurança explicam por que a defesa na velocidade das máquinas e a correção mais rápida são essenciais.

blog feature snyk container custom base recommendations
Blog

Conheça o Evo Agentic AppSec: segurança que acompanha o ritmo do desenvolvimento com IA

O desenvolvimento impulsionado por IA está ultrapassando os fluxos de trabalho tradicionais de segurança. O Agentic AppSec da Snyk usa agentes de segurança para encontrar, corrigir e verificar vulnerabilidades continuamente, enquanto as pessoas definem os critérios.