Песочница плагинов
Недоверенный код плагинов изолирован на каждом уровне: 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-зависимости загружаются с проверкой целостности, а скрипты установки никогда не выполняются. Полную историю от установки до разбора см. в Жизненный цикл.