Akamai segnala un altro DoS in Log4j2 (CVE-2021-45105): cosa dovete sapere
La serie di vulnerabilità scoperte di recente in Log4j2 ha scioccato Internet. Come parte del nostro continuo lavoro di ricerca, il 17 dicembre, Hideki Okamoto di Akamai ha scoperto, e poi responsabilmente segnalato, un'ulteriore vulnerabilità DoS (Denial-of-Service), a cui è stato assegnato il codice CVE-2021-45105.
Come abbiamo scoperto la CVE-2021-45105
All'epoca, stavamo analizzando la CVE-2021-45046, la seconda di questa serie di vulnerabilità. Quando le proprietà di Log4j2 includono un layout personalizzato tramite lo schema Context Lookup (${ctx:FOOBAR}) o Thread Context Map (%X, %mdc o %MDC) e l'applicazione passa gli input dell'utente al contesto del thread, i payload creati possono causare ricorsioni incontrollate. Più tardi, questo fenomeno è risultato essere una vulnerabilità RCE (Remote Code Execution), inizialmente segnalata come causa di attacchi DoS.
Poiché stavamo cercando di stabilire quali payload causassero un attacco DoS, abbiamo scoperto un payload pubblicato da un team di sicurezza di terze parti. Il payload ha effettivamente lanciato un'eccezione di tipo "java.lang.IllegalStateException: Infinite loop in IllegalStateException: Infinite loop in property interpolation", ossia un'eccezione recuperabile. Benché non fossimo sicuri se questo fosse effettivamente il payload della CVE-2021-45046, abbiamo notato che questa eccezione era stata lanciata da una "protezione" nel codice Log4j2.
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());
}
Ciò significa che gli sviluppatori di Log4j2 erano coscienti del fatto che potessero verificarsi rinvii incrociati nel processo di ricerca. Pensiamo che sperassero nell'identificazione di questa eccezione da parte degli sviluppatori di applicazioni, dal momento che avevano denominato la funzione checkCyclicSubstitution(). Questa funzione esamina l'elenco matrice che memorizza la cronologia dei valori. Pensavamo ci fosse un modo per ignorare il controllo dei rinvii incrociati. Infine, siamo riusciti a trovare un payload di questo tipo e a comunicare un java.lang.StackOverflowError su alcune versioni della JVM. Abbiamo anche notato che questo attacco si verifica in Log4j 2.16, in cui la CVE-2021-45046 è stata corretta.
Il problema è stato segnalato al team di sicurezza Log4j2, che ha assegnato la CVE-2021-45105 e l'ha rapidamente corretta in Log4j 2.17.
Il vettore di attacco
Abbiamo scoperto che, nel caso in cui le applicazioni fanno passare gli input dell'utente al contesto del thread, la doppia valutazione dei dati di contesto registrati potrebbe causare un arresto del server:
User-Agent: ${${ctx:ua}}
Alcuni rapporti su Twitter e GitHub hanno indicato altri vettori di attacco non direttamente collegati a questa vulnerabilità, in quanto, tutt'al più, alcuni di essi possono dare luogo ad eccezioni recuperabili anziché a un arresto del server. Alcune varianti sono:
${ctx:loginId}
$${ctx:loginId}
${${::-${::-$${::-j}}}}
Mitigazione della CVE-2021-45105
I clienti di Kona Site Defender con tutti i set di regole sono già protetti contro questa vulnerabilità, grazie all'attuale regola KRS/AS 3000014 e al gruppo di attacchi AAG "Command Injection".
Stiamo continuando anche con la nostra ricerca ed eventuali aggiornamenti verranno pubblicati non appena saranno disponibili ulteriori informazioni.