Skip to content

Security Model zh

Hermes Agent edited this page Oct 1, 2026 · 2 revisions

安全模型

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

browsa 把任意网页内容喂给模型、在扩展页面里渲染模型输出、还替用户向 CDN 发带 cookie 的请求——安全边界都在这几条链上。原则:fail-open 到「保留原文」,绝不静默出错数据。

MV3 CSP 与 vendor 补丁

  • 扩展页 CSP:script-src 'self' 'wasm-unsafe-eval'——禁 new Function/eval,允许 WASM 实例化。
  • Mol*/RDKit 的 embind glue 依赖 eval 构建类工厂 → build.mjs 在拷贝 vendor 时打补丁(手写 invoker 替代 eval 体、eager 初始化改 lazy),补丁正则锚定稳定字符串、失配即构建失败。
  • 验证环境教训:dev-preview 是普通 http 页,默认允许 eval,验证不出 CSP 违规。任何 vendor 更换后必须在真扩展里跑(launchPersistentContext --load-extension + xvfb),断言 canvas/svg 存在 + 控制台零 CSP/EvalError。

DOMPurify(模型输出是敌意输入)

  • 不要把 ALLOWED_URI_REGEXP 当 sanitize() 选项传——它会被套到所有「非内部安全名单」属性值上,<ol start="N"> 的裸数字都会被剥(真 bug:列表序号断档)。URI 校验要走 uponSanitizeAttribute hook,且只圈 URI_ATTRS(href/src/poster/cite/…)。
  • DOMPurify 的 data: 白名单不覆盖 data:image/svg+xml(可带 script)——module load 时注册 once-hook 单独拦。
  • mermaid 要 securityLevel:'loose'(节点里跑 KaTeX),所以 SVG 必须过 vendored sanitizeMermaidSvg(消毒 + 退化渲染拒收)——它是承重安全件。

权限的最小充分集

  • <all_urls> host_permissions:扩展上下文 fetch 免 CORS(Ark/AlphaFold/RCSB/raw.githubusercontent 都靠它)、DNR 注入 CDN 请求头、任意 tab 注入脚本。没有后台代理服务器,所以这是必要的。
  • activeTab 已移除(侧边栏场景它本来就不工作;注入全部显式 tabId)。
  • unlimitedStorage:关键帧/页图 dataURL 驻留 history(首次请求侧压缩前),默认 10MB 配额真实可达过。
  • 备份的扩展私钥在仓库外(/root/workspace/browsa-keys/,永不入库)。

DNR 头注入配方(lib/sidepanel/media-headers.js)

ASR 下载需要 CDN 认的 Referer/Origin/cookie。会话级 DNR 规则,urlFilter 圈 CDN 域(bilivideo / googlevideo)+ initiatorDomains: [本扩展 ID]——把扩展的 chrome-extension Origin 改写成站点自身的。B 站与 YouTube 双平台都要(YouTube 的「PO token 在 URL 里就不用头」是错结论,实测每条新流都 403)。

MAIN world 抽取的注入防御

页面可以埋「给 LLM 看的指令」。三层防御:

  1. <template> 与 HTML 注释在 Readability 解析前剥除;
  2. CSS 隐藏元素(display/visibility/opacity/font-size:0/零尺寸盒)在活文档上打标、克隆后剥除、随后即刻去标(页面不留变异);只剩含非空 textContent 的元素参与检查(控成本);
  3. 输出文本剥零宽字符、控制字符、未配对 UTF-16 代理项(pair-aware 正则——一刀切会杀掉合法 emoji)。

executeScript 只序列化单个注入函数——helper 必须内嵌(ADR-0009;countImages 曾因是模块级兄弟而在真 Chrome ReferenceError,测试拼接了函数体所以看不出来)。

附加前的页面自动化(preExtractCleanup)安全门

  • 点 cookie 同意按钮:容器门 + 危险词否决(购买/删除/支付/清除/重置…中英)。
  • 展开 read-more:不点任何可导航的 <a href>(真事故:品牌链接导致 mid-attach 跳页);chrome 区排除(nav/aside/[role=…],GitHub 巨型菜单与 labuladong 事故各加固一轮);点开后弹出的对话框按取消文案关闭并终止本轮。
  • 滚动加载信号门控(有懒加载/虚拟列表信号才滚);滚动用 opacity:0 抑制绘制(不用 visibility——会被页面自己的 reveal 编排卡死);scrollY 恒恢复。
  • GitHub /blob/ 直接走 raw fast-path,跳过页面自动化(菜单污染克隆 DOM 的真案例)。

扩展 origin 三形态(OpenSquilla/网关类 origin 白名单必读)

安装形态 扩展 ID
Chrome 商店 kghjmmajnpbkljankbbjbmnhfdocaeho(CWS 固定)
仓库目录加载(manifest 带 key) apoodheofdhglelbnmggeokbhampbmgn(key 推导)
release zip 解包 路径推导,每台机器不同(打包会剥 key)

chrome://extensions 里显示的 ID 是唯一事实源。本地网关用 ws://(wss 被拒);配置只在网关启动时读一次。


源头:AGENTS.md 渲染 sanitizer 三坑、preExtractCleanup、DNR、扩展 ID 细则等节;ADR-0008 / 0009。同步于 2026-10-01。

Clone this wiki locally