또 다른 Log4j2 DoS에 대한 Akamai의 연구 결과(CVE-2021-45105): 반드시 알아야 할 사항
최근 Log4j2에서 발견된 일련의 취약점은 인터넷에 충격을 주었습니다. 저희의 지속적인 연구에 따르면, 12월 17일 Akamai의 오카모토 히데키(Hideki Okamoto)는 CVE-2021-45105로 지정된 추가적인 DoS(Denial-of-Service) 취약점을 발견하여 보고했습니다.
CVE-2021-45105를 발견한 방법
저희는 이 일련의 취약점 중 두 번째 취약점인 CVE-2021-45046을 분석하고 있었습니다. Log4j2 속성에 컨텍스트 룩업(Context Lookup) (${ctx:FOOBAR}) 또는 스레드 컨텍스트 맵(Thread Context Map) 패턴(%X, %mdc 또는 %MDC)을 사용하는 사용자 지정 레이아웃이 포함되어 있고 애플리케이션이 사용자 인풋을 스레드 컨텍스트에 전달하는 경우, 조작된 페이로드는 통제되지 않는 되부름(recursion)으로 이어질 수 있습니다. 이것은 추후에 원격 코드 실행(RCE) 취약점이라는 사실이 발견되었지만, 처음에는 DoS를 유발하는 것으로 보고되었습니다.
어떤 페이로드로 인해 DoS가 발생하는지 확인하기 위해 써드파티 보안 팀에서 게시한 페이로드를 찾았습니다. 페이로드는 실제로 예외를 두지 않았지만, “java.lang.IllegalStateException: Infinite loop in IllegalStateException: Infinite loop in property interpolation”로 복구 가능한 예외가 있었습니다. 이것이 CVE-2021-45046의 페이로드인지 확신할 수 없지만, 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());
}
즉, Log4j2 개발자는 룩업(Lookup) 프로세스에서 순환 참조가 발생할 수 있음을 알고 있었습니다. 애플리케이션 개발자가 checkCyclicSubstitution() 함수의 이름을 지정했기 때문에 이 예외를 포착할 것을 바란 것으로 보입니다. 이 함수는 값의 기록을 저장하는 동적 배열(Array List)을 검사합니다. 저희는 순환 참조 검사를 우회하는 방법이 있을 수 있다고 생각했습니다. 결국 이러한 페이로드를 찾아 특정 버전의 JVM에서 java.lang.StackOverflowError를 발생시킬 수 있었습니다. 또한 이 공격은 CVE-2021-45046이 수정된 Log4j 2.16에서 발생한다는 것을 발견했습니다.
이 문제는 Log4j2 보안 팀에 보고되었고, 해당 팀은 CVE-2021-45105를 할당하고 Log4j 2.17에서 신속하게 해결했습니다.
공격 기법
애플리케이션이 사용자 인풋을 스레드 컨텍스트(thread context)에 전달할 경우, 로그된 컨텍스트 데이터의 이중 평가로 인해 서버 충돌이 발생할 수 있음을 발견했습니다.
User-Agent: ${${ctx:ua}}
Twitter 및 GitHub의 일부 보고서에서는 이 취약점과 직접 관련이 없는 다른 공격 경로를 지적했으며, 대부분의 경우 서버 충돌이 아닌 복구 가능한 예외를 발생시키는 결과를 낳을 수 있습니다. 해당 변종은 다음과 같습니다.
${ctx:loginId}
$${ctx:loginId}
${${::-${::-$${::-j}}}}
CVE-2021-45105 방어
모든 룰 세트를 가진 Kona Site Defender 고객은 현재 KRS/ASE Rule 3000014 및 AAG Attack Group "Command Injection"을 사용하여 이 취약점으로부터 이미 보호되고 있습니다.
연구는 계속 진행되고 있으며 추가 정보가 제공되면 업데이트를 게시할 예정입니다.