이메일

Log4j 보안 취약점, 버전 확인부터 해결 방법까지 알려 드립니다

IT 소식

2023년 5월 17일


12월 30일 Log4j 보안 취약점 안내 및 조치 사항 공유

12월 30일에 발표한 Log4j 보안 취약점 내용을 알려 드립니다.

  • CVE-2021-45105 : 2.0-beta9 ~ 2.16.0 버전 (Log4j 2.3.1, 2.12.3 제외)
  • CVE-2021-44832 : 2.0-beta9 ~ 2.17.0 버전 (Log4j 2.3.2, 2.12.4 제외)

위 취약점은 아래와 같이 조치를 취할 수 있습니다.

  • Java 8 이상 : Log4j 2.17.1으로 업데이트
  • Java 7 : Log4j 2.12.4으로 업데이트
  • Java 6 : Log4j 2.3.2으로 업데이트

※ log4j-core-*.jar 파일 없이 log4j-api-*.jar 파일만 사용하는 경우 위 취약점의 영향을 받지 않음

신규 업데이트가 불가능할 경우 아래의 방안을 적용할 수 있습니다. (CVE-2021-45105 한정)

PatternLayout에서 ${ctx:loginId} 또는 $${ctx:loginId}를 (%X, %mdc, or %MDC)로 변경
${ctx:loginId} 또는 $${ctx:loginId}를 제거

시작하며

안녕하세요, 와탭랩스 베키입니다. 이전 포스팅에서는 Log4j의 취약성과 확인 방법을 간단히 소개했습니다.

이후 Log4j 최신 버전에서도 우회 공격 시 취약점에 노출된다는 뉴스를 접하셨을텐데요. 이후 새로운 대응책이 있는지 저 베키가 정리해서 안내 드립니다.

Log4j 개념 설명과 Log4j가 보안 위험에 노출된 이유

Log4j는 JAVA 기반 오픈소스 유틸리티로 엔터프라이즈 애플리케이션과 웹사이트에서 많이 사용 중입니다. 서비스 동작 과정에서 일어나는 모든 기록을 남깁니다. 침해 사고 발생 및 이상 징후를 점검하기 위해 Log4j를 이용합니다.

이번 Log4j 취약점은 JNDI(Java Naming and Directory Interface)와 LDAP(Lightweight Directory Access Protocol)에서 시작합니다. JNDI는 1990년대 후반부터 Java에 추가된 인터페이스입니다. Java 프로그램이 디렉터리를 통해 데이터를 찾을 수 있는 디렉터리 서비스입니다.

Java 프로그램들은 앞서 말씀드린 JNDI와 LDAP를 통해 Java 객체를 찾을 수 있습니다. 여기서 문제의 Log4j에 편하게 사용하기 위해 특정 문법을 통해 Java 객체를 볼 수 있게 됩니다. 이 문법들은 로그가 기록될 때도 사용이 가능합니다. 해커들은 로그가 기록되는 곳을 찾아 취약점을 이용할 수 있게 됩니다.

해커가 로그를 활용하여 공격하는 이미지

Log4j 취약점 버전과 확인 방법

각 취약점마다 영향을 받는 Log4j 버전은 약간 다릅니다. 12월 13일에 발표된 바에 따르면 Log4j 2.0-beta9부터 2.14.1 버전과(2.12.2 제외) 하위 버전인 1.x까지 영향을 받았습니다. 그러나, 12월 15일 발표된 바에 따르면 우회 공격을 할 경우 최신 버전인 2.15.0도 위험하다는 발표가 있었습니다.

1.CVE-2021-44228: Apache Log4j 2에서 발생하는 원격코드 실행 취약점 (Log4j 2.0-beta9 ~ 2.14.1버전, 2.12.2 제외)

2.CVE-2021-45046: Apache Log4j 2에서 발생하는 서비스 거부 취약점 (Log4j 2.0-beta9 ~ 2.12.1 및 2.13.00 ~ 2.15.0)

3.CVE-2021-4104: Apache Log4j 1.2에서 발생하는 원격코드 실행 취약점 (Log4j 1.x)

위의 버전이 취약하다고 Log4j 2.x 버전에서 1.x 버전으로 다운그레이드 하는 경우가 있습니다. Log4j 1.x 버전은 2015년 이후로 기술 지원이 종료되었는데요. 다운그레이드를 하면 기술 지원을 받을 수 없습니다. 오히려 보안 위협에 노출될 가능성이 높아지게 됩니다. 이 글을 보시는 여러분은 버전 업그레이드 하는 것을 추천 드립니다.

취약한 Log4j를 사용하고 있는지 아래 방법으로 확인이 가능합니다.

1. Log4j를 사용 중인 제품에 관한 정보는 아래에서 확인이 가능합니다.

https://gist.github.com/SwitHak/b66db3a06c2955a9cb71a8718970c592

2. 리눅스에서 log4j 설치 여부 확인하기: 아래 명령어를 입력하시면 됩니다. 이 방법으로 log4j-core 버전도 확인하실 수 있습니다.

- find / -name 'log4j*'

3. 윈도에서 log4j 설치 여부 확인하기

윈도에서 log4j 설치 여부 확인하기

4. 공개 도구를 사용하는 방법도 있습니다.

a. Syft와 Grype 도구를 사용하는 방법: https://github.com/anchore/grype

b. 취약점 스캐너를 사용하는 방법: https://github.com/logpresso/CVE-2021-44228-Scanner

5.와탭 사용자라면 좀 더 손쉽게 확인 가능합니다.

[애플리케이션] → [에이전트 설정]에서 [라이브러리 버전] 기능에서 확인 할 수 있습니다. log4j-core를 검색 해 보세요

log4j-core를 검색

b. 또 다른 방법으로는 애플리케이션의 pom.xml 또는 gradle.build 파일을 열어 log4j-core로 검색 해 볼 수도 있습니다

Log4j 버전별 해결 방법

먼저, 최신 버전으로 업데이트를 하는 게 최선의 방법입니다. Download Apache Log4j 2에서 최신 버전을 확인하실 수 있습니다.

*블로그 콘텐츠를 게재한 날짜를 기준으로 Log4j 최신 버전이 변경되었습니다. Log4j 2.17.0 취약점도 발견될 가능성이 있으니, 최신 버전 정보를 수시로 확인하며 업데이트 하시면 되겠습니다.

https://logging.apache.org/log4j/2.x/download.html 에서 최신 버전 확인이 가능합니다.

다만, 빠른 시간 내에 라이브러리를 업데이트 하고 재 검증하는 게 현실적으로 어려울 수 있는데요. 버전에 따른 선제 조치를 아래와 같이 취할 수 있습니다.

1. Log4j 버전이 2.0-beta9부터 2.10.0일 경우: JndiLookup 를 log4j-core 에서 제거하는 방법이 있습니다. 라이브러리 경로에서 아래 명령을 실행하면 JndiLookup.class 가 제거됩니다.

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

2. Log4j 버전이 2.10부터 2.14.1인 경우: lo4j2.formatMsgNoLookups 또는 LOG4J_FORMAT_MSG_NO_LOOKUPS 환경 변수를 true로 설정하면 됩니다.

3. JVM 옵션으로 JndiLookup 기능을 제한 하는 방법: -Dlog4j2.formatMsgNoLookups=true 옵션과 함께 애플리케이션을 실행합니다.

java -Dlog4j2.formatMsgNoLookups=true -jar myapp.jar

4. Log4j 버전이 1.x인 경우: JMSAppender 사용 확인 후 코드 수정을 하거나 삭제하시면 됩니다.

마치며

많은 IT 담당자 분들이 Log4j의 최신 버전마저 우회 공격 시 취약하다는 정황까지 포착되면서 많이 걱정하실 것으로 생각합니다. 와탭랩스 역시 같은 IT 업계에서 SaaS 서비스를 제공하는 만큼, 상황을 예의주시하고 있습니다.

와탭 서비스는 Log4j 보안 취약점과 관련이 없습니다.

와탭 서비스를 사용 중인 담당자 80% 이상이 개발자, 운영자, 데브옵스 엔지니어입니다. 와탭랩스는 이슈가 있을 때 소식을 업데이트하여 정확한 정보를 제공하겠습니다.

지금 바로 데모를 통해 와탭을 경험해보세요!

어려웠던 모니터링 분석이 와탭 하나로 쉽게 가능합니다.