Akamai berichtet von einem weiteren DoS-Angriff auf Log4j2 (CVE-2021-45105): Das müssen Sie wissen
Die erst kürzlich entdeckten zahlreichen Sicherheitslücken in Log4j2 schockieren Internetnutzer. Im Rahmen unserer kontinuierlichen Forschung hat Hideki Okamoto von Akamai am 17. Dezember 2021 eine weitere Denial-of-Service-Schwachstelle (DoS) gefunden und verantwortungsbewusst gemeldet, die als CVE-2021-45105 benannt wurde.
Wie wir CVE-2021-45105 entdeckt haben
Wir analysierten CVE-2021-45046, die zweite dieser Sicherheitslücken. Wenn Log4j2-Eigenschaften ein nutzerdefiniertes Layout mit Kontextabfrage (${ctx:FOOBAR}) oder Thread Context Map-Muster (%X, %mdc oder %MDC) enthalten und die Anwendung Nutzereingaben an den Thread-Kontext weitergibt, können manipulierte Payloads zu unkontrollierten Rekursionen führen. Später stellte sich heraus, dass es sich um eine RCE-Schwachstelle (Remote Code Execution, Codeausführung aus der Ferne) handelte, die fälschlicherweise zunächst als DoS-Schwachstelle gemeldet wurde.
Als wir herausfinden wollten, welche Payloads DoS verursachen, fanden wir eine Payload, die von einem externen Sicherheitsteam veröffentlicht wurde. Die Payload hat tatsächlich eine Ausnahme ausgelöst, aber es war „java.lang.IllegalStateException: Endlosschleife in IllegalStateException: Endlosschleife bei der Eigenschaftsinterpolation“, was eine behebbare Ausnahme ist. Obwohl wir nicht sicher sind, ob dies tatsächlich die Payload von CVE-2021-45046 ist, haben wir festgestellt, dass eine „Schutzmaßnahme“ im Log4j2-Code diese Ausnahme ausgelöst hatte.
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());
}
Das bedeutet, dass den Entwicklern von Log4j2 bewusst war, dass während des Abfrageprozesses Zirkelverweise auftreten können. Wir glauben, dass sie gehofft haben, dass Anwendungsentwickler diese Ausnahme erkennen würden, da sie die Funktion checkCyclicSubstitution() genannt haben. Diese Funktion untersucht die Array-Liste, in der der Werteverlauf gespeichert ist. Wir dachten, dass es vielleicht eine Möglichkeit gibt, die Prüfung von Zirkelverweisen zu umgehen. Schließlich gelang es uns, eine solche Payload zu finden und einen java.lang.StackOverflowError auf bestimmten Versionen von JVM auszulösen. Wir haben auch festgestellt, dass dieser Angriff in Log4j 2.16 auftritt, wo CVE-2021-45046 behoben wurde.
Das Problem wurde dem Sicherheitsteam von Log4j2 gemeldet, das CVE-2021-45105 zuwies und es schnell in Log4j 2.17 behob.
Der Angriffsvektor
Wir haben festgestellt, dass bei Anwendungen, die Nutzereingaben an den Thread-Kontext weitergeben, eine doppelte Bewertung der protokollierten Kontextdaten zu einem Serverabsturz führen kann:
User Agent: ${${ctx:ua}}
In einigen Berichten auf Twitter und GitHub wurde auf andere Angriffsvektoren hingewiesen, die nicht direkt mit dieser Schwachstelle zusammenhängen, da einige von ihnen höchstens zu behebbaren Ausnahmen und nicht zu einem Serverabsturz führen können. Diese Varianten sind:
${ctx:loginId}
$${ctx:loginId}
${${::-${::-$${::-j}}}}
Abwehr von CVE-2021-45105
Kunden von Kona Site Defender mit allen Regelsätzen sind bereits mit der aktuellen KRS/ASE-Regel 3000014 und der AAG-Angriffsgruppe „Command Injection“ vor dieser Sicherheitslücke geschützt.
Wir setzen unsere Untersuchungen fort und werden bei weiteren Erkenntnissen Updates mit Ihnen teilen.