BlackHatUSA2026:AI浏览器权限边界"

admin 2026-10-16 05:30:34 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

Black Hat USA 2026:AI浏览器权限边界

原创

Max Luo
Max Luo

白帽子罗棋琛

2026年10月2日 08:18
广东

在小说阅读器读本章

去阅读

在公众号小说中沉浸阅读

攻击与防御 AI 浏览器:重新划定网页与权限边界

Black Hat USA 2026 议题笔记:Attacking and Defending AI Browsers

传统浏览器把网页当作不可信代码。三十年来,同源策略、Sandbox、多进程、CSP、Site Isolation 和存储分区逐步收紧网页能够读取的数据与执行的动作。AI 浏览器引入了一个不同角色:它既读取网页,又理解用户任务,还能使用用户的登录态点击、输入、发送和购买。

此时,网页不必突破 Chromium Sandbox。它只要让 Agent 相信“这也是用户指令”,就可能借 Agent 合法拥有的能力完成跨站操作。漏洞从内存破坏和 SOP 绕过,转向“非可信内容能否改变受信控制流”。

Artem Chaikin 的公开课件用多个演示拆解了这一变化,并对模型选择、加固 System Prompt、内容标签、Tool Scanning、独立 Profile 与 Alignment Check 等防线逐层验证。材料最重要的结论不是某一款浏览器曾被绕过,而是:只要模型同时看见指令与非可信数据,任何基于模型理解的隔离都只能降低成功概率,不能替代权限边界。

图 1:AI 浏览器安全的核心问题,是 Agent 如何在开放网页和用户权限之间行动

1、浏览器安全边界没有消失,但已经不够

课件回顾了浏览器安全演进:1995 年的 Same-Origin Policy、2008 年的 Sandbox 与多进程、CSP、2018 年针对 Spectre 的 Site Isolation,以及之后的 Storage/Network Partitioning。

图 2:传统浏览器防线主要约束网页代码,Agent 则以用户代理身份跨站读取和操作

这些机制仍然必要。它们可以阻止恶意站点的 JavaScript 直接读取另一个 Origin 的 DOM 或 Cookie,却无法阻止以下流程:

text

用户:总结未读邮件并处理重要事项 Agent:打开邮箱 → 读取邮件正文 恶意邮件:要求 Agent 改变目标并向外发送内容 Agent:使用邮箱已有登录态创建并发送邮件

从浏览器内核看,每一步都可能合法:导航由用户授权的 Agent 发起,DOM 读取发生在当前邮箱 Origin,发送动作使用用户本人的会话。真正被绕过的是“用户意图”,而传统浏览器没有描述意图的原语。

因此,AI 浏览器要同时维护三类边界:

  • Web Boundary:Origin、Site、Frame、Permission 与进程隔离;
  • Agent Boundary:哪些内容只是数据,哪些消息可以改变任务;
  • Authority Boundary:当前任务允许访问哪些站点、数据和动作。

只加强第一类边界,无法解决后两类问题。

2、聊天侧栏与 Agentic Browser 不是同一风险级别

材料把 AI 浏览器分成两类:带 AI Chatbot 的浏览器,以及能自主导航和操作的 Agentic Browser。

图 3:摘要与问答主要产生信息风险,Agentic Browser 还会改变外部系统状态

侧栏助手如果只能读取当前页并生成文本,主要风险是页面数据泄漏、错误摘要和跨上下文混淆。Agentic Browser 可以点击、填写表单、使用登录态、浏览历史页面并在多个站点之间搬运数据,风险上限由工具权限决定。

企业部署前应为每个场景声明 Capability Envelope:

yaml

agent_task:task_id:travel-research-2026-0812user_intent:比较三家酒店的公开价格并生成摘要browser_profile:ephemeral-logged-outallowed_origins:-https://hotel-a.example-https://hotel-b.example-https://hotel-c.exampleallowed_actions:-navigate-read_visible_text-take_screenshotdenied_actions:-login-upload_file-send_message-submit_form-purchase-read_browser_historydata_budget:upload_bytes:0cross_origin_copy_bytes:0expires_at:2026-08-12T12:30:00Z

任务“比较酒店价格”不需要继承用户邮箱、云盘和支付站点的 Cookie。若产品默认把整个日常浏览 Profile 交给 Agent,再用确认弹窗兜底,实际上先授予了过大的环境权限。

3、间接提示注入来自同一条 Token 通道

System Prompt、用户消息、网页正文、邮件、PDF、图片 OCR、Alt Text 与 Tool Result 最终都会成为模型上下文。模型可以在概率上学习“System 指令优先”,却没有像 CPU 特权级或 SQL Prepared Statement 那样的结构化隔离。

图 4:开发者指令、用户任务和第三方内容进入同一 Token 序列

课件区分两种注入:

  • 直接注入:攻击者就是对话用户,直接要求模型改变规则;
  • 间接注入:攻击者把指令埋在网页、邮件、文档、搜索结果或图片中,等待合法用户的 Agent 读取。

图 5:间接注入不需要攻击者接触受害者的对话,只需控制一份可能被读取的内容

浏览器场景尤其适合间接注入,因为 Agent 的正常工作就是读取任意第三方内容。攻击文本可以放在不可见 DOM、CSS 隐藏区域、ARIA 属性、Meta Tag、图片像素和不同缩放层级中。课件还比较了 OCR 与视觉模型:即使删除 DOM 隐藏文本,截图理解仍可能把图片中的指令带入上下文。

图 6:输入清洗不能只处理 HTML 文本,视觉与 OCR 路径同样会产生非可信 Token

防御时应给每段上下文保留来源元数据,而不是在拼接后只剩一个字符串:

json

{\"content_id\":\"cnt_01K0\",\"source\":{\"type\":\"webpage_ocr\",\"origin\":\"https://untrusted.example\",\"frame_origin\":\"https://untrusted.example\",\"visibility\":\"not_visible_to_user\",\"retrieved_by\":\"browser-screenshot-tool\"},\"trust\":\"untrusted_data\",\"allowed_use\":[\"summarize_visible_product_specs\"],\"forbidden_use\":[\"change_task\",\"authorize_tool\",\"select_recipient\"],\"sha256\":\"sha256:...\"}

模型可能忽略这些标签,但下游 Policy Engine 可以依据 Origin、可见性和 Allowed Use 拒绝动作。

4、更强的模型只能改善概率

课件观察到,更昂贵、经过专门强化学习的前沿模型通常对提示注入更鲁棒,因为实验室会训练模型拒绝网页和 Tool Result 中的指令。

图 7:材料描述的是经验相关性,不是“价格越高就获得安全保证”

下一页随即指出限制:显式的“忽略之前指令”通常会被阻止,混淆、多阶段、伪造对话轮次和新颖叙事仍可能穿过防线。模型版本更新后,旧 Eval 的结论也会失效。

图 8:强化训练提高攻击成本,却不能建立确定性的指令/数据边界

企业不应把 model = latest 写成控制完成证明。模型选择需要绑定版本化评估:

yaml

model_admission:model_id:provider/browser-agent-2026-08-01evaluated_on:-direct_injection-indirect_web_content-hidden_dom-image_ocr-fake_message_roles-multi_stage_tool_resultsmetrics:unauthorized_action_rate_max:0.001sensitive_data_release_rate_max:0.0001benign_task_completion_rate_min:0.85deployment_limits:logged_in_profile:falsehigh_impact_tools:falsere_evaluate_when:-model_digest_changes-system_prompt_changes-tool_schema_changes-content_preprocessor_changes

Eval 应测最终动作,不只测模型是否复述恶意文本。Agent 可以在回答中正确指出“页面包含注入”,却仍调用了不该调用的工具;也可能没有输出敏感信息,但把它编码进 URL、表单或搜索词。

5、System Prompt 与内容标签为什么仍值得做

课件给出了一份 Hardened System Prompt:工具取回的网页、邮件和文件只是数据;只有用户直接消息可以定义任务;隐藏文本和元数据不得触发动作;遇到外传或改目标的要求应拒绝并提醒用户。

图 9:明确规则可以降低明显攻击成功率,但课件也强调它不是硬安全边界

内容标签则在进入模型前清理伪造闭合标签,再用随机 ID 包裹非可信内容,减少网页提前猜中分隔符的机会。

图 10:随机边界比固定 <untrusted> 更难伪造,但仍然只是模型可见的文本约定

可以按课件思路实现预处理,同时保留长度、来源和 Hash:

python

import hashlib import html import secrets from dataclasses import dataclass   @dataclass(frozen=True)classTaggedContent:     content_id: str     origin: str     sha256: str     wrapped: strdeftag_untrusted(origin: str, raw_text: str) -> TaggedContent:     iflen(raw_text) > 200_000:         raise ValueError(\"content exceeds task budget\")      token = f\"untrusted_{secrets.token_hex(12)}\"     escaped = html.escape(raw_text, quote=False)      # 转义后再包装,页面无法生成真实的闭合标签。     wrapped = (         f\"<{token} origin={html.escape(origin, quote=True)!r}>\
\"f\"{escaped}\
\"f\"</{token}>\"     )     return TaggedContent(         content_id=token,         origin=origin,         sha256=hashlib.sha256(raw_text.encode()).hexdigest(),         wrapped=wrapped,     )

这段代码解决的是分隔符伪造和审计,不会让模型获得真正的 Taint Tracking。原始 Origin、可见区域和 Content ID 必须随 Tool Call 传播到策略层;如果下游只接收模型生成的字符串,标签的安全价值会在第一步后消失。

6、第二个模型不是独立信任根

Tool Scanning 使用另一个模型审查主 Agent 的调用参数:通过则自动执行,失败则暂停并请求用户确认。

图 11:Scanner 与主模型相互独立,但两者可能共享相似训练数据、盲点和上下文欺骗方式

课件研究的 Atlas 在当时已经组合强模型、加固 Prompt、内容标签、Tool Security Scanning 和 Man-in-the-loop,仍被复合载荷绕过。材料展示的攻击同时伪造闭合标签、System Prompt、User Message、Assistant Message 和新任务,把恶意流程包装成看似连续的对话。

图 12:复合载荷攻击的是整套上下文语法,而不是某一个“忽略之前指令”关键词

这里不需要复刻完整 Payload,也能得到审计结论:

  1. 如果 Scanner 读取与主模型相同的污染对话,它可能接受攻击者伪造的用户意图;
  2. 如果 Scanner 只检查单次 Tool Call,它看不到多步外传链;
  3. 如果 Scanner 的失败结果只是触发确认,攻击者还可以利用确认疲劳;
  4. 如果两个模型都属于同一模型家族,它们的失效并非统计独立。

因此,Scanner 应输出风险信号,而不是签发权限。真正的执行准入必须包含确定性条件:调用者身份、任务允许的工具、Origin、数据流方向、参数 Schema、速率、金额和用户批准票据。

7、先隔离会话,再讨论识别注入

课件介绍的 Brave 方案包括独立 Browser Profile、限定模型、加固 Prompt、非可信内容标签和 Alignment Check。

图 13:独立浏览会话直接减少 Agent 可见的 Cookie、历史和已登录站点

会话隔离的价值远高于一条新的 Prompt 规则。Agent 无法访问邮箱 Cookie,就不能从恶意网页跳到邮箱读取内容;没有支付会话,就无法完成购买。OpenAI 当前关于 Atlas Agent Mode 的公开指引也建议:任务不需要登录时使用 Logged-out Mode,限制已登录访问,并谨慎核对高影响确认。官方资料同时明确,Prompt Injection 仍是长期开放问题,而不是已经解决的缺陷。

企业可以按任务创建临时 Profile:

typescript

typeProfilePolicy = {   profileId: string;   expiresAt: string;   allowedOrigins: string[];   importCookies: false;   browserHistory: false;   passwordManager: false;   downloads: false;   extensions: string[]; };  functioncreateResearchProfile(origins: string[]): ProfilePolicy {   if (origins.some((origin) => !origin.startsWith(\"https://\"))) {     thrownewError(\"only HTTPS origins are allowed\");   }    return {     profileId: crypto.randomUUID(),     expiresAt: newDate(Date.now() + 30 * 60_000).toISOString(),     allowedOrigins: [...newSet(origins)],     importCookies: false,     browserHistory: false,     passwordManager: false,     downloads: false,     extensions: [],   }; }

如果任务必须登录,应该只为必要 Origin 建立新会话,不复制默认 Profile 全部 Cookie;任务结束后撤销会话并销毁 Profile。高敏站点可完全禁止 Agent 模式,或要求用户 Take Over 后由人完成操作。

8、Alignment Check 要与确定性 Policy 组合

Alignment Check 在每次 Tool Call 前缓冲动作,收集用户原始消息和对话历史,用专门模型判断动作是否与用户意图一致,再附上允许/拒绝元数据后释放。

图 14:逐调用对齐能发现任务漂移,但“用户意图”本身不能只由另一个模型解释

可以把原始任务在启动时编译成不可变授权对象。Alignment Model 只补充风险评分,OPA 或其他 Policy Engine 决定硬边界:

rego

package browser_agent.action  default allow := false  allow if {     input.task.status == \"active\"     time.now_ns() < time.parse_rfc3339_ns(input.task.expires_at)     input.action.name in input.task.allowed_actions     input.action.target_origin in input.task.allowed_origins     not input.action.uses_untrusted_content_as_authority     not input.action.crosses_data_boundary     input.alignment.verdict == \"aligned\" }  require_confirmation if {     input.action.name in {\"send\", \"submit\", \"purchase\", \"delete\", \"upload\"} }  deny_reason contains \"origin outside task scope\" if {     not input.action.target_origin in input.task.allowed_origins }  deny_reason contains \"untrusted page selected a recipient\" if {     input.action.recipient_source.trust == \"untrusted_data\" }  deny_reason contains \"cross-origin data transfer is not authorized\" if {     input.action.crosses_data_boundary }

这里的 allowed_origins 和 allowed_actions 来自用户发起任务时的 UI 选择,不由模型从聊天中自行推断。若任务范围需要扩大,必须创建新的授权版本,而不是让网页内容或 Agent 自动修改当前任务。

9、确认必须展示“数据流 Diff”

Man-in-the-loop 经常被设计成“Agent 要继续,是否允许?”这类弹窗几乎没有安全价值。用户无法看见目标站点、发送的数据和来源,连续点击几次后就会形成确认疲劳。

有效确认应回答五个问题:

json

{\"action\":\"send_email\",\"destination\":{\"origin\":\"https://mail.example.com\",\"recipient\":\"[email protected]\",\"recipient_source\":\"user_message\"},\"data\":[{\"label\":\"invoice summary\",\"classification\":\"internal\",\"source_origin\":\"https://expenses.corp.example\",\"preview\":\"Hotel expense, 860 USD...\"}],\"reason\":\"用户要求将本次费用摘要发送给财务\",\"scope_change\":\"从费用系统向邮箱传输内部数据\",\"approval_expires_in_seconds\":60}

批准票据必须绑定 Action Hash、参数 Hash、目标 Origin、数据标签和短过期时间。用户批准发送给 [email protected],Agent 不能在执行前把收件人替换掉,也不能将票据复用于下一封邮件。

python

import hashlib import json   defaction_digest(action: dict) -> str:     canonical = json.dumps(         action,         ensure_ascii=False,         sort_keys=True,         separators=(\",\", \":\"),     ).encode()     return hashlib.sha256(canonical).hexdigest()   defverify_approval(action: dict, approval: dict, now: int) -> None:     if approval[\"expires_at\"] < now:         raise PermissionError(\"approval expired\")     if approval[\"action_sha256\"] != action_digest(action):         raise PermissionError(\"action changed after approval\")     if approval[\"used\"]:         raise PermissionError(\"approval is single-use\")

确认是高影响动作的最后一道控制,不应承担识别所有提示注入的任务。低价值重复动作要用预授权范围处理,高价值动作要提供足够信息让用户作出真实判断。

10、浏览器 Agent 的上线标准是限制损失,不是“通过越狱测试”

课件最后讨论动态挂载工具、提示注入检测、文本清洗以及 CaMeL、Plan-then-execute 等方案,同时对它们在通用浏览器中的适用性保持谨慎。

图 15:开放网页、动态任务与跨站状态让通用浏览器比封闭业务 Agent 更难建立可证明边界

CaMeL 的思路是从受信用户查询中提取控制流,用隔离模型处理非可信数据,再通过 Capability 约束数据流。它在任务模板相对稳定时很有价值;通用浏览器任务高度动态,用户可能中途改变目标,网页交互又不断产生新状态,因此完整控制流很难预先固定。

企业上线前至少应完成以下验证:

  • Agent 默认使用临时、无 Cookie Profile;
  • 工具按任务动态挂载,而不是全局暴露;
  • Origin、动作、数据分类和过期时间进入不可变授权;
  • 网页、邮件、文件、OCR 和 Tool Result 均标记来源与信任级别;
  • 外部内容不能选择收件人、目标 Origin 或扩大任务;
  • 写入、发送、上传、购买和删除由确定性 Policy 拦截;
  • 用户确认展示目标、数据、来源和范围变化,并绑定执行 Hash;
  • Agent 行为日志能够还原“看见什么、决定什么、调用什么、谁批准”;
  • Eval 覆盖直接、间接、图像、多阶段、伪造角色和跨 Tool 外传;
  • 模型、Prompt、预处理、工具或浏览器版本变化后自动重跑;
  • 监控异常跨 Origin 数据流、短时多次确认、非用户指定收件人和新站点导航;
  • 发生注入时可以立即禁用 Agent Mode,而不影响普通浏览器业务。

OpenAI 的公开安全说明把 Prompt Injection 定义为持续演进的开放挑战,并通过自动化红队、对抗训练、确认、Logged-out Mode 等多层机制不断加固 Atlas。这与课件的工程判断一致:不能等待一个“彻底解决注入”的模型版本,必须在模型可能失效的前提下设计系统。

对 AI 浏览器而言,最可靠的问题不是“Agent 会不会听网页的话”,而是:即使它听了,能看到哪些登录态,能调用哪些工具,能把什么数据送到哪里,哪一步必须由人明确批准。把这四件事限制清楚,提示注入才会从账户级事故降级成一次被拒绝、可审计的异常动作。


延伸资料:OpenAI:持续加固 ChatGPT Atlas 的 Prompt Injection 防线 · OpenAI:Understanding Prompt Injections · CaMeL 论文

Black Hat 官方 Session 页面

原始会议材料(仓库内)

  • 演讲课件 PDF

开源资料与原始议题 PDF

本文对应的 Markdown 原稿、Black Hat 原始议题 PDF 与配图已整理到 GitHub,可按文章编号查找和下载。

https://github.com/cybermaxluo/black-hat-usa-2026-talks

也可以点击文末“阅读原文”进入仓库。欢迎 Star、提交 Issue 或参与勘误。


BlackHatUSA2026:AI浏览器权限边界" 网络安全文章

BlackHatUSA2026:AI浏览器权限边界"

本文基于BlackHatUSA2026议题,分析AI浏览器带来的安全边界变化。核心结论是:模型同时看见指令与非可信数据时,任何基于模型理解的隔离都只能降低攻击成功概率,不能替代权限边界。文章提出三类边界(Web、Agent、Authority),并给出会话隔离、内容标签、版本化评估、确定性执行准入等可操作防御建议。
(9.8分)CVE-2026-104286:FortiMail任意文件写入" 网络安全文章

(9.8分)CVE-2026-104286:FortiMail任意文件写入"

FortiMail曝出CVE-2026-104286严重漏洞,CVSS评分9.8,属未认证路径穿越加NULL字节注入导致的任意文件写入,官方已确认在野利用。影响多个版本,攻击者可写入恶意文件实现代码执行。建议立即关闭IBE功能或限制管理面暴露,并按版本升级修复,同时对照官方失陷指标排查系统。
评论:0   参与:  0