InfraFenceInfraFence

Live Security Operations

Começar

CVE-2021-44228 (Log4Shell): verificar e corrigir

Última atualização:

Log4Shell é uma falha de execução remota de código no Apache Log4j 2, a biblioteca de logs presente em boa parte das aplicações Java. Quando uma aplicação registra em log um texto controlado por um atacante (uma URL, um cabeçalho, um campo de formulário) e o texto contém um lookup como ${jndi:ldap://…}, o Log4j busca e executa código do servidor do atacante.

Ela foi explorada poucas horas depois da divulgação, em dezembro de 2021, e ainda é alvo de scans todos os dias. A biblioteca fica escondida dentro de outros softwares, então o trabalho é encontrar cada cópia no servidor e depois atualizar.

Em resumo

CVE
CVE-2021-44228
Software
Apache Log4j 2 (log4j-core)
Versões afetadas
2.0-beta9 a 2.14.1, exceto as versões de segurança 2.3.1 e 2.12.2 ou posteriores
Corrigida em
2.15.0 (Java 8), 2.12.2 (Java 7), 2.3.1 (Java 6); atualize para 2.17.1, 2.12.4 ou 2.3.2 ou posterior
Pontuação CVSS
10.0 Crítica (NVD, CVSS 3.1) · CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H
CISA Known Exploited Vulnerabilities
Sim, adicionada em 10 de dezembro de 2021
Publicada pelo NVD
10 de dezembro de 2021
Patch virtual do InfraFence
vp-cve-2021-44228 (ModSecurity id 9920004)

O que é afetado

Só o log4j-core do Log4j 2 é afetado, e só da 2.0-beta9 até a correção. O Log4j 1.x não é afetado por esta CVE, mas chegou ao fim da vida útil em 2015 e tem falhas próprias. As aplicações Java construídas sobre o Log4j 2 (servidores de aplicação, mecanismos de busca, aplicações próprias) trazem a biblioteca nas próprias pastas, muitas vezes dentro de um .war ou de um .jar autocontido, não como pacote do sistema.

A primeira correção, a 2.15.0, era incompleta em algumas configurações (CVE-2021-45046), e vieram mais dois problemas (CVE-2021-45105 e CVE-2021-44832). Por isso o alvo hoje é a 2.17.1 ou posterior no Java 8, a 2.12.4 no Java 7 e a 2.3.2 no Java 6.

Verificar se um servidor a tem

Procure arquivos log4j-core e depois arquivos compactados que o incluem. A versão está no nome do arquivo:

Qualquer distribuição Linux
sudo nice -n 19 ionice -c3 find / -xdev -type f -name 'log4j-core-*.jar' 2>/dev/null
Qualquer distribuição Linux (precisa do unzip)
sudo nice -n 19 ionice -c3 find / -xdev -type f \( -name '*.jar' -o -name '*.war' -o -name '*.ear' \) 2>/dev/null \
  | while read -r f; do
      unzip -l "$f" 2>/dev/null \
        | grep -qE 'log4j/core/lookup/JndiLookup\.class|log4j-core-[0-9][^/]*\.jar' && echo "$f"
    done

Nota: -xdev mantém a busca no sistema de arquivos raiz. Execute de novo para cada outro ponto de montagem onde há aplicações (/opt, /srv) e verifique as imagens de contêiner separadamente: um arquivo dentro de uma imagem não está no disco do host.

Para uma aplicação que você mesmo compila, pergunte à ferramenta de build qual versão ela realmente empacota:

Projeto Maven
mvn dependency:tree -Dincludes=org.apache.logging.log4j:log4j-core

Para ver se alguém tentou, procure lookups nos logs de acesso do servidor web (os atacantes também os colocam em cabeçalhos, que esses logs não registram):

Logs de acesso do Apache
sudo grep -rhiE '\$\{jndi|%24%7Bjndi|\$\{\$\{' --include='*access*' --exclude='*.gz' /var/log/apache2 /var/log/httpd 2>/dev/null | tail -20

Corrigir

  1. Software de um fornecedor: instale a versão do fornecedor que traz o Log4j 2.17.1 ou posterior.
  2. Sua própria aplicação: suba o log4j-core (e o log4j-api) para a 2.17.1 ou posterior, ou a 2.12.4 no Java 7 e a 2.3.2 no Java 6, recompile e faça o deploy de novo. Confira com a ferramenta de build que nenhuma outra dependência traz de volta uma cópia mais antiga.
  3. Reinicie a aplicação: uma JVM em execução mantém as classes antigas até lá.
  4. Execute de novo a busca acima: não deve sobrar nenhum log4j-core antigo, inclusive em backups de aplicações implantadas que possam ser implantadas de novo.
Maven: fixar a versão corrigida
<dependency>
  <groupId>org.apache.logging.log4j</groupId>
  <artifactId>log4j-core</artifactId>
  <version>2.17.1</version>
</dependency>

Atenção: Definir log4j2.formatMsgNoLookups ou remover classes à mão foram paliativos de dezembro de 2021, e o primeiro não cobre todos os casos. Trate-os como temporários e atualize.

Como o InfraFence a bloqueia enquanto você atualiza

O patch virtual para a CVE-2021-44228 é uma regra ModSecurity que examina a URL, os cabeçalhos da requisição, os cookies e seus nomes, e os parâmetros e seus nomes, depois da decodificação de URL. Ele bloqueia uma requisição com um ${ seguido, a poucos caracteres, de jndi ou dos lookups aninhados usados para escondê-lo (${lower:, ${upper:, ${env:, ${sys:, ${date:, ${::-).

Nota: O patch só vê as requisições HTTP que passam pelo Apache com ModSecurity naquele servidor. Uma aplicação Java acessada pela própria porta, ou um payload que chega por outro caminho (um e-mail, uma fila de mensagens), não está coberto: a atualização é a correção.

Como o patch é aplicado

  1. O agente anota quais portas SSH e quais sites respondem.
  2. Ele grava a regra (id ModSecurity 9920004) entre os próprios marcadores no seu arquivo ModSecurity, executa apachectl configtest e recarrega o Apache de forma suave. Se o teste falhar, o arquivo anterior volta ao lugar.
  3. Ele verifica se o SSH e os sites ainda respondem, e remove o patch se não responderem.
  4. Ele verifica se o ModSecurity realmente bloqueia com a regra, com uma requisição de teste local inofensiva. Um ModSecurity em DetectionOnly só registra: nesse caso, o patch é removido e reportado como ineficaz, nunca como aplicado.

Cada requisição que o patch bloqueia é reportada com CVE-2021-44228 (agente 1.0.37 ou posterior): você vê as tentativas na atividade do servidor e na página Exploração do painel, e assim sabe que a vulnerabilidade está sendo testada contra você.

Atenção: Um patch virtual bloqueia a forma conhecida do ataque nas requisições que passam pelo Apache naquele servidor. Ele não substitui a atualização: instale a versão corrigida e depois remova o patch em Atividade com Desfazer, se não precisar mais dele.

Os patches virtuais precisam do Apache com ModSecurity, da configuração Permitir alterações na configuração do servidor web e de nenhum painel de hospedagem ou ferramenta de gerenciamento de configuração controlando o servidor web; eles fazem parte do plano Pro e do AutoMode. Uma pessoa os aplica a partir da análise por IA, ou o AutoMode faz isso. Veja Patches virtuais.

Fontes

Os fatos desta página vêm destas fontes; consulte-as para ver se houve mudanças.

Teste grátis em 1 servidor

O Starter é gratuito para um servidor, com proteção completa e bloqueio automático. Sem cartão de crédito.

Instale o agente como root, com o seu token no lugar de <TOKEN>:

curl -fsSL https://github.com/infrafence/infrafence-agent/releases/latest/download/install.sh | sudo bash -s -- --token <TOKEN>

O token é criado no painel, em Servidores › Adicionar servidor.