
От RCE в MCPJam Inspector до root — CVE-2026-23744, раскрытие токена JupyterLab, выполнение кода в ядре и повышение привилегий OPSMCP
Этот репозиторий предназначен только для авторизованных исследований безопасности, тестирования на проникновение и образовательных целей. Не используйте описанные здесь техники против систем без явного разрешения.
От RCE в MCPJam Inspector до root — CVE-2026-23744, раскрытие токена JupyterLab, выполнение кода в ядре и повышение привилегий через OPSMCP.
В этом репозитории документируется полная цепочка атак на Linux — от открытого экземпляра MCPJam Inspector до доступа уровня root.
Цепочка связывает воедино слабости в инструментарии разработчика, локальных сервисах, обработке учётных данных и авторизации приложений:
MCPJam Inspector
│ CVE-2026-23744
▼
RCE
│
▼
JupyterLab Token
│
▼
Jupyter Kernel
│
▼
User
│
▼
OPSMCP API
│
▼
Hidden Admin Tool
│
▼
Root Credential
│
▼
root
[!WARNING] Этот репозиторий предназначен только для авторизованных исследований безопасности, тестирования на проникновение и образовательных целей. Адреса целей, учётные данные, токены и другие значения, зависящие от окружения, в этом документе отредактированы или заменены лабораторными плейсхолдерами.
| Шаг | Этап |
|---|---|
| 1 | MCPJam Inspector, доступный в сети |
| 2 | Эксплуатация CVE-2026-23744 |
| 3 | Получен начальный RCE |
| 4 | Раскрыт токен JupyterLab |
| 5 | Выполнение кода в ядре Jupyter |
| 6 | Оболочка уровня пользователя |
| 7 | Анализ исходного кода OPSMCP |
| 8 | Обнаружены захардкоженные API-учётные данные |
| 9 | Злоупотребление скрытой административной функциональностью |
| 10 | Раскрыты root-учётные данные |
| 11 | root |
Первоначальная разведка направлена на выявление сервисов, доступных извне.
nmap -sC -sV -oN nmap_initial.txt TARGET
Затем можно выполнить полное сканирование TCP:
nmap -p- --min-rate 5000 -oN nmap_full.txt TARGET
Релевантные внешние сервисы:
| Порт | Сервис | Роль |
|---|---|---|
| 22 | SSH | Удалённое администрирование |
| 6274 | MCPJam Inspector | Начальная поверхность атаки |
Сервисы, привязанные только к localhost:
| Порт | Сервис | Уровень привилегий |
|---|---|---|
| 8888 | JupyterLab | Пользователь |
| 5000 | OPSMCP | root |
Доступный извне MCPJam Inspector на порту 6274 становится начальной точкой входа.
Открытый экземпляр MCPJam Inspector подвержен CVE-2026-23744.
MCPJam Inspector в первую очередь предназначен как интерфейс для разработки и тестирования MCP-серверов. Уязвимость становится особенно опасной, когда этот интерфейс доступен из недоверенной сети — уязвимая конфигурация позволяет данным, контролируемым атакующим, попасть в путь выполнения команд.
Remote Request
│
▼
MCP Server Configuration
│
▼
Command Execution
│
▼
Initial Shell
Уязвимость затрагивает версии MCPJam Inspector вплоть до 1.4.2 включительно. Для авторизованного тестирования можно использовать публичный proof of concept для проверки уязвимости в целевой среде.
После успешной эксплуатации подтвердите контекст выполнения:
id
whoami
hostname
После получения начальной точки опоры становятся видны локальные сервисы.
ss -tlnp
ps aux | grep -E 'jupyter|python|node'
Network
│
▼
MCPJam Inspector
:6274
│
▼
Initial RCE
│
┌─────────┴─────────┐
▼ ▼
JupyterLab OPSMCP
:8888/local :5000/local
│ │
▼ ▼
User root
Особый интерес представляет разница в привилегиях между двумя внутренними приложениями.
Процесс JupyterLab был запущен с токеном аутентификации прямо в командной строке:
--ServerApp.token=<JUPYTER_TOKEN>
Командную строку можно посмотреть через:
ps aux | grep jupyter
# or
cat /proc/<PID>/cmdline
Это демонстрирует типичную проблему управления секретами:
Secret → Command-line argument → Process metadata → Local credential disclosure
Восстановленный токен предоставляет доступ к локальному Jupyter API.
Jupyter предоставляет REST API для управления ядрами. После аутентификации с восстановленным токеном ядро можно создать через:
POST /api/kernels
Ответ содержит UUID ядра. Ядра Jupyter взаимодействуют через WebSockets:
/api/kernels/<KERNEL_ID>/channels
Протокол обмена сообщениями Jupyter использует сообщение execute_request для выполнения Python-кода:
{
"header": { "msg_type": "execute_request" },
"content": { "code": "<AUTHORIZED_LAB_CODE>" }
}
Это обеспечивает выполнение Python-кода от имени сервиса Jupyter — в данном окружении ядро выполняется как пользователь.
MCPJam RCE → JupyterLab → User
Имея оболочку пользователя, следующий шаг — изучение локально установленных приложений. Приложение OPSMCP находится в:
/opt/opsmcp/
Анализ исходного кода выявляет встроенные API-учётные данные:
VALID_API_KEY = "<REDACTED_OPSMCP_API_KEY>"
Приложение также содержит две коллекции инструментов:
Видимые инструменты
ops.system_statusops.list_servicesops.check_diskops.view_logsСкрытые инструменты
ops._admin_dumpops._debug_modeАдминистративные функции особенно интересны, потому что они не возвращаются при обычном перечислении инструментов.
Отсутствие документации не означает отсутствие доступа.
Бэкенд по-прежнему регистрирует скрытые инструменты и принимает их имена через общий механизм выполнения инструментов.
Приложение аутентифицирует запросы с помощью API-ключа:
X-API-Key: <OPSMCP_API_KEY>
После аутентификации конечная точка выполнения инструментов проверяет только, существует ли запрошенная функция, а не разрешено ли вызывающей стороне её выполнять.
Что происходит:
API Key → Authenticated → Tool exists? → Execute