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. 대응 방안
- Java 8 이상 :
Log4j 2.17.0-> Log4j 2.17.1로 업데이트 - Java 7 :
Log4j 2.12.3-> Log4j 2.12.4로 업데이트
최신 버전으로 업데이트가 불가능한 경우 아래와 같이 임시 조치
- PatternLayout에서 ${ctx:loginId} 또는 $${ctx:loginId}를 (%X, %mdc, or %MDC)로 변경
- ${ctx:loginId} 또는 $${ctx:loginId}를 제거
위의 임시조치는 어디까지나 임시조치이기 때문에 서비스 영향도를 고려하셔서 업데이트 계획을 수립 후 최신 버전의 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
'Infomation > Vulnerability' 카테고리의 다른 글
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 |