
CVE-2026-39987の概念実証エクスプロイト。Marimoの/terminal/ws WebSocketエンドポイントにおける事前認証RCEであり、認証なしのPTYシェルアクセスを提供します。
Marimo <= 0.20.4 は、/terminal/ws WebSocket エンドポイントにおける認証前 RCE の脆弱性の影響を受けます。
このエンドポイントはアプリケーションモードとターミナルサポートをチェックしますが、WebSocket 接続を受け入れる前に認証を検証しません。その後、PTY シェルを作成するため、認証されていない攻撃者が Marimo プロセスの権限でコマンドを実行できるようになります。
validate_auth() を呼び出す他の WebSocket エンドポイントとは異なり、脆弱なターミナルエンドポイントは接続を直接受け入れます:
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 サーバーユーザーとしての任意のコマンド実行が可能になります。