Elastic Security를 사용한 CVE-2021-44228(Log4j2) 취약점 공격 탐지

blog-security-detection-720x420.png

중요한 유의사항:

  • Elastic이 현재 Elastic 제품에서 이러한 취약점에 대한 내부 위험을 어떻게 평가하고 있는지 이해하려면여기를 참조하세요.
  • 이 블로그는 2021년 12월 14일에 업데이트되었으며, 최초 게시 이후 추가 탐지 및 헌팅 기능이 개선되었습니다.

개요

이 블로그 게시물은 CVE-2021-44228의 요약을 제공하며 Elastic Security 사용자가 사용자 환경에서 액티브 취약점 공격을 찾을 수 있는 탐지를 제공합니다.

더 자세한 내용을 알게 되면 이 게시물에 대한 추가 업데이트를 제공해 드리겠습니다. 이 버전은 2021년 12월 14일 화요일을 기준으로 정확합니다. Apache의 업데이트는 Log4j2의 보안 페이지를 통해 직접 조사할 수 있습니다.

CVE-2021-44228 요약(Log4Shell)

Log4j2는 최종 사용자 시스템과 서버 양쪽 모두에서 많은 Java 기반 애플리케이션에 통합된 오픈 소스 로깅 프레임워크입니다. 2021년 11월 말, 알리바바 클라우드 보안팀의 첸 자오준은 원격 코드 실행의 취약점을 확인하였으며, 최종적으로 CVE ID: CVE-2021-44228로 보고되었고, 2021년 12월 10일 대중에게 공개되었습니다. 이 취약점 공격은 프레임워크에 전달된 사용자 입력의 부적절한 역직렬화를 통해 이루어집니다. 원격 코드 실행을 허용하고 공격자가 대상 시스템에서 환경 변수와 같은 중요한 데이터를 유출하거나 악성 소프트웨어를 실행할 수 있습니다.

확인된 취약점은 버전 2.0-beta9에서 버전 2.14.1까지의 모든 Log4j2 버전에 영향을 미칩니다. 이 문제를 해결하기 위한 초기 방법들은 많은 릴리즈 후보들을 낳았고, 이 게시물 당시 프레임워크를 Log4j2 2.15.0-rc2로 업그레이드하라는 권고로 절정에 이르렀습니다.

사소한 복잡성과 관찰된 광범위한 취약점 공격의 특성을 고려할 때, 취약한 버전의 Log4j2를 활용하는 소프트웨어를 식별한 모든 환경에서 완화를 중요한 사항으로 간주해야 합니다.

Elastic Security에서 Log4Shell 공격 탐지

Elastic Security 사용자는 다음 이벤트 상관 관계 탐지 규칙을 사용하여 Log4j2의 액티브 취약점 공격을 식별할 수 있습니다. 호스트 기반 이벤트 데이터의 형식에 따라 데이터 필드에 맞게 이 탐지를 수정해야 할 수도 있습니다.

엔드포인트 데이터 사용 시 탐지 규칙

sequence by host.id with maxspan=1m
 [network where event.action == "connection_attempted" and 
  process.name : "java" and
  /* 
     outbound connection attempt to 
     LDAP, RMI or DNS standard ports 
     by JAVA process 
   */ 
  destination.port in (1389, 389, 1099, 53, 5353)] by process.pid
 [process where event.type == "start" and 

  /* Suspicious JAVA child process */
  process.parent.name : "java" and
   process.name : ("sh", 
                   "bash", 
                   "dash", 
                   "ksh", 
                   "tcsh", 
                   "zsh", 
                   "curl",
                   "perl*",
                   "python*",
                   "ruby*",
                   "php*", 
                   "wget")] by process.parent.pid

Auditbeat 데이터 사용 시 탐지 규칙

sequence by agent.id with maxspan=1m
 [network where event.action == "connected-to" and 
  process.name : "java" and
  /* 
     outbound connection attempt to 
     LDAP, RMI or DNS standard ports 
     by JAVA process 
   */ 
  destination.port in (1389, 389, 1099, 53, 5353)] by process.pid
 [process where event.type == "start" and 

  /* Suspicious JAVA child process */
  process.parent.name : "java" and
   process.name : ("sh", 
                   "bash", 
                   "dash", 
                   "ksh", 
                   "tcsh", 
                   "zsh", 
                   "curl",
                   "perl*",
                   "python*",
                   "ruby*",
                   "php*", 
                   "wget")] by process.parent.pid

Endgame 스트리밍 이벤트 사용 시 탐지 규칙

sequence by agent.id with maxspan=1m
 [network where event.category == "network" and 
  process.name : "java" and
  /* 
     outbound connection attempt to 
     LDAP, RMI or DNS standard ports 
     by JAVA process 
   */ 
  destination.port in (1389, 389, 1099, 53, 5353)] by process.pid
 [process where event.type == "start" and 

  /* Suspicious JAVA child process */
  process.parent.name : "java" and
   process.name : ("sh", 
                   "bash", 
                   "dash", 
                   "ksh", 
                   "tcsh", 
                   "zsh", 
                   "curl",
                   "perl*",
                   "python*",
                   "ruby*",
                   "php*", 
                   "wget")] by process.parent.pid

이 탐지 규칙은 LDAP, RMI 및 DNS용 표준 포트(최근 발견된 JAVA/JNDI 주입 공격을 통해 종종 남용됨)에 대한 아웃바운드 연결 시도 시퀀스와 이에 이어 진행되는 동일한 Java 프로세스 인스턴스의 하위 프로세스를 찾습니다.

이제 이 규칙이 log42j 취약점 공격을 탐지하는 방법을 시연해 보겠습니다.

위의 스크린샷에서는 공격자가 base-64로 인코딩된 페이로드로 취약점을 공격하는 모습을 보여 줍니다.

위의 스크린샷에서는 공격자가 Christophe Tafani-Dereeper에서 만든 취약한 예제 애플리케이션을 대상으로 base-64로 인코딩된 페이로드로 취약점을 공격하는 모습을 보여 줍니다.

이 스크린샷에서는 Elastic Security 내에서 CVE-2021-44228의 액티브 취약점 공격 탐지를 보여 주며 취약점 공격의 경보 및 타임라인 보기를 자세히 설명합니다.

이 스크린샷에서는 Elastic Security 내에서 CVE-2021-44228의 액티브 취약점 공격 탐지를 보여 주며 취약점 공격의 경보 및 타임라인 보기를 자세히 설명합니다.

위의 스크린샷에서는 탐지 경보 조사에서 Java가 셸 스크립트를 실행하여 bash 스크립트를 다운로드하고 실행했음을 보여줍니다.

위의 스크린샷에서는 탐지 경보 조사에서 Java가 셸 스크립트를 실행하여 bash 스크립트를 다운로드하고 실행했음을 보여줍니다.

업데이트: 탐지 및 헌팅 기능 개선


Java를 통한 의심스러운 셸 명령 실행

log4j 취약점 공격을 통해 제공되는 공개적으로 알려진 악성 Java 클래스를 기반으로 의심스러운 셸 스크립트 및 수신 도구 전송 명령을 헌팅할 수 있습니다.

process where event.type == "start" and
  process.parent.name : "java*" and

  /* Ingress tools transfer via common shell command interpreters */

  /* linux or macos */
  (
   (process.name : ("sh", "bash", "python*") and 
    process.command_line : ("*curl*|*sh*", "*wget*|*bash", "*curl*|*bash*", "*curl*|*bash*", "*http*|*sh*", "*python*http*")) or

  /* windows */
  (process.name : ("powershell.exe", "pwsh.exe", "cmd.exe") and
   process.command_line : ("*.downloadstring*", "*.downloadfile*", "*.downloaddata*", "*BitsTransfer*", "* -enc*", "* IEX*", "*wp-content*", "*wp-admin*", "*wp-includes*", "*$*$*$*$*$*", "*^*^*^*^*^*^*^*^*^*", "*.replace*", "*start-process*", "*http*", "*cmd*powershell*")))

JAVA를 통한 신뢰할 수 없는 파일 실행

JAVA 인터프리터가 실행 파일(PE/ELF)을 생성하고 이어 파일이 실행되는 시기를 식별합니다.

엔드포인트 데이터 사용 시 탐지 규칙

sequence by host.id with maxspan=5m
 [ file where event.type != "deletion" and 
  process.name : ("java", "java.exe", "javaw.exe") and 

  (file.extension : ("exe", "com", "pif", "scr") or
      /* Match Windows PE files by header data (MZ) */
  file.Ext.header_bytes : ("4d5a*", "7f454c46*")) and 

  not file.path :  ("?:\\Program Files\\*", 
                    "?:\\Program Files (x86)\\*") ] by file.path
 [ process where event.type == "start" and 
  not process.code_signature.trusted == true ] by process.executable
Endgame 스트리밍 이벤트 사용 시 탐지 규칙
sequence by agent.id with maxspan=5m
  [ file where event.type != "deletion"
    process.name : ("java", "java.exe", "javaw.exe")] by file_path
  [ process where event.type == "start" and 
  not process.code_signature.trusted == true] by process_path

잠재적인 CoinMiner 활동

암호화폐 채굴자에게 공통적인 명령줄을 가진 프로세스(log4j 취약점 공격을 활용하는 대부분의 관찰된 캠페인은 CoinMiner입니다):

process where event.type == "start" and 
 process.command_line : 
       ("* pool.*", "*-u*--coin*", "*.xmr.*", "*.xmr1.*", 
        "*stratum*", "*elitter.net*", "*cryptonight*", 
        "*-a scrypt*", "*stratum1*", "*-userpass*", "*-max-cpu-usage*", 
	  "*qhor.net*", "*-wallet*pool*", "*--donate-level*", "*supportxmr.com*")

커뮤니티 탐지

광범위한 취약점 공격에 대해 논의하는 많은 커뮤니티 구성원들은 분석가들이 사용하는 시스템이 취약점 공격을 당했는지 또는 액티브 취약점 공격이 진행 중인지 확인하기 위해 활용할 수 있는 여러 가지 조기 탐지 방법에 대한 인사이트를 제공해왔습니다.

  • GreyNoise team 팀은 시스 내템에 저장된 로그를 탐색하려는 분석가들을 위해 인코딩된 변형과 디코딩된 변형 모두를 포함하는 페이로드를 포함하여 일련의 페이로드를 공유해왔습니다. 이것은 취약점에 대한 공격을 시도하는 태그가 지정된 초기 IP 목록으로 보완되었습니다.

  • Nextron Systems의 Florian Roth는 그의 Github 계정에 나열된 Gist의 초기 YARA 시그니처와 함께 grep / zgrep을 사용하여 로컬 취약점 공격에 대한 일련의 검사를 제공했습니다. Florian은 또한 취약점 공격에 대해 관리할 수 있는 시스템을 테스트하기 위해Thinkst CanaryTokens을 생성하는 방법을 공유했습니다.

추가 완화 전략

업데이트할 Log4j2 프레임워크의 최신 패치 버전 배포에 대한 Apache 팀의 권장 지침 외에도, 취약점 공격 방지를 위한 여러 완화 권장 사항이 제안되었습니다.

  • Fastly는 사용 중인 Log4j 버전이 원격 서버에 대한 조회 기능을 사용하지 않도록 JAVA_OPTS=-Dlog4j2.formatMsgNoLookups=true로 JVM 실행을 지원하는지 확인할 것을 제안했습니다. 이 내용은 2.10.0 ~ 2.15.0 버전에 적용됩니다.

  • 취약한 호스트의 측면 이동 또는 네트워크 상의 취약점 공격을 방지하려면 잠재적으로 취약한 시스템에서 신뢰할 수 있는 애플리케이션 및/또는 서비스에 대한 외부 리소스로의 연결을 제한하는 것이 좋습니다.

Elastic Security에서 전하는 감사의 말

오늘과 주말 내내 지칠 줄 모르고 일해 주신 전 세계 모든 보안팀 분들, 특히 이 게시물에 나와 있는 여러분 모두에게 감사드립니다. 이러한 심각하고 광범위한 취약점에 직면할 경우 모든 사용자를 보호하기 위한 보안 커뮤니티의 개방성과 협업이 무엇보다 중요합니다. 우리가 매 순간 여러분과 함께 있다는 것을 알아주셨으면 합니다.

기존 Elastic Security는 제품 내에서 이러한 기능에 액세스할 수 있습니다. Elastic Cloud를 처음 접하시는 경우, 빠른 시작 안내서(빠른 시작을 위한 짤막한 길이의 교육용 비디오)나 무료 기초 교육 과정을 살펴보세요. Elastic Cloud 14일 무료 체험판을 통해 언제든지 무료로 시작하실 수 있습니다. 또는 자체 관리형 버전의 Elastic Stack을 무료로 다운로드하세요.

참고 자료

https://www.lunasec.io/docs/blog/log4j-zero-day/

https://www.tenable.com/blog/cve-2021-44228-proof-of-concept-for-critical-apache-log4j-remote-code-execution-vulnerability

https://www.crowdstrike.com/blog/log4j2-vulnerability-analysis-and-mitigation-recommendations/

https://mbechler.github.io/2021/12/10/PSA_Log4Shell_JNDI_Injection/

https://www.greynoise.io/viz/query/?gnql=CVE-2021-44228

https://logging.apache.org/log4j/2.x/security.html#

https://github.com/christophetd/log4shell-vulnerable-app