아파치 log4j 보안 취약점 (CVE-2021-45105) 조치 방법
- Development/Java
- 2021. 12. 21.
아파치 log4j 보안 취약점 (CVE-2021-45105)
최근 10년 이내 최악의 보안 취약점이라고 알려진 아파치 log4J 취약점 문제(CVE-2021-44228)가 밝혀진지 몇 일이 지나지도 않았는데, 추가 문제가 보고되었다.
CVE-2021-44228은 원격 코드 실행에 대한 취약점이고 장애등급은 Critical이지만, 이번에 보고된 CVE-2021-45105는 Denial Of Service(DOS) 취약점이고 장애등급은 High이다.
문제점
아파치 Log4J 공식 사이트에서는 이 문제를 아래와 같이 기술하고 있다.
Apache Log4j2 versions 2.0-alpha1 through 2.16.0 did not protect from uncontrolled recursion from self-referential lookups. When the logging configuration uses a non-default Pattern Layout with a Context Lookup (for example, $${ctx:loginId}), attackers with control over Thread Context Map (MDC) input data can craft malicious input data that contains a recursive lookup, resulting in a StackOverflowError that will terminate the process. This is also known as a DOS (Denial of Service) attack.
출처: https://logging.apache.org/log4j/2.x/security.html#CVE-2021-45105
이 취약점은 원격 공격에 의해서 유발될 수 있고, 인증을 거치지 않은 상태에서도 악용/ 시도가 가능하다고 알려졌다.
${${::-${::-$${::-$}}}}
와 같은 표현식이 전달되면, 이 문자열을 처리하는 과정에서 StrSubstitutor가 자기참조를 재귀적으로 처리하면서 무한루프에 빠지고, 결국 Stack overflow가 되어 Denial of Service 상태에 빠진다.
Log4J에서는 ${ctx:username} 등과 같이 Pattern Layout에 Context Lookup 기능을 사용할 수 있는데, 이 값에 위와 같은 패턴의 값을 전달하면 문제가 발생한다.
조치 방법
이 문제를 해결하는 방법은 아래와 같다.
- Java8 혹은 그 이상 버전에서는 Log4J를 2.17.0 (작성시점 기준)으로 즉시 업그레이드 해야 한다.
- 대안으로, PatternLayout을 사용하고 있는 경우, ${ctx:longId} 또는 $${ctx:loginId} 등과 같은 Context Lookup 방식의 패턴을 (%X, %mdc, %MDC) 등과 같은 유형으로 변경해 줘도 된다.
- log4-core.jar 파일만 위험에 노출되어 있으므로, log4j-api만 쓰는 경우는 해당되지 않는다.
결과적으로, log4j를 2.17.0으로 업그레이드 하자. (pom.xml, build.gradle 파일 등)
외부 라이브러리 의존성을 갖는 경우에도, 마찬가지로 패치에 신경써야 한다.
참고
- https://github.com/pravin-pp/log4j2-CVE-2021-45105
- https://fossa.com/blog/how-fix-new-log4j-dos-vulnerability-cve-2021-45105/
- https://www.contrastsecurity.com/security-influencers/upgrade-to-2.17-updated-guidance-on-addressing-log4j-cves
- https://www.zerodayinitiative.com/blog/2021/12/17/cve-2021-45105-denial-of-service-via-uncontrolled-recursion-in-log4j-strsubstitutor
더 보기
'Development > Java' 카테고리의 다른 글
아파치 log4j 취약점 확인 및 조치하기 (CVE-2021-44228) (0) | 2021.12.17 |
---|---|
testing - stub, mock, spy 차이는? (0) | 2021.04.14 |
java DNS TTL 설정 - 코드로 동작 확인하기 (0) | 2021.03.22 |
맥북 자바(java) 모든 버전 정보 확인하기 (0) | 2021.03.20 |
간단한 Spock 테스트 - 온라인에서 체험하기 (0) | 2021.02.25 |
SpringBoot + Spock 설정 방법 (1) | 2021.02.17 |
여러 버전의 java 사용하기 - jenv 설정 (4) | 2020.12.08 |
한 서버에 아파치 톰캣(Tomcat) 여러 개 띄우기 (0) | 2012.01.25 |