Akamai signale un autre DoS dans Log4j2 (CVE-2021-45105) : Ce que vous devez savoir
La série de vulnérabilités récemment découverte dans Log4j2 a choqué Internet. Dans le cadre de notre recherche continue, le 17 décembre, Hideki Okamoto, qui travaille pour Akamai, a découvert et signalé immédiatement une vulnérabilité de déni de service (DoS) supplémentaire, qui s'est vue attribuer le nom de CVE-2021-45105.
Comment nous avons découvert CVE-2021-45105
Nous analysions CVE-2021-45046, la deuxième vulnérabilité de la série. Lorsque les propriétés de Log4j2 comprennent une mise en page personnalisée utilisant le modèle Context Lookup (${ctx:FOOBAR}) ou Thread Context Map (%X, %mdc ou %MDC) et que l'application transmet les entrées de l'utilisateur au contexte du thread, les charges utiles conçues peuvent entraîner une récursivité incontrôlée. Il s'est avéré par la suite qu'il s'agissait d'une vulnérabilité d'exécution de code à distance (RCE), mais il avait été initialement signalé qu'elle causait un DoS.
Alors que nous essayions de déterminer quelles charges utiles provoquaient des DoS, nous avons trouvé une charge utile publiée par une équipe de sécurité tierce. La charge utile a effectivement déclenché une exception, mais il s'agissait de « java.lang.IllegalStateException: Infinite loop in IllegalStateException: Infinite loop in property interpolation », qui est une exception récupérable. Bien que nous ne soyons pas sûrs qu'il s'agisse effectivement de la charge utile de CVE-2021-45046, nous avons remarqué qu'une « sauvegarde » dans le code de Log4j2 lançait cette exception.
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());
}
Cela signifie que les développeurs de Log4j2 étaient conscients que des références circulaires pouvaient se produire dans le processus de recherche. Nous pensons qu'ils espéraient que les développeurs d'applications capteraient cette exception, puisqu'ils ont nommé la fonction checkCyclicSubstitution(). Cette fonction examine la liste des tableaux qui stocke l'historique des valeurs. Nous avons pensé qu'il pourrait y avoir un moyen de contourner la vérification de la référence circulaire. Enfin, nous avons pu trouver la charge utile et soulever une erreur java.lang.StackOverflowError sur certaines versions de la JVM. Nous avons également remarqué que cette attaque se produit dans Log4j 2.16, où CVE-2021-45046 a été corrigé.
Le problème a été signalé à l'équipe de sécurité de Log4j2, qui a attribué CVE-2021-45105 et l'a rapidement corrigé dans Log4j 2.17.
Le vecteur d'attaque
Nous avons constaté que dans le cas où les applications transmettent les entrées de l'utilisateur au contexte du thread, la double évaluation des données du contexte journalisé pouvait entraîner un crash du serveur :
Agent utilisateur : ${${ctx:ua}}
Certains rapports sur Twitter et GitHub ont signalé d'autres vecteurs d'attaque qui ne sont pas directement liés à cette vulnérabilité, car, tout au plus, certains d'entre eux pourraient entraîner des exceptions récupérables, plutôt qu'un crash du serveur. Ces variantes sont les suivantes :
${ctx:loginId}
$${ctx:loginId}
${${::-${::-$${::-j}}}}
Atténuer CVE-2021-45105
Les clients de Kona Site Defender avec tous les ensembles de règles sont déjà protégés contre cette vulnérabilité avec la règle actuelle KRS/ASE 3000014 et le groupe d'attaque AAG « Command Injection ».
Nous poursuivons également nos recherches et publierons des mises à jour à mesure que de plus amples renseignements seront disponibles.