
Demonstração prática da vulnerabilidade Log4Shell (CVE-2021-44228)
Este repositório é destinado exclusivamente a fins educacionais e de demonstração no âmbito de um trabalho de seminário relacionado à segurança. Não utilize este código em ambientes de produção ou contra sistemas sem permissão explícita. A configuração visa promover a conscientização sobre segurança e mostrar como vulnerabilidades complexas podem surgir quando recursos aparentemente inofensivos, como registro (logging), resolução de nomes e carregamento dinâmico de classes, são combinados.
O objetivo deste trabalho de seminário é proporcionar uma compreensão aprofundada da vulnerabilidade de segurança Log4Shell (CVE-2021-44228), que se tornou conhecida em dezembro de 2021 e foi classificada como uma das vulnerabilidades mais críticas dos últimos anos. O trabalho explica tanto os fundamentos teóricos quanto demonstra uma demonstração prática da vulnerabilidade.
Para ilustrar praticamente a vulnerabilidade de segurança Log4Shell, foi construído neste repositório um ambiente isolado e containerizado que reproduz todo o fluxo de ataque de forma reproduzível. A demonstração baseia-se em três componentes principais:
User-Agent da requisição HTTP, que os atacantes podem manipular para explorar a vulnerabilidade.Exploit.class). Assim como o servidor LDAP, este servidor está sob controle do atacante.Nota: Informações mais detalhadas sobre a configuração e execução da demonstração encontram-se na seção 4. Estrutura do Projeto e Configuração e 5. Demonstração do Projeto.
Log4Shell é o nome de uma vulnerabilidade crítica de segurança na biblioteca Java Log4j com a designação CVE-2021-44228. Ela permite que um atacante, com mínimo esforço, execute código arbitrário em um servidor remoto (Remote Code Execution, ou RCE).
A vulnerabilidade afeta o Log4j nas versões 2.0 a 2.14.1 e é tão grave que foi classificada com o nível de risco máximo por muitas autoridades de segurança, incluindo o BSI (Escritório Federal de Segurança da Informação da Alemanha).
Log4Shell é particularmente perigosa porque ...
A causa real reside em uma funcionalidade do Log4j que permite carregar conteúdo dinâmico em mensagens de log através dos chamados Lookups. Em combinação com JNDI (Java Naming and Directory Interface) e o protocolo LDAP (Lightweight Directory Access Protocol), isso permite carregar e executar classes Java maliciosas remotas.
A descoberta e divulgação da vulnerabilidade desencadeou uma onda de segurança mundial. Muitos sistemas tiveram que ser imediatamente corrigidos ou desligados. Posteriormente, outras vulnerabilidades relacionadas (por exemplo, CVE-2021-45046) foram descobertas, mostrando o quão profundo e perigoso o problema era.
A seguir, as tecnologias envolvidas e sua interação são explicadas em detalhes para desenvolver uma compreensão mais profunda da vulnerabilidade.
Log4j é uma biblioteca criada pela Apache para registro de eventos em aplicações Java. O registro (logging) é uma ferramenta central no desenvolvimento de software para monitorar sistemas ou analisar erros. Log4j está entre os frameworks de logging mais conhecidos e amplamente utilizados no ecossistema Java, sendo usado tanto em aplicações pequenas quanto em grandes sistemas empresariais.
Enquanto um programa é executado, ocorrem eventos como, por exemplo:
Esses eventos podem ser documentados com logs, geralmente como saída de texto no console, em arquivos ou através de protocolos de rede para servidores de log centralizados. Através de um logging adequado, é possível rastrear o que uma aplicação fez e quando fez.
O Log4j oferece uma infraestrutura flexível e altamente configurável para geração e processamento de mensagens de log. Entre as funcionalidades centrais estão:
DEBUG, INFO, WARN, ERROR), que permitem controlar o nível de detalhe do registro.Outras funcionalidades relevantes para o trabalho de seminário serão abordadas em seções posteriores, especialmente a funcionalidade de placeholders e a funcionalidade de Lookup.
import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger;
public class Example { private static final Logger logger = LogManager.getLogger();
public static void main(String[] args) {
logger.info("Starte Anwendung...");
}
}
Neste exemplo simples, uma instância de logger é criada ou recuperada, caso já exista. Em seguida, uma mensagem de log é emitida no nível `INFO`. O Log4j cuida da formatação e saída da mensagem, com base na configuração. Um exemplo de configuração poderia ser assim:```xml
<Configuration status="WARN">
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1} - %m%n"/>
</Console>
</Appenders>
<Loggers>
<Root level="info">
<AppenderRef ref="Console"/>
</Root>
</Loggers>
</Configuration>
Esta configuração define um appender que exibe mensagens de log no formato Datum Uhrzeit Log-Level Loggername - Nachricht no console. Este appender é então atribuído ao root logger, que processa todas as mensagens de log a partir do nível INFO.