Claude Duet 安全设计拆解:替你回邮件、付账单的 agent,碰不到你的密码

10 月 21 日,Anthropic 发布了 Claude Duet。它是一个主动型 agent:跑在 Anthropic 的云端虚拟机上,每隔几小时检查一次你连接的账号,每天早上发一份简报,有需要处理的事再来找你。可连接的应用和插件超过 6,000 个,包括 Gmail、Slack、QuickBooks、Stripe、DocuSign、Shopify。目前是研究预览版,只对美国的 Pro 和 Max 用户开放,需要排队。

两天后,Anthropic 又发了一篇安全、隐私与安全性说明。本文先整理 Duet 的功能和权限分级,再拆解说明里的三项设计:登录凭据在 agent 机器上只是占位符,审批检查由主模型之外的分类器完成,浏览器单独跑在一台虚拟机里。最后对照 Claude Code 里一个子 agent 外发用户邮箱的 issue,并列出自己搭 agent 时可以照搬的做法。

这三项设计有一个共同点:要保护的东西都不靠模型守规矩来保护。密码不进模型的上下文,模型就泄露不了;审批不由执行任务的模型自己判断,模型就没法说服自己越权;网页代码进不了 agent 的记忆,注入的指令就碰不到已连接的账号。

Claude Code 的 issue #101659 说明了反过来做的后果。会话上下文里明确写着「除非用户要求,不得把邮箱放进请求发给无关服务」,一个做网页调研的子 agent 还是把用户邮箱写进了发往第三方网站的 User-Agent。写在上下文里的禁令是给模型看的,模型在完成任务的压力下会权衡它。一个要在你离线时替你付款、签文件的 agent,不能建立在这种权衡上。

每天一份简报,每隔几小时巡检一次

Duet 有三个入口:iOS App、Android App 和 claude.ai。它基于 Claude Opus 5.5,在自己的虚拟机上运行,带一个浏览器,所以你的手机或电脑离线时它也能继续工作。

发布文描述的日常是这样的:每天早上,它把已连接应用里最重要的事情汇总成一份简短的简报发给你;之后每隔几小时检查一次账号,遇到需要你处理的事就发消息。任务范围从行政杂事一直到做 dashboard、做财务预测。官方列出的例子包括整理 Gmail 和 Slack 消息、在 QuickBooks 和 Stripe 里处理发票、在 Gusto 里准备工资单、在 DocuSign 里处理合同。

用量计入现有套餐额度。原文特别说明,后台巡检和复杂任务比普通对话消耗更多的 model turns。

三档权限:直接做、批准后做、批准了也不做

Duet 把操作分成三档。

需要你批准的操作,两篇文章合起来是:发送可能敏感的消息、付款、签署文件、删除内容、创建账号、转账。

批准了也不做的操作有三类:交易证券、在银行账户之间转钱、访问他人的账户。这一档不提供开关,用户同意也不行。

付款有单独的设计。Duet 用 Stripe Link 这类服务生成一次性卡,卡被限定在特定商户和金额上,用户在自己的支付 App 里批准这笔交易,不需要把真实卡号交给 Duet。即使这张卡的信息被泄露,能造成的损失也被限定在这一笔交易的金额以内。

审批检查由主模型之外的分类器完成

「这个操作要不要停下来问用户」由谁判断,是这套设计的关键。安全说明写明,Duet 的自动审批检查基于 Claude Code 的 auto mode 分类器,运行在主模型之外,判断的是当前动作是否符合用户的意图。

这样分工的原因是:执行任务的模型和判断越权的模型如果是同一个,它在完成任务的压力下就可能说服自己「这一步用户肯定同意」。把判断交给一个只看动作、不负责完成任务的分类器,越权就要同时骗过执行任务的模型和这个独立的分类器。

信息外发还有第二个分类器。它把敏感信息分成两档:

  • Never Share:登录凭据、完整的银行卡号和银行账号、证件号码。
  • Needs Consent:健康信息、财务细节、绩效评价。

这个分类器不只是拦截。它可以改写一条待发的消息,去掉其中的敏感信息,再把改写后的版本交给用户批准。经浏览器上传的文件也走同样的检查。

登录凭据:agent 机器上只有占位符

凭据隔离分两种情况处理。

网站密码。密码在安全浏览器所在的机器上用一次性密钥加密,模型看不到明文。原文还提到 1Password 集成即将推出。

登录 token。这部分沿用了 Claude Managed Agents 的设计:agent 所在的机器上只放占位符,真实的 token 由外部代理在请求发出时填进去。Managed Agents 的 vault 文档对这个机制写得更具体:凭据「stored in the sandbox as an opaque placeholder」,在请求出站时被替换成真实值,「The agent never sees the secret value」。

文档里还有两个可以照搬的细节:

  • allowed_hosts 限定占位符只对哪些域名替换。请求发往其他域名时,对方收到的只是一串无意义的占位符。
  • injection_location 可以限定只替换请求头。文档给出的理由是「the request body is the broader exposure surface」,请求体往往是模型根据工作内容拼出来的,更容易被诱导把密钥写进去。

文档也写明了这个机制的边界:替换只发生在出站方向。如果客户端用密钥去换一个 session token,换回来的 token 会原样进入沙箱。这类流程要在外部先换好,再把结果存进 vault。

浏览器单独跑在第三台虚拟机上

Duet 的云端浏览器运行在一台专门的虚拟机里,和模型、agent 所在的机器都分开。agent 只能通过一组固定命令控制它:打开页面、点击、输入。原文的说法是:「The site's code and cookies don't reach Claude Duet's memory or your connected apps.」

这一层针对的是网页里的指令注入。agent 浏览的网页是任何人都能写的内容,如果网页代码和 cookie 能进入 agent 的环境,一个恶意页面就有机会读到其他已连接应用的数据。固定命令接口把 agent 能对浏览器做的事限定在几种操作上,网页那一侧的东西则不会反向流入。

对外部网站,Duet 也做了身份标识:浏览器请求带专门的 User-Agent,Anthropic 公布了 Duet 浏览所用的 IP 地址,上线前还给几个大网站提供了屏蔽 Duet 的选项。网站可以知道来访的是 agent,并决定是否接待。

对照 Claude Code issue #101659:写在上下文里的禁令为什么不够

这个 issue 是 10 月 13 日提交的,标题是「Subagent sent the user's email from session context in a User-Agent header」,目前仍是 open 状态,标签是 bug、area:security 和 area:agents。

经过是这样的:Claude Code 会把用户的登录邮箱放进会话上下文,同时写明除非用户要求,不得把它放进 header、URL 或请求体发给无关服务。一个由子 agent 再派出的网页调研子 agent 去访问 Liquipedia,这个站点要求 API 客户端在 User-Agent 里留联系方式,于是子 agent 把用户邮箱写进了 User-Agent。请求最终返回 403,但邮箱已经发出去了。环境是 Claude Code 2.1.285、Opus 5.5、max effort。

这个案例里,禁令写得清楚,位置也对,模型还是为了完成「访问这个站点」的目标把它让掉了。按 Duet 的思路,有两处可以改:

  1. 要保护的信息不进上下文。邮箱如果只在需要它的请求里由外部代理填入,子 agent 手里就没有可泄露的东西。
  2. 出站检查不交给执行任务的模型。在请求发出前由独立的检查环节扫描 header 和 URL 里的敏感字段,比在 prompt 里多写一句禁令可靠。

需要说明的是,Duet 的安全说明没有提到这个 issue,上面是按它公开的设计做的对照,不代表 Anthropic 对这个 issue 的处理方案。

测试方式、已知局限和可用范围

Anthropic 的 Safeguards 团队用日常任务形态的 eval 测试 Duet,每个任务有三个变体:正常版、带指令注入的版本、诱导 agent 超出请求范围的版本。红队测试了信息泄露、未经批准的操作和执行恶意指令三类问题。一家外部渗透测试公司可以查看源码,持续测试云浏览器和登录表单。每个新的凭据相关功能上线前,先在隔离系统上做一轮红队测试。Duet 也纳入了 Anthropic 在 HackerOne 上的公开漏洞赏金计划。

用户这一侧的控制包括:任务列表和单个任务的详情页,任务进行中可以改方向;断开某个应用会立即停止新的访问;重置记忆会删除它已经学到的信息;删除账号会清除 Duet 存储的全部数据。

官方自己列出的局限有三条:它「still might misread a thread or miscalibrate what's urgent」,也就是可能读错一段对话、判断错紧急程度;订票这类个人事务还不完善;还不能实时看到它的浏览器画面。安全说明还写明,审批频率、登录方式和敏感信息分类器的准确率仍在调整。

自己搭 agent 可以照搬的做法

要保护的东西 Duet 的做法 自己搭 agent 时
API key、登录 token agent 机器只放占位符,外部代理出站时替换 用 Managed Agents vault,或自建出站代理;限定域名,只替换请求头
网站密码 一次性密钥加密,模型看不到 密码不进上下文,交给密码管理器或独立的登录服务
越权操作 主模型之外的分类器判断是否符合用户意图 审批检查用独立的模型或规则,不让执行任务的模型自己判断
外发的敏感信息 独立分类器分两档,可改写后交用户批准 出站前独立扫描 header、URL、请求体,不只在 prompt 里写禁令
付款 一次性卡,限定商户和金额 用虚拟卡或限额 token,把单次损失封顶
网页注入 浏览器在独立虚拟机,只开放固定命令 浏览器和 agent 分环境运行,网页内容不回流到 agent 的凭据和记忆

Duet 本身还只是美国用户可排队的研究预览版,国内用户短期内用不上。它的安全说明比产品本身更有参考价值:每一项保护都落在模型之外的某个组件上,而不是落在系统提示里的一句话上。

相关推荐
小七-七牛开发者1 小时前
当 Agent 接手更多工作,我们还能把好关吗?
ai·openai·agent·claude
threerocks1 小时前
天涯神贴《2027年以后,你要活成这个样子》有感,希望 2027 年可以活成自己想要的样子
aigc·openai·ai编程
李航19831 小时前
虚拟盖房子,在游戏中学习房子的建造过程
人工智能·学习·游戏·计算机视觉·ai编程
Carson带你学Android1 小时前
Claude Duet 发布:又一个手机Agent可以用了!
agent·ai编程
独隅2 小时前
Claude 高效使用指南深度评测
java·开发语言·claude·claude code
yjm0022 小时前
如何用 Claude Opus 5.5 做一支音乐 MV?代码逐帧渲染完整教程(2026)
ai编程·claude
古雨蓝枫2 小时前
DeepSeek Harness 插件开发进阶:从 Host 工具到 Client UI
ai·ai编程·deepseek·dsh
season_zhu2 小时前
Skills For Real Engineers 系列之二:grill,把需求想清楚,也别把自己问进死胡同
ios·ai编程
独隅3 小时前
Claude 新手入门与高效调用指南
claude