개요
- Apache Log4j 2 에서 발생하는 취약점(CVE-2021-44228)을 통해 악성코드 감염 등의 피해가 발생할 수 있어 최신 버전으로 긴급 업데이트가 필요
- CVE-2021-44228 취약점(Log4Shell)은 치명적인 결함으로 간주되며, CVSS 스코어 10점으로 가장 높은 심각도
Log4j 취약점 확인
CVE
- Common Vulnerability Exposure의 약자로 대중적으로 알려져있고, 영향을 미칠 수 있는 소프트웨어 취약점을 의미
- 이번에 발견된 log4j 취약점에 해당
0-데이 취약점
- log4j 보안 이슈는 0-데이 취약점(0 Day Vulnerability)에 해당
- 0-데이 취약점이란 해커들이 개발자들보다 먼저 발견한 취약점을 의미
- 개발자들은 취약점의 존재를 모르므로 공격 당했는지도 모름
Log4j
- Log4j는 로깅 유틸리티로 아파치 오픈소스 라이브러리
- 전 세계의 수 많은 서비스들이 Log4j를 로깅 유틸리티로 사용
- 현재 문제가 있는 log4j라이브러리는 log4j-core-<version>.jar
Log4j 취약점
- Log4j취약점은 Log4j가 넘겨받은 변수를 그대로 로깅하는것이 아니라 해당 변수를 분석해 실행 할 수 있는 경우 Lookups 기능에서 발견
- 현재 취약점은 룩업 기능 중에서도 특히 JDNI라는 룩업을 이용해 공격이 가능
- 2021년 11월 24일 Alibaba Cloud 보안 팀은 Apache Log4j 2 원격 코드 실행 취약점을 Apache에 공식적으로 보고
- Apache Log4j 2의 일부 기능에는 재귀 분석 기능(recursive analysis functions)이 있기 때문에 공격자가 직접 악성 요청을 구성하여 원격 코드 실행 취약점을 유발할 수 있음
예시
log.info("디버깅 {} ", str);
에서 str이 ${env:USER}이라면 ${env:USER}를 그대로 로그를 남기지 않음
- USER가 누군지 찾아서, "디버깅: userName" 이런식으로 안의 구문을 실행한 후 출력
LDAP
- ldap은 Lightweight Directory Access Protocol의 약자로, 분산 디렉터리 서비스에서 사용자, 시스템, 네트워크, 서비스, 앱 등의 정보를 공유하기 위한 오픈 프로토콜
- 디렉터리는 계층 구조로 구성된 레코드의 집합으로 위 정보로 구성
- 현재 가장 쉽게 공격 할 수 있는 방법은 HTTP 헤더 User-Agent에 ldap주소를 넣어 코드를 다운받는 방법
- Client, Server 구조를 기반
LDAP은 TCP/IP Layer 기반이기 때문에 X.500보다 경량화된 구조
- LDAP 정리 참고
LDAP 취약점
- User-Agent가 아닌 다른 헤더나, 혹시 서버 어플리케이션이 리퀘스터에게서 받은 문자열을 로깅하는 경우에도 취약 확인
- HTTP서버가 아니라 Job서버나 Async Worker 어플리케이션 등 사용자가 지정한 문자열을 로깅하기만 하면 취약점에 노출 될 수 있음
${jndi:ldap://<host>:<port>/<path>}
JNDI / JNDI를 이용한 공격
JNDI
- JNDI(Java Naming and Directory Interface)는 디렉터리 서비스에서 제공하는 데이터 및 객체를 발견(discover)하고 참고(lookup) 하기 위한 자바 API
- 자바 애플리케이션을 외부 디렉터리 서비스에 연결 (예: 주소 데이터베이스 또는 LDAP 서버)
- 자바 애플릿이 호스팅 웹 컨테이너가 제공하는 구성 정보를 참고
JNDI를 이용한 공격
- 공격자가 경로를 자신의 서버로 지정하면 취약점이 있는 서버가 공격자의 서버에서 클래스를 다운받는 것
- 이렇게 공격자의 클래스를 다운받아 코드를 실행하는 것을 RCE(Remote Code Execution)이라고 함
예시
조치사항
버전확인
- log4j가 설치된 경로의 "pom.xml"파일을 열어 "log4j-core"로 검색
- 검색결과 "사용버전(version)" 확인가능
조치
- 2.0-beta9 ~ 2.10.0 버전의 경우
- JndiLookup 클래스를 경로에서 제거
zip -q -d log4j-core-*.jar org/apache/logging/log4j/core/lookup/JndiLookup.class
- 2.10 ~ 2.14.1 버전의 경우
- log4j2.formatMsgNoLookups 또는 LOG4J_FORMAT_MSG_NO_LOOKUPS 환경변수를 true로 설정
기타
출처
참고