Перейти к основному содержимому

Песочница плагинов

Недоверенный код плагинов изолирован на каждом уровне: backend выполняется в отдельном ограниченном процессе, фронтенд — в песочном iframe, а темы вообще не получают чувствительного доступа.

Никакой JavaScript-песочницы

node:vm сознательно не используется как песочница безопасности. JavaScript-песочница интерпретатора не может остановить решительного злоумышленника на пути к процессу хоста. Вместо этого изоляцию обеспечивает операционная система: отдельные процессы с ограниченными возможностями и отдельные контексты просмотра.

Изоляция backend

Недоверенный backend-плагин выполняется в собственном процессе Node.js 24 с ограничениями:

  • Ограниченный загрузчик разрешает только локальные для пакета ESM и API SDK.
  • Процесс не может импортировать встроенные модули node:* сверх разрешённого загрузчиком, резолвить модули вне корня пакета или добраться до базы данных хоста.
  • Все возможности поступают через IPC-канал; хост обеспечивает разрешения при каждом вызове.
  • Процесс слушает основные события приложения только через шину событий SDK и может испускать только в собственном пространстве имён.
  • Если процесс падает, хост удаляет каждую принадлежавшую ему регистрацию.

Процесс плагина никогда не получает корень Fastify, соединение SQLite, абсолютные пути, полное окружение или API-ключи других провайдеров. Сетевой доступ ограничен выданными хостами через проверяемый fetch.

Изоляция фронтенда

Нативный frontend-плагин выполняется внутри песочного iframe с sandbox="allow-scripts" и без allow-same-origin:

  • У iframe нет доступа к документу приложения как к same-origin.
  • Связь с хостом идёт через единственный переданный MessagePort с bootstrap-nonce, структурированными конвертами, дедлайнами и отменой.
  • Хост монтирует UI каждой регистрации в изолированный корень внутри iframe и общается через RPC, поэтому плагин никогда не касается дерева компонентов React или внутреннего DOM.
  • Сбой UI плагина задевает только корни и области обрезки этого плагина.

Каждый плагин владеет одним полноэкранным песочным iframe; хост группирует прямоугольники активных монтирований и обрезает видимую и интерактивную область iframe до их объединения, поэтому указатель за пределами поверхности плагина остаётся у приложения.

Доверенный устаревший режим

Точки входа legacy.frontend и legacy.backend — отдельный доверенный режим совместимости для существующих расширений SillyTavern, а не обход нативной песочницы. Использование любой из точек входа требует разрешения legacy.trusted, которое UI показывает с усиленным предупреждением, и пользователь должен подтвердить его явно. Устаревший frontend-код выполняется в главном окне, а устаревший backend-код получает роутер Express, ограниченный собственным пространством имён /api/plugins/{pluginId}. Безопасный режим вообще не загружает устаревшие точки входа.

Темы

Пакеты тем ограничены ещё сильнее: тема не получает доступа к чатам, API-ключам или файловой системе. Темы — это только CSS и декларативный макет; в Theme SDK нет JavaScript-точки входа. О стороне тем см. Безопасный режим Theme SDK.

Безопасный режим

Безопасный режим (?safe=1 в URL) полностью отключает сторонние плагины и темы. Он обрабатывается до загрузки кода плагинов или тем: CSS пакетов и оверрайды токенов не добавляются в документ, а сторонние точки входа никогда не выполняются. Встроенная тема и встроенный рантайм плагинов остаются, поэтому интерфейс всегда восстанавливается. Выход из безопасного режима восстанавливает ранее сохранённое состояние активного плагина и темы.

Проверка пакетов

Каждый пакет проверяется до выполнения любого кода: traversal-пути, симлинки, нативные бинарники и исполняемые нагрузки отклоняются; поля манифеста, точки входа и разрешения проверяются; npm-зависимости загружаются с проверкой целостности, а скрипты установки никогда не выполняются. Полную историю от установки до разбора см. в Жизненный цикл.