A Akamai relata outro DoS no Log4j2 (CVE-2021-45105): O que você precisa saber
A série de vulnerabilidades descobertas recentemente no Log4j2 chocou a Internet. Como parte de nossa pesquisa contínua, em 17 de dezembro, Hideki Okamoto da Akamai encontrou e relatou devidamente uma vulnerabilidade adicional de negação de serviço (DoS), que foi atribuída como CVE-2021-45105.
Como descobrimos o CVE-2021-45105?
Estávamos analisando o CVE-2021-45046, o segundo desta série de vulnerabilidades. Quando as propriedades do Log4j2 incluem um layout personalizado usando a Pesquisa de contexto (${ctx:FOOBAR}) ou o padrão de Mapa de contexto de thread (%X, %mdc ou %MDC) e a aplicação passa entradas do usuário para o contexto de thread, as cargas úteis criadas podem levar à recursão não controlada. Posteriormente, descobriu-se que essa era uma vulnerabilidade de execução remota de código (RCE), mas inicialmente foi relatada como causa de DoS.
Como estávamos tentando determinar quais cargas úteis causam o DoS, encontramos uma carga útil publicada por uma equipe de segurança de terceiros. A carga útil de fato apresentou uma exceção, mas era "java.lang.IllegalStateException: Loop infinito em IllegalStateException: Loop infinito em interpolação de propriedade", que é uma exceção recuperável. Embora não tenhamos certeza se esta é realmente a carga útil do CVE-2021-45046, notamos que uma "salvaguarda" no código do Log4j2 lançou esta exceção.
StrSubstitutor.java
private void checkCyclicSubstitution(final String varName, final List<String> priorVariables) {
if (!priorVariables.contains(varName)) {
return;
}
final StringBuilder buf = new StringBuilder(BUF_SIZE);
buf.append("Infinite loop in property interpolation of ");
buf.append(priorVariables.remove(0));
buf.append(": ");
appendWithSeparators(buf, priorVariables, "->");
throw new IllegalStateException(buf.toString());
}
Isso significa que os desenvolvedores do Log4j2 estavam cientes de que referências circulares poderiam ocorrer no processo de Pesquisa. Acreditamos que eles estavam esperando que os desenvolvedores de aplicações pegassem essa exceção, pois eles chamaram a função de checkCyclicSubstitution(). Esta função examina a Lista de matrizes que armazena o histórico de valores. Achamos que pode haver uma maneira de ignorar a verificação de referência circular. Por fim, conseguimos encontrar essa carga útil e criar um java.lang.StackOverflowError em determinadas versões do JVM. Também observamos que esse ataque ocorre no Log4j 2.16, onde o CVE-2021-45046 foi corrigido.
O problema foi reportado à equipe de segurança do Log4j2, que atribuiu o CVE-2021-45105 e corrigiu-o rapidamente no Log4j 2.17.
O vetor de ataque
Descobrimos que, caso as aplicações passem entradas do usuário para o contexto de thread, a avaliação dupla dos dados de contexto registrados pode resultar em uma falha do servidor:
User-Agent: ${${ctx:ua}}
Alguns relatórios no Twitter e no GitHub apontaram outros vetores de ataque que não estão diretamente relacionados a essa vulnerabilidade, pois no máximo alguns deles podem resultar em exceções recuperáveis, em vez de uma falha no servidor. Essas variantes são:
${ctx:loginId}
$${ctx:loginId}
${${::-${::-$${::-j}}}}
Mitigando o CVE-2021-45105
Os clientes do Kona Site Defender com todos os conjuntos de regras já estão protegidos contra essa vulnerabilidade com a regra 3000014 do KRS/ASE atual e o grupo de ataque AAG "injeção de comando".
Também estamos continuando nossa pesquisa e publicaremos atualizações à medida que mais informações estiverem disponíveis.