
Docker-лаборатория для сравнения уязвимых и пропатченных сборок MCPJam Inspector для CVE-2026-23744, демонстрирующая различия в сетевой привязке и экспонировании API в образовательных целях исследования безопасности.
Этот репозиторий — небольшая Docker-лаборатория для сравнения уязвимой и пропатченной сборок MCPJam Inspector для CVE-2026-23744.
Он предназначен для обучения и создания публичного портфолио по безопасности: быстрая настройка, наглядные доказательства и скриншоты.
⚠️ Этика / область применения: Тестируйте только на системах, которыми вы владеете или на которые у вас есть явное разрешение. Этот репозиторий предназначен для локального воспроизведения и документирования.
/api/mcp/connect) существует и отвечает без запроса аутентификации в уязвимой конфигурации.Это соответствует рекомендациям вендора / публичным отчётам:
.
├── docker-compose.yml
├── vuln/
│ └── Dockerfile
├── patched/
│ └── Dockerfile
└── docs/
└── (сюда помещаются скриншоты)
Соберите и запустите оба контейнера:
docker compose up -d --build
Проверьте, что они запущены:
docker compose ps
Ожидаемый результат:
inspector_vuln_142 опубликован на 127.0.0.1:6274inspector_patched_143 опубликован на 127.0.0.1:6275 (но он не должен быть доступен с хоста)
Конечная точка присутствует и отвечает ошибкой валидации, когда обязательные поля отсутствуют:
curl -i -X POST http://127.0.0.1:6274/api/mcp/connect \
-H 'Content-Type: application/json' \
-d '{}'
Ожидайте HTTP/1.1 400 и что-то вроде:
{"success":false,"error":"Failed to parse request body","details":"Unexpected end of JSON input"}
Внутри контейнеров проверьте, какой адрес слушает порт 6274:
# уязвимая версия
docker exec -it inspector_vuln_142 sh -lc "apk add --no-cache iproute2 >/dev/null 2>&1; ss -lnt | grep 6274"
# пропатченная версия
docker exec -it inspector_patched_143 sh -lc "apk add --no-cache iproute2 >/dev/null 2>&1; ss -lnt | grep 6274"
Ожидаемый результат:
0.0.0.0:6274127.0.0.1:6274
Даже если мы пробрасываем 127.0.0.1:6275 -> container:6274, пропатченный контейнер слушает только на собственном loopback-интерфейсе. Поэтому с хоста вы должны увидеть закрытие соединения / пустой ответ.
curl -v http://127.0.0.1:6275/
Ожидаемый результат: недоступно (это и есть работающая мера смягчения).
Чтобы доказать, что UI пропатченной версии всё ещё работает, выполните curl изнутри контейнера:
docker exec -it inspector_patched_143 sh -lc "apk add --no-cache curl >/dev/null 2>&1; curl -i http://127.0.0.1:6274/"
Ожидаемый результат: HTTP/1.1 200.


Во время локального тестирования уязвимого контейнера я подключил strace к процессу сервера Inspector и наблюдал, как он порождает дочерний процесс и вызывает execve().
Я намеренно не включаю готовый эксплойт-пейлоад.
Что зафиксировать:
execve("/bin/sh", ["sh","-c", "..."], ...) = 0
execve("/usr/bin/...", [...], ...) = 0
нормальное завершение дочернего процесса (статус 0)

Этот репозиторий предназначен для оборонительных исследований, обучения и воспроизводимой проверки в контролируемой среде. Не используйте его против систем, которыми вы не владеете или на тестирование которых у вас нет разрешения.