Mercury: /api/kernels を介した認証なしのリモートコード実行の脆弱性

Mercury は、デフォルトで**匿名アクセスを許可する**JupyterLab サーバーを実行しています (`mercury_app/__main__.py` では、`--token` または `MERCURY_TOKEN` が指定されていない場合、`--IdentityProvider.token=''` が設定され、トークンがない場合は `--ServerApp.disable_check_xsrf=True` も設定されます)。 匿名ユーザーが危険な Jupyter エンドポイントにアクセスできないように、**ブロックリスト** (`mercury_app/block_handler.py` の `BLOCKED_PATTERNS`: `/lab`, `/api/terminals`, `/api/shutdown`, `/files`) が使用されています。

## 脆弱性の内容
`/api/kernels` は**ブロックリストに含まれていません**(また、含まれることはできません。Mercury はノートブックを実行するためにカーネルが必要です)。 また、`patch_kernel_websocket_handler()` (`mercury_app/idle_timeout.py`) はアイドルタイムアウトのみを追跡し、`on_message` をラップして `self.application._timeout_manager.touch()` を呼び出し、その後、元のハンドラーを呼び出しますが、**`execute_request` のフィルタリングは行われません**。 そのため、認証されていないネットワーククライアントは、次のような操作を実行できます。

```
POST /api/kernels {"name":"python3"} -> 201, カーネル ID を返す
websocket を /api/kernels/<id>/channels で開く
任意のコードを含む `execute_request` を送信 -> 任意の Python コードの実行 = RCE
```

## GHSA-f8c7-rwf9-fmgm (不完全な修正) との違い
GHSA-f8c7 は「`/api/terminals` を介した認証なしのリモートコード実行の脆弱性」であり、これはブロックリストのコンマが抜けていることによる回避です。 その修正(コンマを追加して `/api/terminals` をブロックする)は、**`/api/kernels` には適用されません**。`/api/kernels` は依然として悪用可能です。 ブロックリストのアプローチでは、カーネルを完全にカバーすることは原理的に不可能であるため、これは別のブロックリストのエントリによって修正されるバリエーションではありません。

## 動作確認済み(修正版)
**mercury 3.2.4**(GHSA-f8c7を修正したバージョン)において、デフォルト設定(トークンなし)で認証されていないクライアントとして、`POST /api/terminals`を実行すると**403**エラーが返されます(f8c7の修正が含まれています)。一方、`POST /api/kernels`を実行すると**201**が返されます。カーネルのWebSocketを開き、`execute_request`を送信すると、攻撃者が提供したPythonコードが実行されます(サーバープロセスユーザーとして`whoami`を実行し、マーカーファイル`/tmp/PWNED_MERCURY_RCE`を作成)。認証なしでリモートコード実行が可能。再現手順(クライアントスクリプトとノートブック)が含まれています。

## 影響
認証なしで、ネットワーク経由で任意のコードを実行することが可能であり、これはMercuryサーバープロセスのユーザー権限で行われます。これにより、ホスト/コンテナおよびアクセス可能なすべてのデータ/シークレットが完全に侵害される可能性があります。

## 対策
ブロックリストだけでは、匿名ユーザーによるカーネルサーバーを保護できません。デフォルトで、各リクエストに対して実際の認証(トークンまたはパスワード)を必須にするか、カーネルメッセージチャネルを制限して、匿名WebSocketクライアントがMercury自身の制御下にある実行フロー以外の`execute_request`を送信できないようにする必要があります。

## 重複排除(3つの方法)
OSV.devでは、`mercury`と`mljar-mercury`に対してCLEAN(0)と評価されています。リポジトリの唯一のアドバイザリ(GHSA-f8c7-rwf9-fmgm)は`/api/terminals`のみを対象としており(説明にはカーネルに関する記述はありません)、`/api/kernels`のリモートコード実行に関する問題/プルリクエストはありません(#219/#134/#262は「認証を追加する」という機能リクエストであり、単にデフォルトで匿名であることを確認するものです)。独立して、現在のHEADバージョンでも確認されています(ブロックリストに`/api/kernels`が含まれていません。デフォルトで`token=''`。`patch_kernel_websocket_handler`はフィルタリングを実行しません)。

発見者:Abdullah Kareem (GitHub: CyberKareem)。

影響を受けるパッケージ:
- pip (Python) mercury: 影響を受けるバージョンは3.2.5以下、3.2.6で修正済み。