
Proof-of-concept эксплойт для CVE-2026-39987 — предварительной аутентификации RCE в WebSocket-эндпоинте /terminal/ws в Marimo, обеспечивающий неаутентифицированный доступ к PTY-оболочке.
Marimo <= 0.20.4 подвержен уязвимости RCE до аутентификации в WebSocket-эндпоинте /terminal/ws.
Эндпоинт проверяет режим приложения и поддержку терминала, но не проверяет аутентификацию перед принятием WebSocket-соединения. Затем он создаёт PTY-оболочку, позволяя неаутентифицированному атакующему выполнять команды с привилегиями процесса Marimo.
В отличие от других WebSocket-эндпоинтов, которые вызывают validate_auth(), уязвимый терминальный эндпоинт принимает соединение напрямую:
if app_state.mode != SessionMode.EDIT:
await websocket.close(...)
return
if not supports_terminal():
await websocket.close(...)
return
await websocket.accept()
child_pid, fd = pty.fork()
Отсутствие проверки аутентификации позволяет неаутентифицированный доступ к PTY.
<= 0.20.4Прилагаемый клиент CVE-2026-39987.py подключается к:
/terminal/ws
Интерактивный режим:
python3 CVE-2026-39987.py -i
Одиночная команда:
python3 CVE-2026-39987.py "id"
Настройте цель, заменив DEFAULT_HOST в скрипте.
Успешная эксплуатация может предоставить неаутентифицированную PTY-оболочку и произвольное выполнение команд от имени пользователя сервера Marimo.