
MCPJam Inspector の RCE から root まで — CVE-2026-23744、JupyterLab のトークン開示、カーネル実行、および OPSMCP の特権昇格
このリポジトリは、許可されたセキュリティ研究、ペネトレーションテスト、教育目的のみを意図しています。 明示的な許可なく、ここで説明する手法をシステムに対して使用しないでください。
MCPJam Inspector RCEからrootまで — CVE-2026-23744、JupyterLabトークン開示、カーネル実行、そしてOPSMCP権限昇格。
このリポジトリは、公開されたMCPJam Inspectorインスタンスからrootレベルのアクセスに至る、完全なLinux攻撃チェーンを文書化したものです。
このチェーンは、開発者ツール、ローカルサービス、認証情報の取り扱い、アプリケーションの認可にまたがる脆弱性を連結したものです:
MCPJam Inspector
│ CVE-2026-23744
▼
RCE
│
▼
JupyterLab Token
│
▼
Jupyter Kernel
│
▼
User
│
▼
OPSMCP API
│
▼
Hidden Admin Tool
│
▼
Root Credential
│
▼
root
[!WARNING] このリポジトリは、許可されたセキュリティ研究、ペネトレーションテスト、教育目的のみを意図しています。本書全体にわたるターゲットアドレス、認証情報、トークン、その他の環境固有の値は、編集されるかラボ用のプレースホルダーに置き換えられています。
初期偵察は、外部に公開されたサービスを特定することに注力します。
nmap -sC -sV -oN nmap_initial.txt TARGET
その後、完全なTCPスキャンを実行できます:
nmap -p- --min-rate 5000 -oN nmap_full.txt TARGET
関連する外部サービス:
| ポート | サービス | 役割 |
|---|---|---|
| 22 | SSH | リモート管理 |
| 6274 | MCPJam Inspector | 初期攻撃面 |
localhostのみにバインドされたサービス:
| ポート | サービス | 権限 |
|---|---|---|
| 8888 | JupyterLab | ユーザー |
| 5000 | OPSMCP | root |
ポート6274で外部からアクセス可能なMCPJam Inspectorが、最初のエントリーポイントになります。
公開されたMCPJam Inspectorインスタンスは、CVE-2026-23744の影響を受けます。
MCPJam Inspectorは、主にMCPサーバー向けの開発・テスト用インターフェースとして設計されています。この脆弱性は、このインターフェースが信頼できないネットワークに公開されると特に危険になります。脆弱な設定フローにより、攻撃者が制御するデータがコマンド実行パスに到達し得るためです。
Remote Request
│
▼
MCP Server Configuration
│
▼
Command Execution
│
▼
Initial Shell
この脆弱性は、MCPJam Inspectorのバージョン1.4.2以下に影響します。許可されたテストでは、公開されているPoCを使用して、ターゲット環境に対するこの脆弱性を検証できます。
悪用に成功したら、実行コンテキストを確認します:
id
whoami
hostname
初期足場を獲得すると、ローカルサービスが見えるようになります。
ss -tlnp
ps aux | grep -E 'jupyter|python|node'
Network
│
▼
MCPJam Inspector
:6274
│
▼
Initial RCE
│
┌─────────┴─────────┐
▼ ▼
JupyterLab OPSMCP
:8888/local :5000/local
│ │
▼ ▼
User root
2つの内部アプリケーション間の権限差は、特に興味深いものです。
JupyterLabプロセスは、認証トークンをコマンドラインに直接指定して起動されていました:
--ServerApp.token=<JUPYTER_TOKEN>
コマンドラインは次の方法で確認できます:
ps aux | grep jupyter
# or
cat /proc/<PID>/cmdline
これは、一般的なシークレット管理の問題を示しています:
Secret → Command-line argument → Process metadata → Local credential disclosure
取得したトークンは、ローカルのJupyter APIへのアクセスを提供します。
Jupyterは、カーネルを管理するためのREST APIを公開しています。取得したトークンで認証した後、次の方法でカーネルを作成できます:
POST /api/kernels
レスポンスにはカーネルのUUIDが含まれます。JupyterカーネルはWebSocketを介して通信します:
/api/kernels/<KERNEL_ID>/channels
Jupyterのメッセージングプロトコルは、Pythonコードを実行するためにexecute_requestメッセージを使用します:
{
"header": { "msg_type": "execute_request" },
"content": { "code": "<AUTHORIZED_LAB_CODE>" }
}
これにより、JupyterサービスのIDでPythonコードが実行されます。この環境では、カーネルはユーザーとして実行されます。
MCPJam RCE → JupyterLab → User
ユーザーシェルを手に入れたら、次のステップはローカルにインストールされたアプリケーションの調査です。OPSMCPアプリケーションは以下の場所にあります:
/opt/opsmcp/
ソースコードをレビューすると、埋め込まれたAPI認証情報が明らかになります:
VALID_API_KEY = "<REDACTED_OPSMCP_API_KEY>"
アプリケーションはまた、2つのツールコレクションを保持しています:
可視ツール
ops.system_statusops.list_servicesops.check_diskops.view_logs隠しツール
ops._admin_dumpops._debug_mode管理機能は、通常のツール列挙では返されないため、特に興味深いものです。
ドキュメントに記載されていないからといって、アクセスできないわけではありません。
バックエンドは依然として隠しツールを登録しており、汎用ツール実行メカニズムを介してその名前を受け入れます。
アプリケーションは、APIキーを使用してリクエストを認証します:
X-API-Key: <OPSMCP_API_KEY>
認証されると、ツール実行エンドポイントは、要求された関数が存在するかどうかのみをチェックし、呼び出し元がそれを実行する権限があるかどうかはチェックしません。
実際の動作:
API Key → Authenticated → Tool exists? → Execute
あるべき動作:
API Key → Authenticated → Permission check → Allowed → Execute
└ Denied → 403
隠れた管理機能は、rootが所有する機微なリソースにアクセスできます。
管理ツールは、要求された情報を記述するターゲットを受け入れます。サポートされているリソースの1つが、rootのSSHキーです:
{
"name": "ops._admin_dump",
"arguments": {
"target": "ssh_keys",
"confirm": true
}
}
アプリケーションは、その後、rootが所有するSSH秘密鍵を読み取ります。これは、OPSMCPがrootとして実行され、/root/*を読み取れるため可能です。したがって、このアプリケーションは認証情報開示プリミティブとなります。
許可されたラボのSSH認証情報を入手したら、制限的な権限で保存します:
chmod 600 <ROOT_KEY>
結果として得られる認証コンテキストを確認します:
whoami
id
最終的な権限レベル:root 🎉
┌──────────────────────────────┐
│ MCPJam Inspector │
│ TCP/6274 │
└──────────────┬───────────────┘
│ CVE-2026-23744
▼
┌──────────────────────────────┐
│ Initial RCE │
└──────────────┬───────────────┘
▼
┌──────────────────────────────┐
│ JupyterLab │
│ 127.0.0.1:8888 │
└──────────────┬───────────────┘
│ Token disclosure
▼
┌──────────────────────────────┐
│ Jupyter Kernel │
│ WebSocket RCE │
└──────────────┬───────────────┘
▼
User
│ Source review
▼
┌──────────────────────────────┐
│ OPSMCP │
│ 127.0.0.1:5000 │
│ root │
└──────────────┬───────────────┘
│ API key + hidden tool
▼
┌──────────────────────────────┐
│ Root Credential Leak │
└──────────────┬───────────────┘
▼
root
| システム | 監視項目 |
|---|---|
| MCPJam | 予期しない設定変更・不審な子プロセス・異常なリモートクライアント |
| JupyterLab | 予期しないトークン使用・予期しないカーネル作成・異常なWebSocket接続・カーネルから生成されたシェルプロセス |
01 — 開発者ツールは攻撃面である ローカル開発用に設計されたツールは、信頼できないネットワークに公開されると、重大な脆弱性になり得ます。
02 — Jupyterトークンは強力な認証情報である Jupyterトークンへのアクセスは、単なるUIアクセス以上のものを提供し得ます。カーネルAPIにより任意のコード実行が可能になるためです。
03 — 隠れていることは安全を意味しない ドキュメントに記載されていないエンドポイントは、認可メカニズムではありません。
04 — ソースコードは侵害後に価値がある アプリケーションのソースコードは、認証メカニズム、シークレット、隠れた機能、権限の境界を即座に明らかにし得ます。
05 — 最小権限は攻撃チェーンを断ち切ることができる OPSMCPが非特権のサービスアカウントで実行されていたなら、最終的な影響は大幅に軽減されていたでしょう。
このリポジトリは、許可されたセキュリティ研究、ペネトレーションテスト、教育目的のみを意図しています。 明示的な許可なく、ここで説明する手法をシステムに対して使用しないでください。
⚡ MCPJam → RCE → Jupyter → User → OPSMCP → root ⚡
| ステップ | 段階 |
|---|
| 1 | MCPJam Inspectorがネットワーク上に露出 |
| 2 | CVE-2026-23744の悪用 |
| 3 | 初期RCEの達成 |
| 4 | JupyterLabトークンの開示 |
| 5 | Jupyterカーネル実行 |
| 6 | ユーザーレベルのシェル |
| 7 | OPSMCPソースコードのレビュー |
| 8 | ハードコードされたAPI認証情報の発見 |
| 9 | 隠れた管理機能の悪用 |
| 10 | root認証情報の開示 |
| 11 | root |
| # | 脆弱性 | 影響 |
|---|
| 1 | 公開されたMCPJam Inspector | リモート攻撃面 |
| 2 | CVE-2026-23744 | 初期RCE |
| 3 | プロセス引数内のトークン | 認証情報の開示 |
| 4 | Jupyterカーネルへのアクセス | ユーザーレベルのコード実行 |
| 5 | 読み取り可能なアプリケーションソース | 認証情報の発見 |
| 6 | ハードコードされたOPSMCP APIキー | API認証のバイパス |
| 7 | 隠れた管理機能 | 特権操作 |
| 8 | rootとして実行されるOPSMCP | システム全体の完全な侵害 |
| OPSMCP | ドキュメントに記載されていないツール呼び出し・認証情報関連のリクエスト・予期しないAPIクライアント・管理操作 |
| SSH | 予期しないrootログイン・新しいSSHキー・異常な認証ソース |