Log4jShell RCE Vulnerability ( CVE-2021-44228 )
2021년 12월 9일 log4j2의 보안 취약점 제로데이가 발생했다. log4j2는 자바 언어로 작성된 로깅 라이브러리이고 많은 시스템 및 서버 소프트웨어에서 사용되고 있다. 이번 취약점은 RCE(Remote Code Execution)가 가능한 위험도가 높은 취약점이라 빠른 보안 업데이트가 필요했다.
취약점 내용
개요
Log4j2 REC Vulnerability가 Alibaba Cloud Security Team에 의해 2021년 12월 9일 알려졌다. 12월 10일에 패치 버전(Apache Log4j2 2.15.0-rc1)이 바로 나왔지만 취약점이 완전히 해결되지 않았다. CVE-2021-44228 취약점 이 후 연계된 Log4j2 취약점(CVE-2021-44832, CVE-2021-45046, CVE-2021-45105)들이 추가로 발견되었고 해결되었다.
문제점
Log4j2 라이브러리(log4j-core jar)가 설정, 로그 메세지, 파라미터 등에 JNDI(LDAP) 주소가 입력되었을 때 룩업을 시킨다는 문제가 발견되었다. 이것이 왜 문제냐면 JNDI 룩업(lookup)이 디렉토리 서비스의 객체를 로드하는 기능이기 때문이다. 즉, JNDI 주소가 파라미터로 전달되면 실행이 된다는 이야기이고 주소가 악의적인 외부 코드를 가리키고 있다면 외부 코드가 서버에서 동작하는 상황이 발생하게 된다.
취약점 목록
취약점 해결 버전
언급된 취약점들이 모두 해소된 버전은 Log4j 2.17.1
이상의 버전이다.
스프링 Log4j 라이브러리 변경하기
스프링 v2.5.8, v2.6.2 릴리즈는 Log4j 2.17.0 버전을 포함하고 있다. 스프링 v2.6.7에서는 Log4j 2.17.2 버전을 포함하고 있는 것을 확인했다.
스프링의 spring-boot-starter-logging은 기본적으로 log4j-to-slf4j와 log4j-api를 포함하고 이 취약점에 해당하지는 않는다. 취약점은 오직 log4j-core에서 발생한다.
만일 스프링 기본을 log4j2로 변경해서 사용하고 있고 문제의 라이브러리가 포함되어 있다면 수정이 필요하다.
스프링 log4j 버전 변경
- gradle 수정
...
ext['log4j2.version'] = '2.17.1'
...
- dependency 확인
./gradlew dependencyInsight --dependency log4j
참고
- https://www.alibabacloud.com/notice/log4j2
- https://nvd.nist.gov/vuln/detail/CVE-2021-44228
- https://security.googleblog.com/2021/12/understanding-impact-of-apache-log4j.html
- https://www.youtube.com/watch?v=ziZnU3t-DRM
- https://medium.com/r3d-buck3t/things-i-learned-this-week-about-log4jshell-vulnerability-c4199e7d194b
- https://www.youtube.com/watch?v=oC2PZB5D3Ys
- https://spring.io/blog/2021/12/10/log4j2-vulnerability-and-spring-boot