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:
sudo nice -n 19 ionice -c3 find / -xdev -type f -name 'log4j-core-*.jar' 2>/dev/nullsudo 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"
doneNota: -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:
mvn dependency:tree -Dincludes=org.apache.logging.log4j:log4j-corePara 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):
sudo grep -rhiE '\$\{jndi|%24%7Bjndi|\$\{\$\{' --include='*access*' --exclude='*.gz' /var/log/apache2 /var/log/httpd 2>/dev/null | tail -20Corrigir
- Software de um fornecedor: instale a versão do fornecedor que traz o Log4j 2.17.1 ou posterior.
- Sua própria aplicação: suba o
log4j-core(e olog4j-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. - Reinicie a aplicação: uma JVM em execução mantém as classes antigas até lá.
- Execute de novo a busca acima: não deve sobrar nenhum
log4j-coreantigo, inclusive em backups de aplicações implantadas que possam ser implantadas de novo.
<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
- O agente anota quais portas SSH e quais sites respondem.
- Ele grava a regra (id ModSecurity 9920004) entre os próprios marcadores no seu arquivo ModSecurity, executa
apachectl configteste recarrega o Apache de forma suave. Se o teste falhar, o arquivo anterior volta ao lugar. - Ele verifica se o SSH e os sites ainda respondem, e remove o patch se não responderem.
- Ele verifica se o ModSecurity realmente bloqueia com a regra, com uma requisição de teste local inofensiva. Um ModSecurity em
DetectionOnlysó 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.
