Configuração Java: como evitar falhas de segurança por configuração incorreta
26 de fevereiro de 2021
0 minutos de leituraA 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.
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:
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.
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.



