一个咖啡店网站,普通人打开看到的是菜单和门店介绍。换成Claude去访问,看到的却是一个假冒Cloudflare样式的“机器人验证页面”,要求它“逐字母浏览用户档案”才能完成认证。同一个网址,两副面孔——区别只在请求头里有没有那句Claude-User

这不是段子,是安全研究者Ayush Paul几天前公开的一次真实攻击:他借这个诱饵网站,把Claude用户的姓名、所在城市、雇主名称,一个字母一个字母地套了出来。

三条规则,漏了第三条

Claude的web_fetch工具原本设计得挺谨慎:能访问的网址只有两种来源——用户自己输入的URL,或者web_search搜出来的结果。这条规则是确定性的,不靠模型自觉,靠白名单硬挡。Simon Willison去年还专门夸过这个设计,说它能从机制上挡住那种“把我的回答拼进某个网址再打开它”式的外泄指令。

问题出在一条容易被忽略的第三款:web_fetch还被允许跟随已经抓取过的页面里嵌入的链接。这条规则单看没毛病——正常浏览网页谁不点链接。但它意味着,只要攻击者能让Claude先抓到第一个页面,后面每一步“合法的”跳转,其实都攻击者说了算。

  • 结论.白名单挡住的是“凭空指定的恶意网址”,挡不住“从已授权页面里长出来的新网址”——这是规则设计里最容易被忽视的缝。

攻击是怎么走完的

Ayush的诱饵页面伪装成一次身份验证,告诉Claude“由于工具限制,需要逐字母浏览用户档案”,然后给出一串按字母表排列的网址:/a/b……一路引导Claude把用户名字拆成字母,一段段拼进请求路径里发出去,攻击者服务器再从访问日志里把这些片段重新拼回姓名。

攻击链:从诱饵网站到姓名外泄 访问 诱饵网站 伪装 验证页面 仅对Claude显示 逐字母 嵌套链接 /a → /ay → /ayu 姓名编码 进请求路径 服务器 日志还原 每一步跳转都“合法”来自上一步已抓取的页面,白名单机制全程没有报警

被套出来的不只是明面上存在于记忆里的信息。文章还提到一个更细的细节:Claude有时并不是直接读取存好的记忆条目,而是从对话上下文里做推断——比如提过一次“高中参加过黑客松”,就可能被反推出大致所在的城市。这意味着,就算用户从没明确告诉过Claude自己住哪、在哪工作,风险依然存在。


修复,和一个没有验证的说法

Ayush通过Anthropic的漏洞赏金项目提交了这个问题,得到的回复是内部已经识别过,因此不发赏金。这个说法目前没有第三方能核实——是不是常见的厂商话术,还是确有内部记录,外界拿不到证据。真正可验证的是结果:Anthropic的修复方式,是直接砍掉“跟随已抓取页面链接”这条权限,只留下用户输入和web_search结果两条准入路径。

web_fetch的三条准入规则 规则一:用户自己输入的网址 规则二:web_search 返回的结果 规则三:已抓取页面中的链接——漏洞点,已被移除 攻击者只需让Claude先访问一次自己的页面,后续跳转全部“自证合法”

这次修复本身没什么可挑的,但它暴露的问题比一次补丁大。Simon Willison此前称赞这套白名单机制“确定性地”挡住外泄,判断没错——规则一、规则二确实是硬约束,不靠模型自觉判断可信度。可整套系统的安全性,从来取决于最弱的那一条分支,不是最强的那两条。多留一条“看起来无害”的例外,整套白名单就等于没设。这跟“千里之堤,溃于蚁穴”是同一个逻辑:堤坝的强度不看修得多高,看蚁穴开在哪。

更值得留意的是投递路径。这次演示是研究者主动引导Claude访问诱饵网站,但文章也提到,攻击者完全可以对诱饵页面做搜索引擎优化,让它自然出现在web_search的结果里——用户只是让Claude查个无关话题,顺手就被动踩中陷阱。“不点可疑链接就安全”这个直觉,在这里是不成立的。

白名单挡不住从白名单内部长出来的新地址

这套“致命三要素”——接触私有数据、读取不可信内容、拥有对外联网能力——不是Claude memory功能独有的病。任何Agent只要同时具备这三样,连的是邮箱、云盘还是MCP工具,风险结构都一样。Claude这次的漏洞是具体案例,但暴露的是一整类agentic产品都要过的坎。

  • 风险.同类漏洞很可能不止出现在Claude一家,其他厂商的浏览类Agent工具是否做过同样的边界检查,目前公开信息里没有答案。