본문 바로가기

Technical Docs/Web Application

Log4j 취약점 CVE-2021-44228 (Remote Code Injection)

2021년 12월9일 해당 취약점 나온듯?

현재 CVE 번호는 CVE-2021-44228 임

## 핵심 Flow 는 아래와 같음

A : Log4j 취약한 버전을 사용하는 서버

B : 공격자

  1. A의 서버에서 사용자의 입력을 로그로 저장하는 곳이 존재함 (ex. HTTP Header 중 X-Api-Version)
  2. 해당 장소에 B가 페이로드를 넘김
  3. 서버가 B의 입력을 로그 기록함
  4. JNDI Lookup을 통해 해당 구문이 실행됨 (코드는 JNDI Injection 페이로드로 구성되며, 해당 코드를 실행시키는건 JNDI Lookup을 통해 이루어짐)

    CVE-2021-44228 공격 시나리오

JNDI Injection 관련 내용은 아래 링크에 있음

https://www.blackhat.com/docs/us-16/materials/us-16-Munoz-A-Journey-From-JNDI-LDAP-Manipulation-To-RCE.pdf

## JNDI ?

JNDI는 Java Naming and Directory Interface로 디렉터리 서비스(LDAP, DNS, NIS, 파일 시스템)를 발견하고 Lookup을 통해 디렉터리 Object를 Naming 해주는 Java API이다.

Naming을 사용할 때 ${protocol:value} 이런식으로 Binding 되기 때문에 이번 공격의 페이로드가 ${ldap:127.0.0.0/a} 이런모양이다

취약한 코드 ?

사용자의 입력을 따로 가공하지 않고 로깅하는 경우 취약하다고 볼 수 있다.

@RestContorller
public class MainController{
	private static final Logger logger = LogManager.getLogger("LOG");

	@GetMapping("/")
	public String putLog(@RequestHeader("User-agent") String agent){
		logger.info("User agent is " + agent);
	}
}

위와 같이 User-agent 던 X-Api-Version 이던 사용자가 조작 가능한 데이터에 대해 서버에서 해당 데이터를 받아 로깅하면 취약하다

 

##JNDI Lookup 원본

아래와 같이 String으로 넘어올 수 있는 사용자 입력에 대해 필터링이 별도로 존재하지 않았음

링크는 https://github.com/apache/logging-log4j2/commit/d82b47c6fae9c15fcb183170394d5f1a01ac02d3 요기서 확인 가능함.

현재는 입력(name) argu에 대한 프로토콜 / class / ldap 서버에 대한 필터링이 추가됨

public <T> T lookup(final String name) throws NamingException {
	return (T) this.context.lookup(name);
}

 

취약한 버전 ?

취약한 버전은 아래과 같음

Apache Log4j 2.0-beta9 ~ 2.14.1 까지의 모든 버전이 취약하다

##12.20 추가

이게 취약점이 맨날 나와서 현재 계속 바뀌고 있다.

현재 2.16 버전까지 DoS 공격에 취약하다고 한다.

Mitigation / 조치방법 ?

가장 간단한 조치방법은 log4j의 버전을 업그레이드 하는 것이다.

현재 조치된 버전은 2.15.0 이며 Java8 이상에서 사용 가능하기 때문에 이보다 낮은 자바 버전을 사용하는 경우 자바 버전업을 하던 다른 조치방법을 사용해야 한다.

  1. Log4j를 2.15.0 으로 업그레이드
  2. 2.0-beta 9 ~ 2.10.0 버전의 경우 JndiLookup 클래스를 경로에서 제거 zip -q -d log4j-core-*.jar org/apache/logging/log4j/core/lookup/JndiLookup.class
  3. 2.10 ~ 2.14.1 log4j2.formatMsgNoLookups 또는 LOG4J_FORMAT_MSG_NO_LOOKUPS 환경변수를 true로 설정

 

12.20 추가

조치방법은 최신버전으로의 패치는 현재 2.17이다. 2.16까지 DoS 공격이 가능하다고함.

 

참고

https://www.boho.or.kr/data/secNoticeView.do?bulletin_writing_sequence=36389