Skip to content

Security Model pt

Hermes Agent edited this page Oct 1, 2026 · 1 revision

Modelo de segurança

English | 中文 | 日本語 | 한국어 | Español | Português | Русский

O browsa alimenta modelos com conteúdo web arbitrário, renderiza saída de modelo dentro de uma página de extensão e envia requisições com cookies para CDNs em nome do usuário — as fronteiras de segurança estão todas nessas três cadeias. Princípio: falhe abrindo para "manter o artefato bruto", nunca produza dados errados silenciosamente.

CSP MV3 e patches de vendors

  • CSP das páginas de extensão: script-src 'self' 'wasm-unsafe-eval' — sem new Function/eval; instanciação de WASM permitida.
  • O glue embind de Mol*/RDKit constrói fábricas de classes via eval → o build.mjs aplica patches ao vendor na hora da cópia (invocadores escritos à mão; init ansioso tornado lazy). As regexes dos patches ancoram em strings estáveis e QUEBRAM O BUILD quando um upgrade do molstar para de casar.
  • Lição do ambiente de verificação: o dev-preview é uma página http comum cuja CSP padrão permite eval — ele não consegue capturar violações de CSP. Após qualquer troca de vendor, rode dentro da extensão REAL (launchPersistentContext --load-extension, xvfb) e verifique que canvas/svg existem + zero saídas de CSP/EvalError no console.

DOMPurify (a saída do modelo é entrada hostil)

  • NÃO passe ALLOWED_URI_REGEXP como opção de sanitize() — o DOMPurify a aplica ao VALOR de todo atributo permitido que não esteja na própria lista segura dele, removendo o número puro de <ol start="N"> (bug real: numeração de lista quebrada). As checagens de URI passam por um hook uponSanitizeAttribute com escopo em um conjunto explícito URI_ATTRS.
  • A allow-list de data: do DOMPurify não cobre data:image/svg+xml (pode carregar scripts) — um hook registrado uma única vez a bloqueia no carregamento do módulo.
  • o mermaid precisa de securityLevel:'loose' (KaTeX nos rótulos de nós), então seu SVG DEVE passar pelo sanitizeMermaidSvg vendored (sanitização + rejeição de render degenerado) — segurança estrutural.

O conjunto mínimo-suficiente de permissões

  • host_permissions <all_urls>: fetches em contexto de extensão são isentos de CORS (Ark / AlphaFold / RCSB / raw.githubusercontent dependem disso), o DNR injeta cabeçalhos de requisições de CDN, scripts injetam em qualquer aba. Não há proxy de backend, então isso é necessário.
  • activeTab removida (nunca funciona a partir de um painel lateral; as injeções passam tabIds explícitos).
  • unlimitedStorage: data URLs de keyframes/imagens de página vivem no histórico (até a primeira compactação no lado da requisição) — a cota padrão de 10MB foi de fato atingida uma vez.
  • O backup da chave privada da extensão vive FORA do repositório (/root/workspace/browsa-keys/, nunca commitado).

A receita de cabeçalhos DNR (lib/sidepanel/media-headers.js)

Os downloads de ASR precisam de Referer/Origin/cookies aceitos pela CDN. Regras DNR com escopo de sessão filtram pelo domínio da CDN (bilivideo / googlevideo) + initiatorDomains: [o ID desta extensão], reescrevendo a Origin chrome-extension na do próprio site. AMBAS as plataformas precisam disso (a suposição "o YouTube não precisa de cabeçalhos, o POT está na URL" estava errada — todo stream fresco recebeu 403 nos testes ao vivo).

Extração no MAIN world: defesas contra injeção

Páginas podem esconder instruções destinadas a um leitor LLM. Três camadas:

  1. elementos <template> e comentários HTML são removidos antes de o Readability interpretar;
  2. elementos ocultos por CSS (display/visibility/opacity/font-size:0/caixas de tamanho zero) são marcados no documento LIVE, removidos do clone e depois desmarcados (a página nunca fica mutada); apenas elementos com textContent não vazio são verificados (custo limitado);
  3. o texto de saída remove caracteres de largura zero, caracteres de controle e surrogates UTF-16 NÃO PAREADOS (regex ciente de pares — uma remoção indiscriminada mataria emoji legítimos).

chrome.scripting.executeScript serializa exatamente UMA função — os helpers precisam estar aninhados dentro da função injetada (ADR-0009; countImages era um irmão em nível de módulo e lançou ReferenceError no Chrome real, enquanto os testes, que concatenavam os corpos, não viam nada).

Gates de segurança da automação de página pré-extração (preExtractCleanup)

  • Cliques em consentimento de cookies: restritos por contêiner + veto por palavra de perigo (purchase/delete/pay/clear/reset … em ambos os idiomas).
  • Expansão de "leia mais": nunca clica em nenhum <a href> navegável (incidente real: um link de marca navegou a aba no meio do anexo); regiões de chrome excluídas (nav/aside/[role=…], endurecidas após os incidentes do mega-menu do GitHub e do labuladong); diálogos abertos por um clique são dispensados via controles rotulados como cancelar e a passada para.
  • Scroll para lazyload é CONDICIONADO POR SINAL (apenas quando existem sinais de lazy/virtualizado); a supressão de pintura usa opacity:0 no <html> (nunca visibility — a coreografia de revelação das próprias páginas pode travá-lo); scrollY sempre restaurado.
  • URLs GitHub /blob/ pegam um fast-path raw que contorna completamente a automação de página (menus abertos poluíam o DOM clonado — caso real).

As três formas de origem da extensão (leia antes de qualquer allowlist de origem de gateway)

Forma de instalação ID da extensão
Chrome Web Store kghjmmajnpbkljankbbjbmnhfdocaeho (fixo do CWS)
Carregamento por diretório do repositório (manifest carrega key) apoodheofdhglelbnmggeokbhampbmgn (derivada da key)
Descompactação do zip de release derivada do caminho, DIFERENTE POR MÁQUINA (o empacotamento remove a key)

O ID mostrado em chrome://extensions é a única verdade de referência. Gateways locais usam ws:// (wss é rejeitado); a configuração do gateway é lida uma única vez na inicialização.


Versões autoritativas: Security-Model (inglês) / Security-Model-zh (chinês) — instantâneo de primeira tradução por IA, sincronizado em 2026-10-01.

Clone this wiki locally