Sandboxing de Plugins
Código de plugin não confiável é isolado em todas as camadas: o backend roda em um processo restrito separado, o frontend roda em um iframe em sandbox, e temas nunca recebem acesso sensível de forma alguma.
Sem Sandbox de JavaScript
node:vm é deliberadamente não usado como sandbox de segurança. Uma sandbox
de interpretador JavaScript não pode impedir um atacante determinado de
alcançar o processo do host. Em vez disso, o isolamento é aplicado pelo
sistema operacional: processos separados com capacidades limitadas e contextos
de navegação separados.
Isolamento de Backend
Um plugin de backend não confiável roda em seu próprio processo Node.js 24 com restrições:
- Um loader limitado resolve apenas ESM local ao pacote e a API do SDK.
- O processo não pode importar built-ins
node:*além do que o loader permite, resolver módulos fora da raiz do pacote ou alcançar o banco de dados do host. - Todas as capacidades chegam por um canal IPC; o host aplica permissões em cada chamada.
- O processo escuta eventos centrais do aplicativo apenas pelo barramento de eventos do SDK e pode emitir apenas sob seu próprio namespace.
- Se o processo falhar, o host remove todo registro que ele possuía.
O processo de plugin nunca recebe a raiz do Fastify, a conexão SQLite,
caminhos absolutos, o ambiente completo ou as chaves de API de outros
provedores. O acesso à rede é limitado aos hosts concedidos por meio do
fetch verificado por permissões.
Isolamento de Frontend
Um plugin de frontend nativo roda dentro de um iframe em sandbox com
sandbox="allow-scripts" e sem allow-same-origin:
- O iframe não tem acesso de mesma origem ao documento do aplicativo.
- A comunicação com o host acontece por um único
MessagePorttransferido com um nonce de bootstrap, envelopes estruturados, prazos e cancelamento. - O host monta a interface de cada registro em uma raiz isolada dentro do iframe e comunica-se via RPC, de modo que o plugin nunca toca a árvore de componentes React ou o DOM interno.
- Uma falha na interface de um plugin derruba apenas as raízes e regiões de recorte daquele plugin.
Cada plugin possui um iframe de sandbox de viewport completo; o host agrupa os retângulos das montagens ativas e recorta a área visível e interativa do iframe à sua união, de modo que eventos de ponteiro fora de uma superfície de plugin permanecem com o aplicativo.
Modo Legado Confiável
Entradas legacy.frontend e legacy.backend são um modo de compatibilidade
confiável separado para extensões SillyTavern existentes — não um desvio da
sandbox nativa. Usar qualquer uma das entradas exige a permissão
legacy.trusted, que a interface mostra com um aviso reforçado, e o usuário
deve confirmá-la explicitamente. O código de frontend legado é executado na
janela principal, e o código de backend legado recebe um roteador Express com
escopo em seu próprio namespace /api/plugins/{pluginId}. O modo de segurança
não carrega pontos de entrada legados de forma alguma.
Temas
Pacotes de tema são ainda mais restritos: um tema não recebe acesso a chats, chaves de API ou ao sistema de arquivos. Temas são apenas CSS e layout declarativo — não há ponto de entrada JavaScript no Theme SDK. Veja Modo de segurança do Theme SDK para a história do lado dos temas.
Modo de Segurança
O modo de segurança (?safe=1 na URL) desativa plugins e temas de terceiros
inteiramente. Ele é tratado antes de o código de plugin ou tema carregar: CSS
de pacote e overrides de tokens não são adicionados ao documento, e pontos de
entrada de terceiros nunca rodam. O tema integrado e o runtime de plugin
integrado permanecem, de modo que a interface sempre se recupera. Sair do modo
de segurança restaura o estado ativo salvo anteriormente de plugins e temas.
Validação de Pacote
Todo pacote é validado antes que qualquer código possa rodar: path traversal, symlinks, binários nativos e payloads executáveis são rejeitados; campos do manifesto, pontos de entrada e permissões são verificados; dependências npm são buscadas com verificações de integridade e scripts de instalação nunca são executados. Para a história completa de instalação ao teardown, veja Ciclo de Vida.