이 취약점으로 주말에 잘쉬고 있다가 갑자기 일을 하게 되었다.. 보편적으로 안쓰는 업체가 찾기 힘든 라이브러리에서 크리티컬한 취약점이 발견된 것이다. 이후에도 지속적으로 개발 커뮤니티에도 해당 이슈가 올라와서 나도 내가 아는바에 대한 내용을 기록으로 남겨본다

 

[개요]

자바 기반으로 만들어지고 전세계적으로, 대중적(?)으로 많이 사용되는 로깅을 위한 라이브러리로 log4j가 있다.

이번 이슈가 된 취약점은 log4j가 넘겨받은 변수를 그대로 로깅하는 것이 아니라 해당 변수를 분석해 실행할 수 있는 lookups 기능에서 발견되었다. lookups란 예를들어 log.error("에러 : " + result); 에서 result가 ${env:PASSWORD}로 설정되어 있다면 "에러 : ${env:PASSWORD}"를 그대로 로깅하는 것이 아니라 이에 해당하는 설정값을 찾아 "에러 : qwer1!"를 로깅하게 되는 기능이다. lookup에는 여러가지 기능들이 있는데, 이번 케이스는 JDNI 룩업을 이용한 공격이 가능하다는 취약점이다. 이른바 Log4Shell 취약으로 불린다.

 

[취약점 공격 대상]

log4j-core 버전 2.10.0 이상 ~ 2.15.0 미만

 

[대응방법]

1. log4j를 2.15.0 이상으로 업그레이드 한다. (Java8 이상에서만 기동된다)

2. log4j 2.10.0 이상 사용 시 다음의 방법 중 한 가지 이상의 방법을 사용한다. 개인적인 의견으로는 서비스의 운영환경마다 다르겠지만.. 운영하는 웹서비스가 많아 관리 포인트가 많고 복잡할 경우.. 이 방법은 관리측면에서는 별로 좋은 방법 같진 않다. 개발자가 프로젝트 소스코드 외부에서 관리해야하고(서버/인프라 단), 이 설정이 되어있는 이유에 대해 나중에 시간이 많이 지나서 누가 보더라도 알 수 있도록 히스토리를 잘 관리해야 한다는 점..

  •  
  • Java 실행 인자(Arguments) 에 시스템 속성을 추가한다. -Dlog4j2.formatMsgNoLookups=true
  • Java 실행 계정의 환경 변수 혹은 시스템 변수로 LOG4J_FORMAT_MSG_NO_LOOKUPS=true를 설정한다.

3. log4j 2.7.0 이상 사용 시 log4j 설정(log4j.xml 등)에 PatternLayout 속성에 있는 %m 부분을 %m{nolookups} 으로 교체한다.

4. 만약 log4j 버전이 2.10.0보다 낮다면, 이번 이슈의 공격대상은 아니다.. 그렇지만 1버전 대의 경우는 지원이 중단되었으며, 이미 RCE 보안이슈가 존재하므로 가급적 업그레이드 방안을 모색하는 것이 좋다

 

[팁]

위 대응방법은 기본적인 조치 방법에 대해 설명한 것이고, 이와 더불어 조치 시 아래 오픈소스를 참고하면 빠르게 조치할 수 있다.

https://github.com/logpresso/CVE-2021-44228-Scanner

 

GitHub - logpresso/CVE-2021-44228-Scanner: Vulnerability scanner and mitigation patch for Log4j2 CVE-2021-44228

Vulnerability scanner and mitigation patch for Log4j2 CVE-2021-44228 - GitHub - logpresso/CVE-2021-44228-Scanner: Vulnerability scanner and mitigation patch for Log4j2 CVE-2021-44228

github.com

해당 소프트웨어를 서버로 옮겨서 웹서비스가 설치된 디렉토리를 중심으로 탐색하면 대상 log4j를 사용중인지 확인 할 수 있다. 사용방법은 해당 레포지토리 README에 상세히 나와있고 매우 간편하다.

 

그리고 우리 서비스 외에도 밴더 솔루션등에도 log4j 이슈가 있을 수 있으니 꼭 문의를 넣어서 확인해보자

다른 환경에 있던 스프링 프로젝트를

내 개발환경으로 끌어들이니 메이븐 pom.xml에서 Missing artifact 에러가 발생했다..

한참 이유를 찾아 다녔는데

<type> 엘리먼트에 대한 속성을 지정해주지 않았기 때문이었다.

메이븐을 통해 라이브러리 의존성을 지정해 줄 때,

경우에 따라 어떤 메이븐 라이브러리는 pom에 정의된 dependency를 받아오게끔 구성되어 있다..

이런 라이브러리를 적용할때 <type>pom</type>을 빼먹으면

jar를 찾을 수 없어서 에러가 발생한다.


예시)

<!-- https://mvnrepository.com/artifact/com.github.oshi/oshi-dist -->

<dependency>

    <groupId>com.github.oshi</groupId>

    <artifactId>oshi-dist</artifactId>

    <version>3.4.0</version>

    <type>pom</type>

</dependency>


참고)

https://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html

http://knight76.tistory.com/entry/maven-type-pom


'Develop Issue > Spring' 카테고리의 다른 글

log4j 취약점 개요 및 조치 방법, Log4Shell  (1350) 2021.12.13
스프링부트로 블로그 만들기  (0) 2017.11.09
Moldel and View  (0) 2017.09.26
JSP에서 ZIP파일 만들기  (0) 2017.09.22
스프링 개발환경 만들기  (0) 2016.06.08

http://ande226.tistory.com/101

http://egloos.zum.com/kwaknu/v/4988500

개발자한테 편한 것일수록, 오픈소스일수록 개발환경을 만드는건 더욱 복잡해지고


이해해야 할 양도 많아지는 것 같다.


스프링 프레임워크의 경우도 특히나 그렇다고 생각한다.. (다운받고 설정해주어야 할 것이 정말 다양하다 -.-;)


구글링을 열심히 하던 중 스프링 개발환경을 구성하는데 있어서


절차적으로 정리가 잘되어있는 글이 있어서 여기에 URL을 남겨둔다..


http://addio3305.tistory.com/32

+ Recent posts