-
Notifications
You must be signed in to change notification settings - Fork 0
Security Model pt
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 das páginas de extensão:
script-src 'self' 'wasm-unsafe-eval'— semnew 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.
- NÃO passe
ALLOWED_URI_REGEXPcomo opção desanitize()— 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 hookuponSanitizeAttributecom escopo em um conjunto explícitoURI_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 pelosanitizeMermaidSvgvendored (sanitização + rejeição de render degenerado) — segurança estrutural.
- 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. -
activeTabremovida (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).
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).
Páginas podem esconder instruções destinadas a um leitor LLM. Três camadas:
- elementos
<template>e comentários HTML são removidos antes de o Readability interpretar; - 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);
- 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).
- 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:0no<html>(nuncavisibility— 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).
| 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.
English
- Home
- Architecture
- Rendering Pipeline
- Storage Model
- Providers and Agents
- ASR and Video Analysis
- Security Model
- Design Decisions
- Contributing
中文
相关 / Related
日本語
한국어
Español
- Inicio
- Arquitectura
- Pipeline de renderizado
- Modelo de almacenamiento
- Proveedores y agentes
- ASR y análisis de vídeo
- Modelo de seguridad
- Decisiones de diseño
- Contribuir
Português
- Início
- Arquitetura
- Pipeline de renderização
- Modelo de armazenamento
- Provedores e agentes
- ASR e análise de vídeo
- Modelo de segurança
- Decisões de design
- Contribuindo
Русский