
A proof-of-concept for CVE-2026-39987
免責事項 このスクリプトは、教育目的および許可を受けたテストのみを目的としています。明示的な許可なくシステムに対してこのツールを使用することは違法です。作者は、この情報の悪用について一切の責任を負いません。
0.23.0 より前の Marimo バージョンには、事前認証なしの重大なリモートコード実行(RCE)の脆弱性があります。エンドポイント /terminal/ws には適切なアクセス制御が実装されておらず、認証されていない攻撃者がシステムへの完全な対話型シェルアクセスを取得できる状態になっています。
| 詳細 | 情報 |
|---|---|
| CVE | CVE-2026-39987 |
| 深刻度 | 緊急 |
| CVSS スコア | 9.3 (CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:H/VI:H/VA:H) |
| 種類 | 事前認証なしのリモートコード実行(RCE) |
| 攻撃経路 | WebSocket (/terminal/ws) |
| 影響を受ける製品 | Marimo < 0.23.0 |
| パッチ | Marimo ≥ 0.23.0 |
http.favicon.hash:-1864630356
services.http.response.favicons.hashes: -1864630356
-1864630356/api/versionPython 3.10+ が必要です。依存関係は Astral の uv で管理されています。
# install uv (skip if already installed)
curl -LsSf https://astral.sh/uv/install.sh | sh
uv venv
uv pip install -r requirements.txt
uv run poc.py -t <target_url>
-t, --target_url(必須): ターゲットの /terminal/ws エンドポイントの WebSocket URI。uv run poc.py -t wss://<target-host>/terminal/ws
接続すると、対話型の raw pty セッションが取得できます。ローカルで利用可能な追加コマンド(入力された内容はリモートシェルには送信されません):
| コマンド | 説明 |
|---|---|
中断・終了するには Ctrl+C を押します。
>= 0.23.0 にアップグレードします。これにより /terminal/ws のアクセス制御の欠如が修正されます。localhost または内部インターフェースにバインドし、リモートアクセスには VPN/踏み台サーバー(bastion)を前面に配置してください。/terminal/ws および他の API ルートの前に、認証を強制するリバースプロキシ(例: OAuth2 プロキシ、mTLS)を配置してください。/terminal/ws への予期しない WebSocket 接続や、サーバーログにおける認証なしのシェルアクティビティを監視してください。上記の Shodan/Censys ドークは、自組織の露出した未パッチのインスタンスを防御的に見つけるためにも使用できます。.upload| ローカルファイルのパスとリモートの保存先を入力するローカルプロンプトを開き、ファイルをプッシュします。 |
!upload <local_path> <remote_path> | 上記と同じ操作を1行で行います。 |
!download <remote_path> <local_path> | ターゲットからローカルマシンへファイルを取得します。 |
/exit, /bye | セッションをローカル側で終了します。 |