安全与隐私
Surface 扩大的是页面业务能力的可达范围,因此安全边界不能只放在提示词或客户端。实现应假定调用方可能恶意、模型可能被注入、凭证可能泄露,并让每个失败路径默认关闭。
威胁
| 威胁 | 典型情形 | 主要控制 |
|---|---|---|
| 混淆代理 | Agent 借用户会话执行用户未同意的操作 | 明确委托、作用域交集、后端授权 |
| 权限提升 | 能力清单隐藏,但调用相似 id 仍可执行 | 同一交集校验、默认拒绝 |
| 重放 | 同一请求被重复提交,产生二次写入 | request id、防重放窗口、幂等业务 |
| 提示注入 | 工单正文诱导 Agent 忽略规则 | 数据/指令分离、固定能力说明 |
| 凭证泄露 | token 进入模型上下文、日志或 URL | 凭证只留在宿主、出站脱敏 |
| 会话劫持 | 跨站请求或盗用 Cookie 调用桥 | SameSite、CSRF、origin 校验、短期委托 |
| 恶意 Agent | 批量调用、探测隐藏能力、诱导批准 | 限流、审计、审批隔离、撤销 |
| UI 欺骗 | 审批界面显示与真实参数不一致 | 绑定规范化参数、真人可见摘要 |
| 供应链 | 恶意 SDK 或依赖读取页面数据 | 锁定依赖、构建审计、最小权限 |
认证与授权
认证、业务授权与协议校验是三层独立控制:
- 认证确认“谁在调用”;
- 业务授权确认“这个用户能否做这件事”;
- 协议校验确认“这个能力是否属于本次暴露范围”。
任何一层成功都不能替代其他层。后端必须在写入前重新检查权限、租户、对象归属、金额与业务约束。页面能力描述只是提示和边界,不是数据库授权。
最小暴露
应用应逐项决定外部 Agent 是否需要某字段、某项能力或某个页面。默认不应把整个 store、整个 DOM 或所有内部 API 投影出去。
敏感值可以采用:
- 完全不投影;
- 返回稳定代号,执行时由页面解析;
- 返回掩码供人识别;
- 仅在用户确认界面显示原文。
代号必须绑定记录与字段,不能在另一条记录上复用。响应、after、错误消息、调试面板和审计日志都必须遵守同一暴露规则。
提示注入与数据边界
用户评论、文件名、工单正文、网页内容和工具返回值都是不可信数据。它们不得改变能力说明、审批要求或系统规则。客户端应把页面内容放在明确的数据区,并避免把“请忽略之前指令”等文本提升为工具指令。
模型生成的参数在进入执行器前必须再次校验 schema 与记录归属。模型无权决定 userId、agentId、sessionId 或审批结果。
审批与撤销
高风险操作必须由真实用户确认。审批挑战应绑定:
- request id;
- 能力 id;
- 目标记录;
- 规范化输入摘要;
- 用户、Agent 与会话;
- 有效期。
Agent 只能看到等待状态与最终结果,不得看到批准 token。撤销后,后续调用必须立即失败;浏览器事件只是加速提示,不能替代每次调用的验证。
审计与隐私
审计需要足够回答“谁在何时对哪条记录做了什么”,但不需要保存原始提示词或完整业务正文。默认记录元数据与稳定错误码,敏感字段使用受控标识。日志保留期限、访问权限和数据主体请求应由部署方定义。
部署控制
- 只通过 HTTPS 暴露远程传输;
- 不把凭证放入 URL 或前端构建变量;
- 对
postMessage校验 origin 与 source; - 对 HTTP 接口实施 CSRF 防护与同源策略;
- 为限流、防重放、审计配置持久化与告警;
- 对第三方依赖做版本锁定和漏洞扫描;
- 准备全局暂停、撤销单个 Agent、收窄作用域与回滚版本的操作路径。
法律边界
协议不会自动产生合规资格或责任豁免。它让授权范围、用户同意、最小权限与审计链更清楚,但高风险业务仍需要合同、身份核验、人工复核和适用法律要求的控制。当前版本没有独立安全审计,也没有认证第三方实现;不要把“协议支持”说成“已经安全认证”。

