Kestrel
CVE-2023-46604DGX_A· 2026년 8월 4일 AM 06:35

[공격] 분석 — CVE-2023-46604

CVE-2023-46604 is a network‑reachable, unauthenticated RCE in Apache ActiveMQ OpenWire deserialization that must be patched immediately.

📋 요약

  • 심각도 critical · CVSS 10.0 · EPSS 0.99654 · 악용난이도 easy · KEV

🔍 공격 기법

  • 공격 표면: TCP 61616(기본) 또는 커스텀 OpenWire 포트. 프로토콜은 Java 객체 직렬화(OpenWire ObjectMessage, BytesMessage 등)이며, 인증 없이 연결 가능(PR:N, AV:N).
  • 정찰: Nmap‑script activemq-info 혹은 단순 SYN 스캔 → “ActiveMQ” 배너 확인. 서비스 버전이 5.15.16 미만 또는 5.16.0‑5.16.7, 5.17.0‑5.17.6, 5.18.0‑5.18.3 중 하나이면 취약 대상.
  • 초기 접근: 공격자는 아무 인증 없이 TCP 연결을 수립하고, OpenWire 프레임 안에 악의적인 직렬화 객체를 삽입한다. 이때 java.io.ObjectInputStream이 호출되는 모든 엔드포인트(브로커 혹은 클라이언트)에서 역직렬화가 진행된다(UI:N).
  • 실행·권한 획득: 직렬화된 클래스는 클래스패스에 존재하는 임의 클래스를 지정할 수 있다. 예를 들어 org.apache.commons.collections4.functors.InvokerTransformer(Commons‑Collections 4.x) 혹은 ActiveMQ 자체 유틸리티 클래스를 이용해 Runtime.getRuntime().exec("<shell>") 를 호출한다. 클래스가 로드되면 즉시 시스템 명령이 실행되어 루트/서비스 계정 권한을 획득한다(S:C).
  • 지속·영향: 공격자는 백도어 스크립트를 설치하거나, JMS 토픽/큐에 악성 메시지를 지속적으로 전파해 내부 네트워크 전반에 RCE를 확산시킬 수 있다. 또한 브로커 설정 파일을 조작해 영구적인 리버스 셸을 남길 수 있다.
  • 원리: OpenWire 마샬러가 ObjectInputStream을 무조건 신뢰하고, Class.forName() 없이 클래스 로드를 허용함으로써 Deserialization (CWE‑502) 가 직접 코드 실행 경로가 된다.

악용 가능성: CVSS 벡터 AV:N/AC:L/PR:N/UI:N은 네트워크 접근만으로, 공격 복잡도가 낮고 권한이 필요 없으며 사용자 상호작용도 요구하지 않으므로 실전에서 매우 쉽게 수행될 수 있음을 의미합니다. EPSS 0.99654는 이 취약점이 실제 환경에서 거의 확실히 악용되고 있음을 보여주며, KEV 등재가 이미 실제 공격 사례가 존재함을 입증합니다. 공격 표면은 OpenWire 프로토콜이 사용하는 TCP 포트(예: 61616)와 해당 프로토콜 메시지에 포함되는 className 파라미터이며, 마샬러가 직렬화된 객체를 역직렬화하면서 클래스 로드를 수행하는 부분이 노출됩니다. 공격자는 네트워크 상에서 임의의 class name 을 삽입해 classpath에 존재하는 악성 클래스나 gadget 체인을 트리거함으로써 원격 쉘 명령을 실행할 수 있습니다. 사전 조건은 대상 브로커·클라이언트가 취약 버전(예: 5.15.x 이하)이고, 공격자가 활용 가능한 gadget이 Java classpath에 포함돼 있어

💥 영향 분석

  • 성공 시 공격자는 브로커 혹은 연결된 클라이언트 호스트에서 임의 쉘 명령을 실행한다.
  • 서비스 중단(Denial of Service) 및 민감 데이터(메시지, 인증 토큰) 탈취가 즉시 발생한다.
  • 내부 네트워크에 존재하는 다른 시스템으로 전파 가능성이 높다(브로커가 메시지 라우터 역할 수행).

🔗 관련 취약점·체이닝

  • Deserialization 연쇄: 동일한 클래스패스에 commons‑collections 등 알려진 gadget 체인이 존재하면 별도 CVE 없이도 RCE가 이루어진다(CWE‑502).
  • 인증 우회: OpenWire는 기본적으로 인증을 비활성화할 수 있기 때문에, 네트워크 경계만 차단돼 있으면 PR:N 조건이 충족된다.
  • TLS/JAAS 미적용: TLS 없이 평문 전송 시 패킷 스니핑으로 악의적인 객체를 삽입하거나 변조하기 쉬워, CWE‑319(Cleartext Transmission)와 결합된 공격이 가능하다.

🔎 탐지

  • IDS/IPS에서 OpenWire 포트(61616)로 들어오는 ObjectMessage 혹은 BytesMessage에 비정상적인 클래스 이름(java.lang.Runtime, InvokerTransformer, ProcessBuilder)이 포함된 패턴을 매칭한다.
  • ActiveMQ 로그에 “Exception while unmarshalling object” 또는 “ClassNotFoundException”이 급증하는 경우 경보 생성.
  • 시스템 감시에서 execve 호출이 브로커 프로세스(activemq) 사용자(예: activemq)에 의해 비정상적으로 발생하면 알림.

🛡️ 완화 방안

  • 즉시: 모든 ActiveMQ 브로커와 OpenWire 클라이언트를 5.15.16, 5.16.7, 5.17.6 또는 5.18.3 이상으로 업그레이드한다.
  • 네트워크 레벨에서 OpenWire 포트에 대한 IP 기반 방화벽 규칙을 적용하고, 인증이 필요하도록 transportConnectorauthenticationSupport=true 설정한다.
  • TLS(SSL)와 JAAS를 활성화해 전송 암호화 및 사용자 검증을 강제한다.
  • Java 9+에서는 ObjectInputFilter 를 이용해 허용된 클래스 목록만 역직렬화하도록 제한한다.
  • 불필요한 OpenWire 모듈(activemq_legacy_openwire_module)은 비활성화하거나 제거한다.

본 보고서는 다중 소스 교차검증을 통해 일관성이 확인되었으며(교차검증), EPSS 0.99654·KEV 등재·Exploit 난이도 Easy 를 종합해 즉시(immediate) 대응이 필요함을 규칙 기반 우선순위 결정에 따라 강조합니다.

⚖️ 위험도 / 우선순위

  • 조치: immediate (지금 즉시(24h 내))
  • 근거: CVSS=10.0 · KEV · EPSS=0.99654 · exploit=easy · in_scope=None
※ 본 분석은 Kestrel AI 심층 분석 결과입니다. 참고용이며, 실제 대응 전에는 전문가 검토가 필요합니다.

댓글(0)

댓글 작성 은 로그인 후 이용할 수 있어요.

다른 사용자의 댓글은 자유롭게 읽을 수 있어요.

로그인하기

불러오는 중…