IT etc

Log4j2 취약점 (CVE-2021-44228) 대응 및 수정하기 (2.17.0 적용)

내. 일. 을 바꾸는 업무 자동화 2021. 12. 13. 08:52
반응형

지난 12월 10일(금) apache 재단에서 개발 된 자바라이브러리 중 Log4j2에서 취약점이 보고 되었습니다. 

KISA에서는 취약점 해결을 위해 보안 업데이트를 권고하였는데요, 

알려진 주요 취약점으로는 Log4j 2.x.x에서 발생하는 원격코드 실행 시, 악성코드 감염 등 피해가 발생될 수 있는만큼 긴급하게 패치가 필요하다는 내용이었습니다. 위험도가 10점으로 가장 높은 위험도를 가지고 있는만큼 패치를 진행해 주셔야 할 것 같습니다. 

 

Log4j 2.x.x는 아시다시피 어플리케이션의 로그를 남가기 위해 사용되는 오픈소스 인데요, 

저의 경우 Maven 기반의 어플리케이션이 대부분이라 권고 버전인 Log4j 버전 2.15.0으로 업데이트를 진행하려 합니다. 

※ 12/20 내용추가 : 2.17.0 버전으로 업데이트 하셔야 합니다.

KISA 인터넷 보안공지 바로가기 

먼저, 현재 어떤 버전에 의존성이 설정되어 있나 확인해 보았습니다.

개발환경에서 pom.xml 파일을 오픈 하여, Dependency 항목에서 log4j로 검색을 해 봅니다. 

만약, log4j 1.x.x. 버전대라면 아래와 같은 내용을 찾을 수 있을 것입니다. 

log4j 1.x.x 버전이 적용된 경우

참고로, 1.x.x 버전은 이번 보안 이슈와 무관합니다. 만약 2.17.0 적용을 원하시면, 아래 case1) 참고하셔서 변경하시면 됩니다. 

 

2.x.x를 사용하고 있다면, pom.xml 파일에서 "log4j-core x.x.x"이 있는지 검색 해 봅니다. 

Apache log4j-core만 해당됩니다. 

혹시 개발환경에서 확인이 어렵다면, 운영환경의 WEB-INF/lib 폴더에서 "log4j-core x.x.x"이 있는지 확인합니다. 

log4j 2.x.x 버전이 적용된 경우

이제 해결을 위해 어떤 방법을 적용할 지 선택해야 하는데요, 

가장 좋은 권고사항은 버전을 높이는 방법입니다.

다만.. 이 경우에는 java8 버전이 필요하답니다.  java7 버전의 마지막 지원되는 버전이 2.12.1이므로..

 

case1) 2.13.0  ~ 2.16.0 이 적용되어 있다면 간단하게 적용이 가능합니다. 

pom.xml 파일의 log4j 디펜던시의 버전을 2.17.0 으로 명시하여 maven 업데이트를 진행해 주시면 바로 적용되니 간단하게 처리가 가능하겠죠? 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<!-- log4j -->
<!-- log4j 사용을 위한 필수 라이브러리 -->
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-api</artifactId>
            <version>2.15.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-core</artifactId>
            <version>2.15.0</version>
        </dependency>
<!-- 웹 어플리케이션에서 사용을 하기 위해 추가 -->
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-web</artifactId>
            <version>2.15.0</version>
<scope>runtime</scope>
        </dependency>        
cs

 

case2) 2.10.0 버전 이하에서는 아래와 같이 환경변수 적용을 통해 처리해 주시면 됩니다. 
         (2.10 ~ 2.14.1)의 경우,

1) JAVA 실행 값의 Arguments 에 -Dlog4j2.formatMsgNoLookups=true 시스템 변수를 추가합니다.

2) 또는 JAVA 명령어를 통해 처리해도 됩니다. 
    java -Dlog4j2.formatMsgNoLookups=true -jar log4j.version.version.jar

3) 또는 LOG4J_FORMAT_MSG_NO_LOOKUPS=true 로 시스템 변수설정을 해주시면 되겠습니다. 

 

case3) 위 버전보다 낮은 버전을 사용할 경우 가장 복잡한 방법이 펼쳐지는데요..

JndiLookup, JndiManager 클래스 자체를 읽지 못하도록 수정해야 한답니다. 결국 이 해결을 위해서는 log4j-core.jar 파일을 수정해 직접 빌드해야 할 것 같은데.. 이 상황으로 해결하는 것은 별로 추천드리지 않구요.. 

log4j 외에 다른 로깅 처리 모듈로 교체를 하는 것이 맞을 것 같다는 생각이 들었습니다.

     
     | (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로 설정


다행히, log4j 1.x 버전은 이번에 발견된 취약점의 영향을 받지 않는다고 합니다.
case4) log4j 1.x의 경우에는?

이게 저의 케이스에 해당되는 경우네요.. 근데.. 그동안 log만 잘 찍히면 되지 모.. 하고 대수롭지 않게 생각했는데

어차피 log4j 1.x 버전의 경우에는 End of Life 즉... 지원이 종료되었으므로 이번기회에 다른 로깅 모듈로 변경을 계획하게 되었답니다.  간단하게는 버전을 2.15.0으로 올리면 되겠지만.. 다른 모듈로 변경도 고려해 보아야겠어요.

 

제 포스팅 중에 logback를 이용해 스프링부트 로그 설정을 진행한 포스팅이 있는데요, 

이번에 log4j 1.x를 사용하여 개발된 스프링으로 개발된 어플리케이션도 모두 logback로 변경을 진행해야 할 것 같습니다.  혹시 스프링부트에서 logback 설정 방법이 궁금하다면 여기 링크를 눌러 확인해 보시면 될 것 같습니다. 

[스프링부트 10] Spring Boot 로그 설정해 보기 (tistory.com)

 

여러분들의 시스템도 점검하여 보안패치 적용이 필요하다면 늦기전에 대비하시길 바라겠습니다. 

 

 

 

 

 

반응형