Apache Log4j2 치명적 취약점, 해결방안은? CVE-2021-44228
Log4j2 치명적 취약점 'CVE-2021-44228'
Log4j2는 아파치 소프트웨어 재단에서 자바(Java) 언어로 제작된 로깅 라이브러리로, 서버와 프로그램의 유지 관리를 목적으로 동작 상태를 기록으로 남기기 위해서 사용되는 기능입니다.
이번에 발견된 'CVE-2021-44228', Log4Shell 혹은 LogJam으로 명명된 취약점은 '마인크래프트'에서 처음 확인되었고, 자바(Java) 언어로 개발된 마인크래프트 버전에서 프로그래밍 코드로 이루어진 특정 채팅 메시지를 입력하면 대상 컴퓨터에서 원격으로 프로그램을 실행시킬 수 있는 것으로 나타났습니다.
이는 Log4j2 중에 존재하는 'JNDI(Java Naming and Directory Interface)' 인젝션 취약점을 악용한 것으로, 이 원리를 이용하여 취약점을 공격하면 해커들이 목표 대상 컴퓨터의 모든 권한을 취득할 수 있으며, 비밀번호 없이 서버를 통해 내부망에 접근하여 데이터를 약탈하거나 삭제할 수 있고, 악성 프로그램을 심어서 실행시킬 수도 있습니다.
Log4j2 오픈소스 프로젝트를 지원, 관리하는 아파치 소프트웨어 재단에서는 이 취약점을 보안 위협 수준, CVSS 스코어를 1~10 단계 중 최고 등급인 '10단계'로 평가했습니다. 또한 보안 업체 '텐에이블'의 아밋 요란 최고 경영자(CEO)는 이번 취약점을 "최근 10년간 가장 치명적이고 거대한 취약점으로, 현대 컴퓨터 역사를 통틀어 최악의 보안 결함일 수 있다"라는 말을 했습니다.
* CVE(Common Vulnerabilities and Exposures)는 공개적으로 알려진 컴퓨터 보안 결함 목록이며, 보통 CVE ID 번호가 할당된 보안 결함을 뜻합니다.
(해당 결함은 현재 Log4j2 v2.15.0에서 JNDI 동작을 비활성화시켜 수정된 상태입니다.)
Spring Boot에서의 해결 방안
Spring Boot는 기본 로깅 시스템으로 Log4j2 이전에 나온 logback 라이브러리가 사용되기 때문에 설정을 통해 Log4j2 라이브러리를 적용된 경우에만 수정이 필요합니다.
(해당 취약점은 Apache Log4j2 v2.0 ~ v2.14.1 모든 버전에 해당됩니다.)
곧 출시될 spring boot v2.5.8 및 v2.6.2 Release (2021년 12월 23일 예정)에서는 해당 취약점을 보완한 Log4j2 v2.15.0을 선택하지만 이전의 버전에서는 해당 의존성의 빠른 버전 업그레이드가 필요한 상황입니다.
Maven
<properties>
<log4j2.version>2.15.0</log4j2.version>
</properties>
Gradle
// 종속성 관리 플러그인을 사용중이라면
ext['log4j2.version'] = '2.15.0'
//종속성 관리 플러그인이 아닌 gradle 플랫폼을 사용하는 경우
implementation(platform("org.apache.logging.log4j:log4j-bom:2.15.0"))
(gradle의 경우 종속성 관리 플러그인 사용 여부에 따라 적용하는 방법이 다른 점을 확인해주셔야 합니다.)
***
만약 종속성을 업그레이드 하지 못하는 상황이라면 아래와 같이 'log4j2.formatMsgNoLookups' 옵션을 true로 설정하는 방법이 있습니다. 또는 JndiLookup 클래스를 제거하는 방법도 있습니다.
java -Dlog4j2.formatMsgNoLookups=true -jar myapp.jar
< 참고 자료 >