
CVE-2026-39987の概念実証エクスプロイト。Marimoの/terminal/ws WebSocketエンドポイントにおける認証前RCEであり、認証情報なしで対話型シェルを取得できる。
CVSS 4.0: 9.3 (Critical) · AV:N/AC:L/AT:N/PR:N/UI:N/VC:H/VI:H/VA:H
影響: marimo <= 0.20.4 · 修正済み: 0.23.0 · CWE-306 (認証の欠如)
アドバイザリ: GHSA-2679-6mx9-h9xc · 修正: marimo-team/marimo@c24d480
WebSocket エンドポイント /terminal/ws (marimo/_server/api/endpoints/terminal.py)
は、接続を受け入れ pty.fork() を呼び出す前に、セッションモード (EDIT) と
プラットフォームサポートのみをチェックします。@requires(...)
デコレータも validate_auth() 呼び出しも含まれていません。
0.20.4 で測定された対比:
@requires(...) の使用。/ws (notebook) -> validate_auth() への 2 回の呼び出し。terminal.py -> @requires 0 箇所、validate_auth 0 箇所。 <-- これが脆弱性。AuthBackend ミドルウェアは HTTP と /ws WebSocket を保護しますが、
/terminal/ws は Cookie もトークンもなしに接続を受け入れ、marimo プロセスの
権限で PTY シェルを fork します。
marimo edit ...) で起動されていること。これはエディタのデフォルトモードです。pty サポートのあるプラットフォーム (Linux/macOS、Windows と Pyodide は影響を受けません)。ネットワーク経由で marimo edit サーバーに到達できる攻撃者 (リモート / コンテナ
デプロイでよく見られ、しばしば root として実行される) は、認証なしで
対話型シェルを取得します: 認証情報の窃取 (cat .env)、横展開、
マルウェアの展開。公開後 10 時間以内に実際に悪用され、2026-04-23 に
CISA の KEV カタログに追加されました。
pip install "marimo==0.20.4" websockets
marimo edit demo.py --headless --port 2718 --token --token-password SECRET
python exploit.py ws://127.0.0.1:2718 "id; cat /etc/passwd"
exploit.py はトークン、Cookie、Authorization ヘッダーを一切送信しません。ユーザーが
ターミナルに入力するのとまったく同じように、コマンドを生テキスト + "\r" (Enter) として送信します。
/ws -> 403 (認証は機能している)。/terminal/ws -> 受け入れられた。サーバー上で実行された:
uid=1000() gid=1000() ...
Linux ...
そして /tmp/cve_2026_39987_proof.txt に書き込み -> RCE を確認。marimo >= 0.23.0 にアップグレードしてください。一時的な緩和策: marimo edit を
信頼できないネットワークに公開しないこと。エディタを認証済みプロキシの背後に置くこと。
シークレットを含まない非特権 / コンテナ内で実行すること。
認可されたセキュリティテストおよび教育目的のみ。所有している、またはテストの 明示的な許可を得ているシステムに対してのみ実行してください。