Skip to main content

Perigo à vista: demonstração ao vivo de como funciona um exploit do Log4Shell

Escrito por

Sarah Wills

feature log4j vulnerability webinar

25 de janeiro de 2022

0 minutos de leitura

A vulnerabilidade Log4Shell pegou a comunidade Java de surpresa no fim de 2021, e muitas organizações ainda estão mitigando seus impactos. Para ajudar as equipes de desenvolvimento a acompanhar a situação, a Snyk criou e continua atualizando seu centro de recursos sobre a vulnerabilidade Log4j.

Durante uma recente demonstração ao vivo do Stranger Danger, Simon Maple, CTO de campo da Snyk, Eric Smalling, defensor sênior de desenvolvedores da Snyk, e Micah Silverman, diretor de aceleração de DevSecOps, conversaram sobre a vulnerabilidade Log4Shell e demonstraram como um exploit poderia funcionar.

Log4Shell: resumo rápido

Log4Shell é uma vulnerabilidade crítica, muito disseminada e fácil de explorar no framework de logging Log4j2 para Java. Ela afetou um grande número de aplicações Java, já que o Log4j2 é usado com frequência em muitas outras bibliotecas de código aberto.

“Como mostra o fato de que essa vulnerabilidade ficou adormecida aqui desde 2013, às vezes temos efeitos colaterais inesperados”, disse Micah. “Isso faz parte da natureza dos projetos de código aberto.”

Para corrigir essa vulnerabilidade, os desenvolvedores precisam identificar onde suas aplicações usam a biblioteca Log4j2 — como dependência direta ou indireta — e atualizá-la para a versão 2.17.1. Isso não só mitiga a vulnerabilidade Log4Shell, como também uma vulnerabilidade adicional de negação de serviço, divulgada pouco tempo depois.

Quer saber mais? Preparamos um guia completo de correção do Log4Shell.

Anatomia do Log4Shell

Em 2013, foi adicionada à biblioteca Log4j a possibilidade de usar referências à Java Naming Directory Interface (JNDI) por meio de strings interpoladas em mensagens de log. Strings interpoladas podem conter variáveis, chamadas de função ou outras expressões resolvíveis. O problema é que a JNDI pode buscar URLs nessas strings, disparando uma chamada de rede para um endpoint malicioso.

Diagrama intitulado “Log4Shell em poucas palavras”, que mostra um aplicativo Java vulnerável, uma consulta JNDI, servidores LDAP e HTTP e a desserialização de uma classe maliciosa.

Além disso, um servidor LDAP não autorizado pode responder à solicitação JNDI com uma referência maliciosa a uma classe Java remota ou a outro código indesejado. Essa classe pode então ser desserializada, mesmo que não esteja no classpath da aplicação, resultando em um ataque de execução remota de código (RCE).

Demonstração de exploit do Log4Shell

Na demonstração ao vivo, usaremos um exemplo de exploit do Log4Shell (disponível no GitHub) que criamos em Java e executaremos em um servidor Tomcat. Quando inserimos uma senha incorreta na página de login, a aplicação informa que nossos dados serão registrados em log.

Tela de login da Acme Corp com campos de nome de usuário e senha, botão de login e link “Esqueceu a senha?”.

“É comum registrar em log as atividades nos frameworks Java e na sua aplicação quando ocorrem erros ou exceções, ou até mesmo durante uma transação normal”, explicou Simon. “Isso ajuda você a entender os diferentes fluxos e como as pessoas usam seu site.”

Ao analisar o código da aplicação, vemos que, quando um nome de usuário está incorreto, usamos o Log4j para registrar esse nome em log. Situações como essa, em que os usuários podem inserir dados que depois são registrados em log, são a forma mais comum de explorar a vulnerabilidade Log4Shell.

O IntelliJ IDEA exibe um servlet de login Java com código de registro vulnerável do Log4j e logs de implantação do Apache Tomcat.

Por exemplo, podemos usar o campo de login para injetar uma string maliciosa e preparar um ataque de RCE. Mas, primeiro, vamos analisar nosso script de exploit em Python. O mais importante sobre esse script é que ele gera uma classe Java que cria um novo socket ao ser inicializada e, em seguida, se conecta ao nosso próprio servidor.

Código Java verde em fundo preto mostrando uma classe Exploit que abre um socket e executa um processo de shell.

“Na prática, isso fará parte de um proxy remoto que vamos configurar”, explicou Simon. “A classe ficará em um loop contínuo, recebendo, executando e enviando comandos de volta para o serviço ao qual estamos conectados.”

Vamos criar e compilar o arquivo Java no nosso servidor malicioso e disponibilizá-lo por meio de um serviço HTTP. Depois, criaremos um servidor LDAP que enviará uma string para que a JNDI da aplicação-alvo busque nossa classe Java maliciosa.

Depois de configurar os servidores LDAP e HTTP, estaremos quase prontos para executar o exploit. Para executar a parte de “shell” do Log4Shell, também vamos configurar um servidor proxy reverso usando o netcat, um utilitário de rede. O proxy reverso permite executar comandos remotamente no servidor Tomcat, deixando a aplicação e o servidor vulneráveis a novos ataques.

Executamos o exploit inserindo nossa string maliciosa no campo de login da página da aplicação-alvo. Quando o Log4j registra essa string em log, a biblioteca também tenta resolvê-la. Isso faz com que a aplicação use o serviço JNDI para acessar o servidor LDAP, obter a referência à nossa classe Java maliciosa no servidor HTTP e executá-la localmente. Em seguida, essa classe Java se conecta ao netcat, criando nosso proxy reverso.

Como mitigar o Log4Shell com a Snyk

Como já mencionamos, a melhor forma de mitigar o Log4Shell é identificar e atualizar todas as instâncias do Log4j nas dependências diretas e indiretas. O Snyk Open Source pode verificar automaticamente suas dependências em busca de pacotes com vulnerabilidades como o Log4Shell.

A plataforma Snyk começa identificando e categorizando todos os artefatos do projeto para determinar como eles podem ser verificados. Por exemplo, a Snyk realiza análise de composição de software (SCA) em arquivos pom.xml e testes estáticos de segurança de aplicações (SAST) em arquivos Java. A Snyk também pode verificar configurações de infraestrutura como código (IaC) e arquivos Docker de aplicações conteinerizadas.

Painel de segurança que mostra duas vulnerabilidades críticas de execução remota de código no Apache Log4j, com pontuações de 875 e 763.

Depois de verificar a aplicação vulnerável acima, podemos abrir os resultados da análise do arquivo pom.xml, o arquivo de configuração do Maven que contém nossas dependências. Também podemos ver, na interface da Snyk, a árvore de dependências, que mostra que nossa aplicação usa o Log4j como dependência direta e indireta. Ao clicar na opção Corrigir esta vulnerabilidade, a Snyk pode abrir automaticamente uma solicitação de pull (PR) para atualizar todas as instâncias do Log4j para a versão 2.17.1. Se executarmos novamente o exploit anterior, veremos que ele não funciona mais.

Tela de abertura de um PR de correção que mostra vulnerabilidades do Log4j, incluindo execução remota de código e ataques de negação de serviço.

Da mesma forma, os desenvolvedores podem usar o plugin da Snyk para IntelliJ (ou outro IDE) ou a CLI da Snyk para verificar problemas de segurança e corrigi-los diretamente durante o desenvolvimento. A Snyk se integra a todo o processo de desenvolvimento para simplificar o gerenciamento de vulnerabilidades nas aplicações.

Em algumas situações, as organizações não conseguem atualizar imediatamente os pacotes vulneráveis e precisam considerar outras opções para mitigar os riscos do Log4Shell. Os desenvolvedores podem remover a classe de consulta JNDI ou implementar outras correções rápidas, mas elas não são tão eficazes quanto o patch oficial disponível nas versões mais recentes da biblioteca.

Seja qual for a forma escolhida pelos desenvolvedores para mitigar a vulnerabilidade Log4Shell, a Snyk pode ajudar a identificar instâncias do Log4j e milhares de outras possíveis vulnerabilidades, analisando as dependências de código aberto ou os contêineres de um projeto. Assim, as organizações têm a visibilidade necessária para entender o perfil de risco de suas aplicações.

Comece a resolver desafios de capture the flag

Aprenda a resolver desafios de capture the flag assistindo sob demanda ao nosso workshop virtual introdutório.

Leia mais

Blog

Modelos de ponta encontraram as vulnerabilidades. Só o atacante encontrou as cadeias.

A análise estática encontrou as falhas, mas só os testes de ataque em aplicações ativas provaram como elas poderiam ser encadeadas para causar invasões. Uma comparação entre Evo COS, Claude Security e Claude Code Security.

feature insights context
Blog

Os ataques autônomos já chegaram. A defesa precisa acompanhar o ritmo.

Os atacantes autônomos estão reduzindo o tempo disponível para a defesa. Saiba como a descoberta, a correção, a validação e a prevenção contínuas ajudam as equipes de segurança a acompanhar esse ritmo.

Blog

Por que agentes de programação com IA continuam criando falhas de controle de acesso

Agentes de programação com IA podem gerar uma lógica de autorização que compila e passa pela revisão, mas permite que um tenant acesse os dados de outro. Saiba por que é difícil detectar falhas de controle de acesso e como evitá-las.