Log4J 취약점에 대해서

Kim Ju Young·2022년 1월 31일
0

Spring

목록 보기
3/3
post-thumbnail

시작하기 전에

Log4j 취약점은 2013년부터 내재된 취약점이었다. 하지만 발견된건 2021년 11월 후반 즈음이었고 우리나라 사이버 침해 대응 기관인 KISA는 Apache Log4j 보안 업데이트 권고 (Update. 22-1-3 14:40)를 2021년 12월에 작성하였다. 해당 취약점은 12월 한달동안 인터넷 세상을 뜨겁게 달구었을 뿐만 아니라 향후 몇 년 간 영향을 끼칠 수 있는 취약점이다. 개인적으로 호기심이 가서 관련 글을 쓰게 되었다.

Log4j란?

자, 그럼 취약점에 대해 알기 전에 Log4J가 무엇인지 알아야한다. Log4J는 어디서 발견할 수 있을까?

Spring Framework에는 Spring Legacy Project를 생성하자마자 보이고, Spring Boot는 Maven Dependency안에 들어있는 걸 볼 수 있다. 이게 뭔데 Spring에 다 들어있는걸까?

Spring은 빌드 자동화 도구가 포함되어 편리하기로 유명한데, 이 빌드 자동화 도구에는 Maven과 Gradle이 있다. Maven과 Gradle에서 Log4j를 유용한 패키지로 인정하여 자동적으로 추가해주기 때문에 Log4j가 포함되었다.

Log4j는 Apache에서 만들었으며 Apache 재단이 쓴 Log4J 소개글에 보면 왜 만들었는지 알 수 있다.

코딩으로 로그문을 출력하는 건 디버깅을 위한 수준 낮은 방법이지만, 디버거를 항상 사용할 수 있거나 적용할 수 있는 것은 아니기 때문에 유일한 방법일 수도 있습니다.

프로그램은 완벽할 수 없기 때문에 만들고 나면 버그도 뜨고 버그를 잡아주어야한다. 이 때, 디버깅 툴이 있다면 수준 높은 디버깅을 할 수 있지만 디버깅 툴을 사용하는 것보다 그냥 값을 출력해보는게 간편할 때가 있다. 솔직히 디버깅 툴 귀찮다

그런 사람들을 위해 제공해주는 API라고 생각하면 되겠다. 엥. 근데 대충 출력할 때 System.out.println 쓰면 되지않나?

System.out.println은 로그문 출력보다는 그저 콘솔 출력이라고 생각할 수 있겠다.

그리고 BackJoon이나 Java에 대해 공부해보면 System.out.println이 상당히 느린 메소드인 것을 알 수 있다. BufferedWriter를 써야 출력이 빨라지는데 그래서 속도가 중요한 프로그램은 BufferedWriter를 쓴다.

로그문 출력은 본 프로그램에 영향을 안 미치는 것 또한 중요하기 때문에 Log4J가 훌륭한 속도로 출력을 수행하여 채택되었다고 생각할 수 있다.

정리

  • Log4J는 디버깅 용도로 원하는 위치에 로그문을 남겨주는 로깅 패키지이다.
  • Java기반에서 Maven,Gradle같은 빌드 자동화 도구를 사용한다면 웹 프로젝트에 기본적으로 들어가있을 확률이 크다.

Log4j 취약점

Log4j에 대해 알았으니 이제 어떻게 취약점이 발생한 건지 알아봐야한다.

socradar에서 쓴 글을 참조하였다.

해당 취약점을 이해하기 위한 키워드로는 JNDI, LDAP이다. LDAP보다는 JNDI를 아는게 중요할 것 같아 LDAP은 짧은 설명으로 넘어가겠다.

JNDI(Java Naming and Directory Interface)

JDNI는 디렉터리 서비스에서 제공하는 데이터 및 객체를 발견(discover)하고 참고(lookup) 하기 위한 자바 API다.

어라? 이거 예전에 쓴 글인 [Spring] Connection pool 을 위한 셋팅 이거에서 쓴 거 같은데...?

Connection pool을 하기 위해서 xml에 적는 이것이 JNDI를 사용하는 예라고 볼 수 있겠다.

  1. context.xml에 적힌 Resource 태그 정보를 토대로 리소스가 만들어진다.
  2. root-context.xml에 적힌 bean은 JndiObjectFactoryBean객체를 생성한다.
  3. 이 때, property는 매개변수이므로 리소스가 매개변수로 들어가서 객체를 찾아 쓸 수 있게 반환해준다.
    (JndiObjectFactoryBean은 내부적으로 lookup() 메소드를 실행한다.)

JNDI는 리소스 이름으로 생성된 객체를 찾아서 쓸 수 있게 해주는 서비스라고 생각하면 된다.
(직접 객체를 생성해주는게 아니다.)

LDAP(Lightweight Directory Access Protocol)

경량 디렉터리 액세스 프로토콜은 TCP/IP 위에서 디렉터리 서비스를 조회하고 수정하는 응용 프로토콜이다.

사실 LDAP을 정확히 이해하기 위해선 DAP과 X.500 문서에 대한 이해가 필요하다. 거기까지 설명하기엔 방대한 양이 될거 같아 LDAP과 DAP 문서를 참고하길 바란다.

줄이자면, LDAP은 파일이나 장치들 같은 리소스 위치를 찾게해주는 디렉터리 서비스라고 생각하면 된다.

다만, 여기서 헷갈리지 말아야 할 점은 로컬이 아닌 네트워크 환경이란 것이다. 쉽게 생각하면 로컬이 아닌 네트워크 상에서 파일탐색기를 쓴다고 생각하면 되겠다.

그래서 취약점이 어떻게 생겼는데?

우리는 기본적으로 주소창을 이용하여 서버에 HTTP 메세지를 보낼 수 있다. (www.naver.com 도 하나의 HTTP 메세지이다.)

하지만, 이렇게 주소창만을 사용하면 HTTP 메세지를 보낼 수만 있을 뿐 실제로 어떤 응답이 오는지 쉽게 확인할 수 없다.

응답이 오기 위해선 curl이라는 웹 요청 명령형 도구가 있다. 어라? 많이 보던 도구 아닌가?
평소엔 REST API를 테스팅하는 아주 좋은 도구이다. 하지만, 이번엔 취약점을 확인할 뿐만 아니라 해킹에 쓸 수도 있다.

Curl을 사용하여 확인하는 방법으로 김형준님이 쓴 보안 취약점 동작원리이다.

쓰신 글만 읽어도 쉽지만, 요약해서 2가지를 잘 봐두면 핵심부분을 파악할 수 있다.

  1. Log4j는 로그를 출력할 때 로그에 사용자ID 등이 있다면, 자동으로 LDAP서버등에 접속한다.
  2. JNDI lookup

1번이 핵심적인 취약점인데, 로그를 집어넣기만 하더라도 사이트의 디렉터리 서비스로 접속할 수 있다는 말이다. 앞에서도 말했듯이 디렉터리 서비스로 접속할 수 있다면 파일탐색기를 킨 것과 다를바 없어진다고 생각하면 되겠다.

2번의 JNDI Resource를 lookup 했다는 말은 만약, hacker-server의 context.xml에 해당 이름의 Resource가 있었다면, Resource의 정보가 들어와 객체를 반환할 수 있었다는 말이다. 이해가 잘 안된다면 해당 글의 JNDI 항목을 보길 바란다.

해당 해커의 객체를 반환하게 되면 모르는 Java 코드가 실행되는 것과 같다고 생각하면 되겠다.

Log4j 취약점을 직접 눈으로 보고 실습하고 싶은 사람은 해당 사이트에서 실습을 진행할 수 있다.

마무리하며

Log4j 취약점은 Log4j에서 사용하는 JNDI를 통해 해킹하고자 하는 서버의 디렉터리 서비스를 악용할 수 있는 취약점이다.

Log4j 취약점이 뭐야?! 라고 물어본다면 다음과 같이 답할 수 있겠다.

Log4j는 자바기반에서 쓰는 웹 프로젝트라면 대체로 쓰는 로깅 패키지이다. 자바기반을 쓰는 곳이 어디인가? 전자정부표준프레임워크를 쓰는 공공기관 및 공기업, 은행권이자 국비과정에서 배우는 웹 프로젝트들이 거의 대부분 자바기반을 쓴다고 생각하면 되겠다.

그러다보니 Log4j 취약점이 굉장히 핫한 주제일 수 밖에 없었다. 지금에 와서야 Log4j 취약점이 너무 뜨거울 때가 아닌 뜨뜻해질 때 쓴 것 같아 참고할 수 있는 정보가 많았다. 쓰다보니 모르는 단어와 정보가 많아 쓰는데 오래걸렸지만 얻은게 많았다. Log4j 취약점에 관련한 Log4j, JNDI, LDAP만큼은 앞으로 기억에 많이 남을 것 같다.

참고

아파치 재단에서 쓴 Log4j 소개문서
Log4j 2 Overview - 아파치 LOG4J™ 2

socradar에서 쓴 Log4j 취약점 총정리 - 삽화까지 나와있어 추가적으로 잘 이해할 수 있다.
Log4j 치명적인 취약점에 대해 알아야 할 사항은 무엇이며 무엇을 할 수 있습니까? - socradar.io

실무자 분이 쓰신 Log4j 글이다. 통찰력을 발견할 수 있었다.
log4j 보안 취약점 동작원리 및 jenkins 서버 확인 방법 - 김형준님

LDAP과 DAP - DSMENTORING Tech Blog
Wikipedia - JDNI
Wikipedia - LDAP

profile
호호선생

0개의 댓글