Web

[JAVA] Log4j 취약점 Log4Shell

itaeiou 2021. 12. 28. 12:34
반응형

 

Log4j 란?

Log4j는 아파치 소프트웨어 재단에서 개발한 Java 로깅 라이브러리입니다. 프로그램 로그를 남기기 위해 사용되며, 대부분의 자바 프로그램이 Log4j를 사용할 정도로 인기있는 라이브러리입니다. 2015년 오라클에의하면, 130억개 서버에서  자바가 구동중이라 합니다. Log4j는 대부분의 자바 프로그램에서 사용하기 때문에 억단위의 프로그램들이 사용중일 것이라 예상합니다.

Apache Log4j : https://logging.apache.org/log4j/2.x/index.html

 

Log4j – Apache Log4j 2

<!-- Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apa

logging.apache.org

 

Log4j 취약점 ( Log4Shell 이란? )

2021년 12월 10일에 발표된 Log4j 주요 취약점 CVE-2021-44228JNDI(Java Naming and Directory Interface)을 이용한 취약점으로 Log4Shell 이라고도 부릅니다. JNDI와 LDAP을 통해 RCE(원격 코드 실행)을 허용한다는 것이 이번 취약점의 핵심입니다. Log4Shell은 매우 치명적인 보안 사태로, CVSS 10.0으로 가장 높은 위험도입니다. 이번 취약점은 약 8년전인 2.0-beta9 버전부터 존재했던 것으로, 0-day 취약점이라 피해 범위가 더 넓습니다. 애플, 테슬라, 아마존 등등 큰 기업들도 모두 해당 취약점으로 인해 패치한 것으로 알렸습니다.

CVE 란?

Common Vulnerabilities and Exposures의 약어로 공개된 컴퓨터 보안 결함을 의미합니다. 미국 비영리 연구 개발 기관인 MITRE가 소프트웨어와 펌웨어의 취약점을 파악하고 분류하여 코드화한 것으로 "CVE-발생년도-취약점번호"형식으로 지정됩니다. 이 코드는 취약점을 알려 표준화하는 것을 목적으로합니다. 

 

0-day 취약점

0-day 취약점은 해커가 개발자보다 먼저 발견한 취약점으로, 개발자가 해당 보안 이슈에 대응할 시간이 0 day라는 의미에서 붙여졌습니다. 개발자는 해당 취약점을 알게된 즉시 패치해야하며, 취약점을 가진 소프트웨어/라이브러리를 사용한 시점부터 공격 여부를 확인해야합니다. 이번 Log4j 역시 0-day 취약점에 해당하여, Log4j를 사용하는 프로그램은 공격 여부를 확인해야합니다.

 

CVE 별 취약점 정리

CVE Log4j 버전 주요 취약점 CVSS 스코어
CVE-2021-4104 1.2 원격 코드 실행 취약점이 존재하지만, (Log4Shell과 별도)
JMSAppender를 사용하지 않는 경우 취약점 영향이 없음.
다만 서비스 업데이트가 종료되어 최신버전을 권장.
8.1
CVE-2021-44228 2.0-beta9 ~ 2.14 원격 코드 실행 (RCE)
LDAP 서버에서 로드된 임의의 코드를 다운로드.
역직렬화 중에 모든 코드를 실행할 수 있음.
Log4j-core에만 해당.
10.0
CVE-2021-45046 2.15.0 원격 코드 실행 (RCE)
JNDI 조회 패턴을 사용하여 악의적인 입력 데이터 조작 가능.
일부 환경에서는 정보 누출 및 원격 코드 실행,
모든 환경에서 로컬 코드 실행이 발생
2.16.0 및 2.12.2에서 수정.
3.7
-> 9.0
CVE-2021-45105 2.0-alpha1 ~ 2.16.0
(2.12.3 제외)
DoS 취약점.
무한 재귀 실행으로 서비스 종료를 일으길 수 있음.
2.17.0 및 2.12.3에서 수정.
7.5

 

취약점 진단

2021년 12월 10일에 발견된 Log4Shell은 발견 전 해커들에게 이미 알려져있던 취약점으로, 해킹 여부를 알려면 모든 로그를 확인해야합니다. 그러나 해당 취약점이 포함된 버전이 배포된지 매우 오래되었고(약 8년전부터 포함), Log4j를 사용하는 프로그램이 매우 많기 때문에 여러 회사에서 진단 프로그램을 지원합니다. 아래의 진단 프로그램을 이용해 해킹 여부를 확인할 수 있습니다.

 

이스트시큐리티 : https://blog.alyac.co.kr/4357

SK쉴더스 : https://infosec.adtcaps.co.kr/newsRoom/eventNotice/noticeView.do

log4j 스캐너 : https://github.com/logpresso/CVE-2021-44228-Scanner

 

대응방법

Log4j를 사용하는 것을 확인했다면, 할 수 있는 조치는 다음과 같습니다.

Log4j 최신 버전 업데이트 (2.10.0 이상)

가장 권고되는 방법으로 Log4j 라이브러리를 가장 최신 버전으로 업데이트 합니다.

12월 18일 2.17.0(java8) 및 2.12.3(java7) 버전이 배포되었고, 현재까진 다른 취약점이 발견되지 않았습니다.

하지만 계속해서 주의가 필요하며, 또다른 취약점 발견 시 업데이트 및 재배포가 필요합니다.

Lookup 중단(2.7.0 이상)

업데이트가 불가능하다면 property 설정을 통해 문제되는 lookup 사용을 중지합니다.

Java 실행 인자(Arguments)에 시스템 속성(-Dlog4j2.formatMsgNoLookups=true)을 추가하거나,
환경 변수 혹은 시스템 변수로 LOG4J_FORMAT_MSG_NO_LOOKUPS=true를 설정합니다.

JndiLookup 삭제(2.7.0 미만)

권장하지 않는 방식으로 JndiLookup 클래스를 아예 사용하지 않도록 삭제합다.

그러나 문제 있는 버전의 jar 파일을 다시 다운로드 받게 되면 삭제한 부분이 다시 복구되어 취약점에 노출될 수 있습니다.

zip -d log4j-1.2.*.jar org/apache/log4j/net/JMSAppender.class

JMSAppender 삭제 (1.2 버전)

마찬가지로 1.2버전에서 문제되었던 JMSAppender 클래스를 아예 삭제합니다.

이역시 해당 버전을 다시 다운로드 하게 되면 삭제된 부분이 복구되어 재노출됩니다.

zip -d log4j-1.2.*.jar org/apache/log4j/net/JMSAppender.class

Logback으로 교체

Log4j와 같은 역할을 하는 다른 라이브러리로 교체합니다.

Logback 라이브러리는 유사한 취약점인 CVE-2021-42550가 발견된 상태이므로, 1.2.9 버전으로 교체해야합니다.

다른 패키지 사용시 log4j-core와 의존성이 없는지 체크가 필요합니다.

 

참고

https://logging.apache.org/log4j/2.x/index.html

https://nvd.nist.gov/vuln/detail/CVE-2021-44228

https://blog.alyac.co.kr/4341

https://cselabnotes.com/kr/2021/12/12/210/

반응형