Apache Log4j CVE-2021-44228
Apache Log4j란?
- 자바 기반 소프트웨어에서 사용되는 로깅 유틸리티이다.
- Apache Software Foundation에서 개발하여 많은 소프트웨어에 사용되어진다.
- 특히 아파치 진형의 오픈소스나, 자바 기반 오픈소스에서 많이 채택되어진다.
취약점 요약
Log4j 2에는 로그 메시지 기록 시 JNDI 조회한 값을 포함할 수 있는 기능이 있다.
일반적으로는 조회 키에 대한 값이 반환되어 기록하는 것이지만, javax.naming.Reference 상속하는 객체가 반환되면 자바 URLClassLoader가 이 객체의 classFactory와 classFactoryLocation 속성을 조회하여 팩토리 바이트코드를 로드하여 실행하게 된다.
대부분의 웹 애플리케이션은 웹 로그를 기록하는데, 현재 인터넷에서 User-Agent 자리에 JNDI 표현식을 삽입하는 등의 형태로 실제 공격이 발생하고 있다.
User-Agent를 로그에 남기려고 시도하다가 공격자가 제어하는 원격 LDAP 서버에 접속하여 원격으로 코드를 받아서 실행하여 공격을 당할 수 있다.
결론적으로 JNDI(Java Naming and Directory Interface) 인젝션을 통해 RCE(Remote Code Execution) 취약점이 발견되었다.
조치 사항
- JndLookup 클래스를 경로에서 제거 (2.0-beta9~2.10.0)
zip -q -d log4j-core-*.jar org/apache/logging/log4j/core/lookup/JndiLookup.class
- log4j2.formatMsgNoLookups 속성을 True로 설정 (log4j 2.10.0 이상)
- log4j를 2.15.0 버전 이상 유지하기
Exploit Code
- tangxiaofeng7의 log4shell 실행코드 레포지토리에서 볼 수 있다.
- 전제 조건으로는 log4j의 버전이 다음과 같아야한다.
2.0-beta9 <= log4j <=2.14.1
- Java Unmarshaller Security를 통해 LDAP로 javac로 컴파일된 파일을 실행하게 되면 계산기가 나오게 된다.
레퍼런스
- Veracode JNDI 인젝션
- Cloudflare 공격 페이로드 포스팅
- Cisco Security Advisory
- PSA_Log4Shell_JNDI_Injection
- Log4shell 초보자를 위한 log4j 보안 취약점 알아보기