プラグインのサンドボックス化
信頼できないプラグインコードはすべてのレイヤーで分離されます: バックエンドは別の制限されたプロセスで実行され、フロントエンドはサンドボックス化された iframe で実行され、テーマは機密アクセスを一切受け取りません。
JavaScript サンドボックスなし
node:vm はセキュリティサンドボックスとして意図的に使用されません。JavaScript インタープリターのサンドボックスは、決意のある攻撃者がホストプロセスに到達するのを止められません。代わりに、分離はオペレーティングシステムによって強制されます: 限られたケイパビリティを持つ別プロセスと、別のブラウジングコンテキストです。
バックエンドの分離
信頼できないバックエンドプラグインは、制限付きの独自 Node.js 24 プロセスで実行されます:
- 制限付きローダーはパッケージローカルの ESM と SDK API のみを解決します。
- プロセスはローダーが許可する範囲を超えて
node:*組み込みをインポートできず、パッケージルートの外のモジュールを解決できず、ホストデータベースに到達できません。 - すべてのケイパビリティは IPC チャネルを通じて届き、ホストが呼び出しのたびに権限を強制します。
- プロセスは SDK イベントバスを通じてのみコアアプリケーションイベントをリッスンし、自身の名前空間の下でのみ発行できます。
- プロセスがクラッシュした場合、ホストはそれが所有していたすべての登録を削除します。
プラグインプロセスは Fastify ルート、SQLite 接続、絶対パス、完全な環境、他のプロバイダーの API キーを決して受け取りません。ネットワークアクセスは、権限チェック付きの fetch を通じて付与されたホストに制限されます。
フロントエンドの分離
ネイティブフロントエンドプラグインは、sandbox="allow-scripts" で allow-same-origin なしのサンドボックス化された iframe 内で実行されます:
- iframe はアプリケーションドキュメントへの同一オリジンアクセスを持ちません。
- ホストとの通信は、ブートストラップナンス、構造化エンベロープ、デッドライン、キャンセルを持つ単一の転送済み
MessagePortを通じて行われます。 - ホストは各登録の UI を iframe 内の分離されたルートにマウントし、RPC 経由で通信するため、プラグインが React コンポーネントツリーや内部 DOM に触れることはありません。
- プラグイン UI のクラッシュは、そのプラグインのルートとクリップ領域だけを破壊します。
各プラグインは 1 つの全ビューポートのサンドボックス iframe を所有し、ホストはアクティブなマウントの矩形をバッチ処理し、可視かつインタラクティブな iframe 領域をそれらの和集合にクリップするため、プラグインサーフェスの外のポインタイベントはアプリケーションに残ります。
信頼されたレガシーモード
legacy.frontend と legacy.backend のエントリは、既存の SillyTavern 拡張機能のための別の信頼された互換モードです — ネイティブサンドボックスの迂回ではありません。どちらかのエントリを使用するには legacy.trusted 権限が必要で、UI は強化された警告付きで表示し、ユーザーが明示的に確認する必要があります。レガシーフロントエンドコードはメインウィンドウで実行され、レガシーバックエンドコードは自身の /api/plugins/{pluginId} 名前空間にスコープされた Express ルーターを取得します。セーフモードはレガシーエントリポイントを一切読み込みません。
テーマ
テーマパッケージはさらに制限されます: テーマはチャット、API キー、ファイルシステムにアクセスできません。テーマは CSS と宣言型レイアウトのみです — Theme SDK には JavaScript エントリポイントがありません。テーマ側の話はテーマ SDK のセーフモード を参照してください。
セーフモード
セーフモード(URL の ?safe=1)はサードパーティのプラグインとテーマを完全に無効化します。プラグインやテーマのコードが読み込まれる前に処理されます: パッケージ CSS とトークンオーバーライドはドキュメントに追加されず、サードパーティのエントリポイントは決して実行されません。組み込みテーマと組み込みプラグインランタイムは残るため、インターフェースは常に復旧します。セーフモードを抜けると、以前保存されたアクティブなプラグインとテーマの状態が復元されます。
パッケージ検証
すべてのパッケージはコードが実行される前に検証されます: パストラバーサル、シンボリックリンク、ネイティブバイナリ、実行可能ペイロードが拒否され、マニフェストフィールド、エントリポイント、権限がチェックされ、npm 依存関係は整合性チェック付きで取得され、インストールスクリプトは決して実行されません。インストールからティアダウンまでの完全な話はライフサイクル を参照してください。