1. CVE-2021-45105 개요
CVE-2021-45046 취약점에 수정된 지 며칠 만 에 Apache Log4j에서 세 번째 제로데이 취약점(CVE-2021-45105)이 발견되었다 . 이 취약점은 2021년 12월 15일에 보고 되었으며, 2021년 12월 18일에 공개 되었다. CVE-2021-45105는 로깅 구성이 Context Lookup과 함께 기본이 아닌 Pattern Layout (예: ${ctx:loginId}, ${ctx:apiversion} 등)을 사용하는 경우 Thread Context Map(MDC) 입력 데이터를 제어하는 공격자는 재귀 조회(Recursive lookup)가 포함된 악의적인 입력 데 이터를 만들 수 있으며, 이로 인해 StackOverflow가 발생하여 프로세스가 종료 될 수 있다.
log4j-core의 StrSubstitutor 및 StrLookup 클래스는 ${ctx:username}과 같은 Pattern Layout 내에서 만들어진 Lookup 구문 분석을 담당한다. 취약점은 중첩된 변수가 "StrSubstitutor" 클래스로 대체될 때 "substitute()" 메서드가 재귀적으로 호출 되기 때문에 가능하다. 따라서 중첩 변수가 변수 자체를 참조하는 경우 프로세스 충돌을 일으키는 무한 재귀를 유발시킨다. 조회 패턴(Lookup pattern)은 다음 형식을 허용한다.
${lookupName:key:-defaultValue}
- lookupName : 수행할 lookup의 이름 또는 유형(예: ctx, env 등)
- key : 해당 맵 객체에서 찾을 변수의 이름( ctx의 경우 ThreadContext map)
- defaultValue : 키 가 맵에 존재하지 않는 경우 대체자에게 이 조회 인스턴스(lookup instance) 대신 무엇을 넣을지 알려주는 선택적 값
ThreadContext 맵의 변수를 공격자가 제어할 수 있는 경우 기본값을 사용하여 컨텍스트 조회와 동일한 문자열을 보유할 수 있다. 예를 들어, Log4j 구성이 사용자 지정 Pattern Layout을 다음과 같이 설정하는 취약한 애플리케이션이 있다고 가정하자.
%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} – %msg%n ${ctx:user}
그리고 애플리케이션 사용자가 ThreadContext 맵에 저장된 사용자 변수를 제어할 수 있다고 가정하면, 공격자는 사용자 값을 ${ctx:user1:-${ctx:user}으로 설정하고 StackOverflow를 트리거할 수 있다.
2. 영향받는 Log4j 버전
2.0-beta9 ~ 2.16.0 이하 ((Log4j 2.3.1, 2.12.3 제외) )
※ log4j-core-*.jar 파일 없이 log4j-api-*.jar 파일만 사용하는 경우 취약점의 영향을 받지 않음
3. 대응 방안
최신 버전으로 업데이트가 불가능한 경우 아래와 같이 임시 조치
위의 임시조치는 어디까지나 임시조치이기 때문에 서비스 영향도를 고려하셔서 업데이트 계획을 수립 후 최신 버전의 Log4j로 업데이트를 권고하고 있다.
[참고자료]
https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2021-45105
https://issues.apache.org/jira/browse/LOG4J2-3230
https://www.netskope.com/blog/cve-2021-45105-new-dos-vulnerability-found-in-apache-log4j
https://nsfocusglobal.com/apachelog4j-remote-code-execution-vulnerability-cve-2021-44228-threat-alert-2/
https://www.zerodayinitiative.com/blog/2021/12/17/cve-2021-45105-denial-of-service-via-uncontrolled-recursion-in-log4j-strsubstitutor
https://github.com/apache/logging-log4j2/blob/master/log4j-core/src/main/java/org/apache/logging/log4j/core/lookup/StrSubstitutor.java
https://www.krcert.or.kr/data/secNoticeView.do?bulletin_writing_sequence=36397
CVE-2021-44832 Log4j Vulnerability (0) | 2021.12.29 |
---|---|
CVE-2021-45046 Log4j Vulnerability (0) | 2021.12.23 |
CVE-2021-44228 Log4j Vulnerability (0) | 2021.12.22 |