
От 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] Этот репозиторий предназначен только для авторизованных исследований безопасности, тестирования на проникновение и образовательных целей. Адреса целей, учётные данные, токены и другие значения, зависящие от окружения, в этом документе отредактированы или заменены лабораторными плейсхолдерами.
Первоначальная разведка направлена на выявление сервисов, доступных извне.
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
Что должно происходить:
API Key → Authenticated → Permission check → Allowed → Execute
└ Denied → 403
Скрытая административная функция может получать доступ к чувствительным ресурсам, принадлежащим root.
Административный инструмент принимает цель (target), описывающую запрашиваемую информацию. Один из поддерживаемых ресурсов — root-ключ SSH:
{
"name": "ops._admin_dump",
"arguments": {
"target": "ssh_keys",
"confirm": true
}
}
Затем приложение читает приватный SSH-ключ, принадлежащий root, что возможно, поскольку OPSMCP работает от имени root и может читать /root/*. Таким образом, приложение становится примитивом раскрытия учётных данных.
После получения SSH-учётных данных авторизованной лаборатории сохраните их с ограничительными правами:
chmod 600 <ROOT_KEY>
Проверьте полученный контекст аутентификации:
whoami
id
Итоговый уровень привилегий: root 🎉
┌──────────────────────────────┐
│ MCPJam Inspector │
│ TCP/6274 │
└──────────────┬───────────────┘
│ CVE-2026-23744
▼
┌──────────────────────────────┐
│ Initial RCE │
└──────────────┬───────────────┘
▼
┌──────────────────────────────┐
│ JupyterLab │
│ 127.0.0.1:8888 │
└──────────────┬───────────────┘
│ Token disclosure
▼
┌──────────────────────────────┐
│ Jupyter Kernel │
│ WebSocket RCE │
└──────────────┬───────────────┘
▼
User
│ Source review
▼
┌──────────────────────────────┐
│ OPSMCP │
│ 127.0.0.1:5000 │
│ root │
└──────────────┬───────────────┘
│ API key + hidden tool
▼
┌──────────────────────────────┐
│ Root Credential Leak │
└──────────────┬───────────────┘
▼
root
| Система |
|---|
01 — Инструментарий разработчика — это поверхность атаки Инструменты, предназначенные для локальной разработки, могут стать критическими уязвимостями при доступе из недоверенных сетей.
02 — Токены Jupyter — это мощные учётные данные Доступ к токену Jupyter может дать гораздо больше, чем доступ к интерфейсу — API ядер могут обеспечить выполнение произвольного кода.
03 — Скрытое не значит защищённое Недокументированная конечная точка — это не механизм авторизации.
04 — Исходный код ценен на этапе пост-эксплуатации Исходный код приложения может сразу раскрыть механизмы аутентификации, секреты, скрытую функциональность и границы привилегий.
05 — Минимальные привилегии могут разорвать цепочки атак Если бы OPSMCP работал от непривилегированной сервисной учётной записи, итоговое воздействие было бы значительно ниже.
Этот репозиторий предназначен только для авторизованных исследований безопасности, тестирования на проникновение и образовательных целей. Не используйте описанные здесь техники против систем без явного разрешения.
⚡ MCPJam → RCE → Jupyter → User → OPSMCP → root ⚡
| Шаг | Этап |
|---|
| 1 | MCPJam Inspector, доступный в сети |
| 2 | Эксплуатация CVE-2026-23744 |
| 3 | Получен начальный RCE |
| 4 | Раскрыт токен JupyterLab |
| 5 | Выполнение кода в ядре Jupyter |
| 6 | Оболочка уровня пользователя |
| 7 | Анализ исходного кода OPSMCP |
| 8 | Обнаружены захардкоженные API-учётные данные |
| 9 | Злоупотребление скрытой административной функциональностью |
| 10 | Раскрыты root-учётные данные |
| 11 | root |
| # | Слабость | Воздействие |
|---|
| 1 | Открытый MCPJam Inspector | Удалённая поверхность атаки |
| 2 | CVE-2026-23744 | Начальный RCE |
| 3 | Токен в аргументах процесса | Раскрытие учётных данных |
| 4 | Доступ к ядру Jupyter | Выполнение кода уровня пользователя |
| 5 | Читаемый исходный код приложения | Обнаружение учётных данных |
| 6 | Захардкоженный API-ключ OPSMCP | Обход аутентификации API |
| 7 | Скрытая административная функциональность | Привилегированная операция |
| 8 | OPSMCP, работающий от имени root | Полная компрометация системы |
| Что отслеживать |
|---|
| MCPJam | Неожиданные изменения конфигурации · подозрительные дочерние процессы · необычные удалённые клиенты |
| JupyterLab | Неожиданное использование токена · неожиданное создание ядер · аномальные WebSocket-соединения · shell-процессы, порождаемые ядрами |
| OPSMCP | Вызов недокументированных инструментов · запросы, связанные с учётными данными · неожиданные API-клиенты · административные операции |
| SSH | Неожиданные входы под root · новые SSH-ключи · необычные источники аутентификации |