Forjamento de log da JVM
1. Visão geral
Neste artigo rápido, vamos explorar um dos problemas de segurança mais comuns no mundo deJVM - Log Forging. Também mostraremos uma técnica de exemplo que pode nos proteger dessa preocupação com a segurança.
2. O que é log forjamento?
De acordo comOWASP, o forjamento de log é uma das técnicas de ataque mais comuns.
As vulnerabilidades de falsificação de log ocorrem quando os dados entram em um aplicativo de uma fonte não confiável ou os dados são gravados em um arquivo de log do aplicativo / sistema por alguma entidade externa.
De acordo comOWASP guidelines, falsificação ou injeção de log é uma técnica de gravar entrada de usuário não validada em arquivos de log para permitir que um invasor falsifique entradas de log ou injete conteúdo malicioso nos logs.
Simplificando, ao forjar o log, um invasor tenta adicionar / modificar o conteúdo do registro explorando brechas de segurança no aplicativo.
3. Exemplo
Considere um exemplo em que um usuário envia uma solicitação de pagamento da web. No nível do aplicativo, depois que essa solicitação for processada, uma entrada será registrada com a quantidade:
private final Logger logger
= LoggerFactory.getLogger(LogForgingDemo.class);
public void addLog( String amount ) {
logger.info( "Amount credited = {}" , amount );
}
public static void main( String[] args ) {
LogForgingDemo demo = new LogForgingDemo();
demo.addLog( "300" );
}
Se olharmos para o console, veremos algo assim:
web - 2017-04-12 17:45:29,978 [main]
INFO com.example.logforging.LogForgingDemo - Amount credited = 300
Agora, suponha que um invasor forneça a entrada como“ web – 2017-04-12 17:47:08,957 [main] INFO Amount reversed successfully”,, então o log será:
web - 2017-04-12 17:52:14,124 [main] INFO com.example.logforging.
LogForgingDemo - Amount credited = 300
web - 2017-04-12 17:47:08,957 [main] INFO Amount reversed successfully
Intencionalmente, o invasor conseguiu criar uma entrada forjada no log do aplicativo que corrompeu o valor dos logs e confundiu qualquer atividade do tipo de auditoria no futuro. Essa é a essência do forjamento de log.
4. Prevenção
A solução mais óbvia é não gravar nenhuma entrada do usuário nos arquivos de log.
Porém, isso pode não ser possível em todas as circunstâncias, pois os dados fornecidos pelo usuário são necessários para depurar ou auditar a atividade do aplicativo no futuro.
Temos que usar outra alternativa para lidar com esse tipo de cenário.
4.1. Introduzir validação
Uma das soluções mais fáceis é sempre validar a entrada antes do log. Um problema com essa abordagem é que teremos que validar muitos dados em tempo de execução, o que afetará o desempenho geral do sistema.
Além disso, se a validação falhar, os dados não serão registrados e serão perdidos para sempre, o que geralmente não é um cenário aceitável.
4.2. Registro de banco de dados
Outra opção é registrar os dados no banco de dados. Isso é mais seguro do que a outra abordagem, pois‘ ' ou nova linha não significa nada para este contexto. No entanto, isso gerará outra preocupação de desempenho, pois um grande número de conexões com o banco de dados será usado para registrar dados do usuário.
Além do mais, esta técnica apresenta outra vulnerabilidade de segurança - a saberSQL Injection. Para resolver isso, podemos acabar escrevendo muitas linhas de código extras.
4.3. ESAPI
UsarESAPI é a técnica mais compartilhada e aconselhável de acordo com este contexto. Aqui, todos os dados do usuário são codificados antes de serem gravados nos logs. ESAPI é uma API de código aberto disponível emOWASP:
org.owasp.esapi
esapi
2.1.0.1
Ele está disponível emCentral Maven Repository.
Podemos codificar os dados usando a interfaceESAPI'sEncoder:
public String encode(String message) {
message = message.replace( '\n' , '_' ).replace( '\r' , '_' )
.replace( '\t' , '_' );
message = ESAPI.encoder().encodeForHTML( message );
return message;
}
Aqui, criamos um método de invólucro que substitui todos os retornos de carro e feeds de linha por sublinhados e codifica a mensagem modificada.
No exemplo anterior, se codificarmos a mensagem usando esta função de invólucro, o log deverá se parecer com isso:
web - 2017-04-12 18:15:58,528 [main] INFO com.example.logforging.
LogForgingDemo - Amount credited = 300
__web - 2017-04-12 17:47:08,957 [main] INFO Amount reversed successfully
Aqui, o fragmento de string corrompido é codificado e pode ser facilmente identificado.
Um ponto importante a ser observado é que para usarESAPI, precisamos incluir o arquivoESAPI.properties no classpath, caso contrário, a APIESAPI lançará uma exceção em tempo de execução. Está disponívelhere.
5. Conclusão
Neste tutorial rápido, aprendemos sobre o forjamento de log e as técnicas para superar essa preocupação de segurança.
Como sempre, o código-fonte completo está disponível emover on GitHub.