@tslite/sanitize
v1.3.0
Published
TSLite sanitize — fail-closed AST guard against sandbox-escape surfaces (constructor/prototype/__proto__, dangerous globals) + own-only runtime member access. DEFENSE IN DEPTH, not a security boundary (see SECURITY.md).
Maintainers
Readme
@tslite/sanitize
Guarda fail-closed contra a autoridade ambiente no AST do TSLite — a referência a
eval/Function/process/globalThis/… — e, no modo hermético, contra o acesso computado dinâmico.
[!WARNING] Defesa em profundidade, NÃO uma fronteira de segurança. Um filtro de AST nunca é o sandbox (foi o que matou o
vm2). A fronteira real é executar a saída sob um realm endurecido (SESlockdown()/ isolated-vm) sem autoridade ambiente. LeiaSECURITY.md— é a parte mais importante.
import { assertSafe, HERMETIC_POLICY } from "@tslite/sanitize";
assertSafe(ast); // lança SanitizeError em construção insegura
assertSafe(ast, HERMETIC_POLICY); // + rejeita acesso computado dinâmicoJá vem ligado (default ON) nos backends:
evaluate(ast, env); // @tslite/interpret — assertSafe antes de compilar
emit(ast, { profile }); // @tslite/codegen — assertSafe antes de emitirO que ele pega
eval / Function / process / require / globalThis // → SanitizeError (forbidden-identifier)
o[k] // k dinâmico → permitido (guard) ou rejeitado (hermetic, dynamic-computed)E o que ele não pega (de propósito — são dado legítimo):
{ eval: 1 } // chave de dado chamada "eval"
o.eval // membro de dado
o.constructor / { __proto__: 1 } // nenhum nome de chave é especial
o["a"] / o[0] // acesso literalUm nome de chave não é superfície de escape: os dois runtimes leem e gravam só a chave
própria de um valor, e o protótipo do JS não é alcançável por nome nenhum. É o runtime
que fecha ({}).constructor.constructor("…"), e não este pacote.
API
assertSafe(ast, policy?)— guarda fail-closed (lançaSanitizeError).findUnsafe/isSafe— versões puras (não-lançantes) pra tooling.DEFAULT_POLICY(guard) ·HERMETIC_POLICY(rejeita computado dinâmico).FORBIDDEN_IDENTIFIERS— os nomes de autoridade ambiente.
Detalhe completo em API.md · arquitetura em
docs/ARCHITECTURE.md · modelo de ameaça e a fronteira real em
SECURITY.md.
