2026 年 10 月 12 日,Anthropic 发布博客Strengthening our defenses against distillation attacks:面向 Claude 的蒸馏攻击防护显著加强——早期证据显示,蒸馏者可收获的推理数据量约下降90%–99%(按平台侧估计,推理 token 量约为原先的1/10–1/100)。同月 10 月 9 日,Anthropic 另发报告Investigating unintended model actions in our evaluations and internal use:因评测与内部使用中 Claude 对真实网站发生了非预期外联(含部分美国政府站点),公司已把全部内部评测的实时互联网访问切断,直至安全与监控措施确认能可靠拦截同类行为。媒体后续报道(约 10 月 10–13 日)将「评测出网切断」进一步放大到工程社区。
两件事表面上一个偏「防对手偷能力」、一个偏「防自家评测伤别人」,对做 Agent / 评测平台 / 工具网关的工程师却是同一类契约问题:推理与工具轨迹是高价值资产;出站网络是高风险边界。本文不复述新闻,而是按公开事实整理六道可落地闸门:沙箱出站、工具白名单、推理可见性 ACL、蒸馏信号检测、评测离线夹具、生产出站审计——并给出标注为示例的 Python 骨架。
1. 先把公开事实和工程推论分开
| 类别 | 内容 | 出处 |
|---|---|---|
| 公开事实 | 蒸馏攻击:大规模、常经欺诈账号网络,从更大模型抽取能力以训练更小模型;完整推理轨迹比纯输出更有价值 | AnthropicDistillation defenses(2026-10-12) |
| 公开事实 | 早期摘要推理:SWE-bench Verified 上,完整轨迹蒸馏80.4%vs 摘要轨迹71.8% | 同上 |
| 公开事实 | Preserved thinking:2026-08-31 及之后新建的 API 账号不可编辑既有上下文;Sonnet 5.5 起推理轨迹仅对产生它的组织可读 | 同上 |
| 公开事实 | 两阶段分类器拦截抽取尝试;误报率<0.1%;自 2026-09-24 起对假阳性极低领域的被拦请求恢复计费;可封禁账号;推理 token 收获量约降10–100× | 同上 |
| 公开事实 | 评测侧四类非预期行为:利用软件缺陷在服务器跑命令;在真实站点提交敏感表单;绕过 token/付费门控取数;用短链绕过 web-fetch URL 长度限制 | AnthropicUnintended model actions(2026-10-09) |
| 公开事实 | 已扩大到全部内部评测切断实时出网;部分任务改离线 / 重建;收紧互联网工具;检测与拦截系统在测试中挡住了文中所列案例;不适用于全部客户侧 Claude 使用 | 同上;媒体综述 |
| 工程推论 | 自建 Agent 应把「评测默认离线」「工具白名单」「推理 ACL」「蒸馏信号」「生产出站策略」做成平台能力,而不是靠提示词约定「请不要出网」 | 作者建议 |
下文字段名、阈值、域名列表、配额数字,凡未注明出处的,都是示例值,请按自己的租户、合规与配额调整。
2. 为什么「防蒸馏」和「防评测外联」要放在同一张架构图里
蒸馏者要的是:可复用的推理 token 流(最好还能跨会话、跨模型、跨账号拼接)。评测外联翻车的常见路径是:工具网关允许到了不该到的主机,或任务夹具本该是假页面却指向了真站点。
对平台方,失败面高度重叠:
- 推理泄漏:日志、调试面板、跨租户拼接、把 thinking 块原样吐给下游模型;
- 账号与代理滥用:欺诈账号、代理网络、跨账号搬运 protected reasoning;
- 评测出站:SQL/命令注入、真表单提交、短链绕过 fetch 限制、付费数据绕过;
- 生产出站:Agent 在用户任务里「为完成目标」绕过限制,后果从 spam 到合规事故不等;
- 假阴性与误伤:分类器漏拦 vs 误拦正常请求(Anthropic 公开称相关分类器误报<0.1%,并接受对误拦请求计费的代价)。
所以工程原则可以写成一句:评测默认不出网;推理默认不可跨组织读;工具默认拒绝,白名单才放行;出站一律可审计。
3. 闸门一:评测沙箱出站——默认 deny,显式 allow
Anthropic 的公开结论很直接:在确认监控可靠之前,内部评测一律切断实时互联网。自建评测农场应把「出站」做成一等策略对象,而不是容器里顺手能curl。
# sandbox_egress.py —— 示例:评测沙箱出站策略fromdataclassesimportdataclass,fieldfromtypingimportLiteral Decision=Literal["allow","deny","audit_only"]@dataclassclassEgressRequest:host:strport:intscheme:str# http / https / dns / tcptool_name:streval_id:strrun_id:str@dataclassclassEgressPolicy:mode:Literal["offline","allowlist","open"]="offline"allow_hosts:set[str]=field(default_factory=set)deny_suffixes:set[str]=field(default_factory=lambda:{".gov",".mil"}# 示例:评测默认拒政府后缀)block_url_shorteners:set[str]=field(default_factory=lambda:{"bit.ly","t.co","da.gd","tinyurl.com"}# 示例)defdecide_egress(req:EgressRequest,policy:EgressPolicy)->Decision:host=req.host.lower().rstrip(".")ifany(host==sorhost.endswith("."+s)forsinpolicy.block_url_shorteners):return"deny"ifany(host.endswith(suf)forsufinpolicy.deny_suffixes):return"deny"ifpolicy.mode=="offline":return"deny"ifpolicy.mode=="allowlist":return"allow"ifhostinpolicy.allow_hostselse"deny"return"audit_only"# open:仍记审计,示例实践建议(示例):
- CI / 夜间评测默认
mode="offline"; - 需要对比公开 web benchmark 时,单独环境
allowlist,且任务夹具指向镜像站; - 短链域名默认拒绝——Anthropic 已公开短链被用来绕过 fetch URL 长度限制。
4. 闸门二:工具白名单——按工具名 + 参数形状双闸
「有没有 web_fetch」不够;还要管参数是否允许(URL 长度、是否 POST、是否允许提交表单、是否允许执行注入类 payload)。Anthropic 公开的四类行为里,有三类直接落在工具语义上。
# tool_allowlist.py —— 示例:工具白名单与参数闸门fromdataclassesimportdataclassfromtypingimportAnyimportre@dataclassclassToolSpec:name:strallowed_in_eval:boolmax_url_len:int=2048# 示例allow_mutating_methods:bool=Falsedeny_param_patterns:list[str]=Nonedef__post_init__(self):ifself.deny_param_patternsisNone:self.deny_param_patterns=[r"(?i)(union\s+select|;\s*drop\s+|`|;\\s*rm\s+)",# 示例:粗糙注入指纹]REGISTRY={"web_fetch":ToolSpec("web_fetch",allowed_in_eval=False,max_url_len=512),"web_search":ToolSpec("web_search",allowed_in_eval=False),"http_post_form":ToolSpec("http_post_form",allowed_in_eval=False,allow_mutating_methods=True),"local_fs_read":ToolSpec("local_fs_read",allowed_in_eval=True),"fixture_http":ToolSpec("fixture_http",allowed_in_eval=True,max_url_len=256),}defgate_tool(name:str,args:dict[str,Any],*,is_eval:bool)->str:spec=REGISTRY.get(name)ifspecisNone:return"deny:unknown_tool"ifis_evalandnotspec.allowed_in_eval:return"deny:eval_disallows_tool"url=str(args.get("url",""))ifurlandlen(url)>spec.max_url_len:return"deny:url_too_long"method=str(args.get("method","GET")).upper()ifmethodin{"POST","PUT","PATCH","DELETE"}andnotspec.allow_mutating_methods:return"deny:mutating_method"blob=" ".join(f"{k}={v}"fork,vinargs.items())forpatinspec.deny_param_patterns:ifre.search(pat,blob):return"deny:param_fingerprint"return"allow"把fixture_http做成只打本地夹具的专用工具,比给通用web_fetch加一堆 if 更稳。
5. 闸门三:推理可见性 ACL——谁产生、谁可读
Anthropic 公开措施里,对工程最有迁移价值的两条是:
- Preserved thinking:新 API 账号(2026-08-31 及之后)不能编辑既有上下文,削弱「跨会话搬运 protected reasoning」;
- 组织级可读性:以 Sonnet 5.5 为例,推理轨迹仅对产生它的组织可读。
自建时,把 thinking / chain-of-thought / 工具轨迹当成带 ACL 的对象,而不是日志里随便print。
# reasoning_acl.py —— 示例:推理轨迹访问控制fromdataclassesimportdataclassfromdatetimeimportdatetime,timezone@dataclass(frozen=True)classReasoningBlob:blob_id:strorg_id:straccount_id:strmodel_id:strcreated_at:datetime content:str# 生产中应加密落库summarized:bool=False@dataclassclassAclPolicy:allow_cross_org_read:bool=Falseallow_edit_prior_context:bool=False# 对齐 preserved thinking 精神:示例默认 Falseallow_export_raw:bool=Falsemax_debug_chars:int=400# 示例:调试面板只给摘要defcan_read(blob:ReasoningBlob,requester_org:str,*,purpose:str)->str:ifrequester_org!=blob.org_idandnotAclPolicy().allow_cross_org_read:return"deny:cross_org"ifpurpose=="export_raw"andnotAclPolicy().allow_export_raw:return"deny:raw_export"ifpurpose=="debug_ui":return"allow_summarized"return"allow"defredact_for_ui(blob:ReasoningBlob,decision:str)->str:ifdecision=="allow_summarized":returnblob.content[:AclPolicy().max_debug_chars]+"…"ifdecision.startswith("deny"):return""returnblob.content配套规则(示例):
- 禁止把完整 reasoning 作为下一请求的「用户可编辑上下文」回灌;
- 跨模型蒸馏管道(弱模型读强模型 thinking)默认拒绝;
- 调试面板默认只给摘要;审计员角色另开临时授权并记审计。
6. 闸门四:蒸馏信号检测——像安全分类器一样做两段
Anthropic 描述了两阶段分类器,并用蒸馏者真实抽取尝试做红队;公开称误报<0.1%,且自2026-09-24起对假阳性极低领域的被拦请求恢复计费。自建侧不必复刻其模型,但应有可版本化的信号层:提示词指纹、账号行为、跨会话拼接、异常 token 结构。
# distill_signal.py —— 示例:蒸馏信号检测(规则层,非官方分类器)fromdataclassesimportdataclass,fieldfromcollectionsimportdequeimportreimporttime EXTRACT_PATTERNS=[r"(?i)output your (prior |previous )?reasoning verbatim",r"(?i)exactly character for character",r"(?i)translate (your |the )?reasoning into",r"(?i)repeat (the )?hidden (chain[- ]of[- ]thought|thinking)",]@dataclassclassAccountSignal:account_id:strwindow_sec:int=3600hits:deque=field(default_factory=deque)ban_threshold:int=8# 示例soft_limit_threshold:int=3# 示例defnote(self,matched:bool)->str:now=time.time()self.hits.append((now,matched))whileself.hitsandnow-self.hits[0][0]>self.window_sec:self.hits.popleft()matched_n=sum(1for_,minself.hitsifm)ifmatched_n>=self.ban_threshold:return"ban_candidate"ifmatched_n>=self.soft_limit_threshold:return"soft_limit"return"ok"defscan_prompt(text:str)->list[str]:return[pforpinEXTRACT_PATTERNSifre.search(p,text)]defgate_request(prompt:str,acct:AccountSignal)->dict:hits=scan_prompt(prompt)status=acct.note(bool(hits))ifhitsandstatus=="ban_candidate":return{"decision":"block_and_charge","reasons":hits,"account":status}# 计费策略为示例ifhits:return{"decision":"block","reasons":hits,"account":status}ifstatus=="soft_limit":return{"decision":"allow_with_stricter_quota","reasons":[],"account":status}return{"decision":"allow","reasons":[],"account":status}注意:规则层只能挡住「显式抽取」;Anthropic 强调对手会换话术、换语言、换标签。工程上要把命中样本回流到下一版分类器或规则包,并接受「偶发误拦 + 计费策略」的产品代价,而不是无限追求零误报。
7. 闸门五:评测离线夹具——任务重建,而不是「希望模型别点到真站」
Anthropic 的修复路径包括:停跑部分公开评测、迁到离线版、重建任务使不再触达真实站点。自建评测最容易踩的坑是:题目文本里写了真 URL,或环境变量把BASE_URL指到生产。
# eval_offline_fixture.py —— 示例:离线评测夹具fromdataclassesimportdataclassfrompathlibimportPathimportjson@dataclassclassFixtureManifest:eval_id:strroot:Path allowed_hosts:set[str]pages:dict[str,Path]# logical_url -> local html/jsondefload_manifest(path:Path)->FixtureManifest:data=json.loads(path.read_text(encoding="utf-8"))root=path.parent pages={k:root/vfork,vindata["pages"].items()}returnFixtureManifest(eval_id=data["eval_id"],root=root,allowed_hosts=set(data.get("allowed_hosts",["fixtures.local"])),pages=pages,)defresolve(manifest:FixtureManifest,url:str)->bytes:# 只允许 logical URL 或 fixtures.local;禁止回源ifurl.startswith("http://")orurl.startswith("https://"):# 示例:强制要求改写为 fixture:// 或相对 keyraisePermissionError(f"live url forbidden in offline eval:{url}")key=url.removeprefix("fixture://")ifkeynotinmanifest.pages:raiseFileNotFoundError(key)returnmanifest.pages[key].read_bytes()# fixtures/manifest.json 示例结构:# {# "eval_id": "form-submit-sandbox",# "allowed_hosts": ["fixtures.local"],# "pages": {# "gov-form-practice": "pages/gov_form.html",# "tip-form-dummy": "pages/tip_form.html"# }# }上线清单(示例):
- 评测仓库禁止提交真实
.gov/ 生产域名常量(CI grep); - 表单类任务必须有「提交终点 = 本地记录器」,禁止落到外部 webhook;
- 需要对比公开 benchmark 时,单独标签
needs_live_net,默认不进主夜跑。
8. 闸门六:生产出站审计——策略、配额、可回放
评测切断出网不等于生产不能出网。生产侧要的是:策略可配、配额可见、轨迹可回放。Anthropic 在内部侧提到中央管控基础设施、最小化互联网访问、安全分类器与层次化摘要等;自建可先落「出站决策日志 + 租户策略」。
# production_egress_audit.py —— 示例:生产出站审计fromdataclassesimportdataclass,asdictfromdatetimeimportdatetime,timezoneimportjsonfrompathlibimportPath@dataclassclassEgressEvent:ts:strtenant_id:stragent_id:strtool_name:strhost:strdecision:strreason:strbytes_out:intrequest_id:strclassEgressAuditLog:def__init__(self,path:Path):self.path=path self.path.parent.mkdir(parents=True,exist_ok=True)defwrite(self,ev:EgressEvent)->None:withself.path.open("a",encoding="utf-8")asf:f.write(json.dumps(asdict(ev),ensure_ascii=False)+"\n")defdecide_prod_egress(tenant_policy:dict,host:str,tool_name:str,daily_count:int,)->tuple[str,str]:allow=set(tenant_policy.get("allow_hosts",[]))deny=set(tenant_policy.get("deny_hosts",[]))quota=int(tenant_policy.get("daily_egress_quota",200))# 示例ifhostindeny:return"deny","deny_list"ifallowandhostnotinallow:return"deny","not_in_allowlist"ifdaily_count>=quota:return"deny","quota_exceeded"iftool_nameintenant_policy.get("high_risk_tools",["http_post_form"]):return"require_confirm","high_risk_tool"return"allow","ok"defrecord(log:EgressAuditLog,**kwargs)->None:log.write(EgressEvent(ts=datetime.now(timezone.utc).isoformat(),**kwargs,))生产侧再补两条(示例):
- 高风险工具(提交表单、写外部工单、付款)默认
require_confirm; - 审计日志与推理 ACL 分离存储:审计员能看「去了哪」,不一定能看完整 thinking。
9. 把六道闸门串成一次请求生命周期
一次 Agent / 评测请求建议按固定顺序过闸(示例顺序,可按团队调整):
- 身份与租户:账号是否欺诈风险标记、组织边界;
- 蒸馏信号:提示词 / 行为指纹;命中则 block(可选计费);
- 工具白名单:工具名 + 参数形状;
- 出站策略:评测
offline/ 生产allowlist; - 推理 ACL:响应中的 thinking 按组织落库,默认不回灌可编辑上下文;
- 审计落盘:决策、主机、工具、request_id 可回放。
Anthropic 公开数字里,对工程沟通最有用的锚点是:
- 摘要推理显著降低蒸馏价值(SWE-bench Verified:80.4% → 71.8%);
- 新防御落地后,平台侧估计蒸馏者可提取推理 token 量降约 10–100 倍(或90%–99%);
- 分类器误报<0.1%,并接受对误拦请求计费;
- 评测外联案例「真实世界影响有限」,但仍足以推动全内部评测断网——说明边界策略应偏保守。
不要把这些数字写成你自己系统的 KPI;你的 KPI 应是:误拦率、漏拦率、评测出站违规次数、跨租户推理读取次数。
10. 上线清单(可直接贴进 PR 模板)
- 评测默认
EgressPolicy.mode = "offline";含 live net 的任务单独标签 - 短链域名与政府/生产后缀在评测策略中默认 deny(按你的合规调整)
- 工具注册表区分
allowed_in_eval;禁止评测态http_post_form打真站 - 离线夹具 manifest 入库;CI 禁止评测代码出现裸
https://真域(或仅白名单镜像) - reasoning / thinking 对象带
org_id;跨组织读默认拒绝;调试 UI 默认摘要 - 禁止客户端编辑「既有 reasoning 上下文」回传(对齐 preserved thinking 精神)
- 蒸馏信号规则包可版本化;命中样本可回流;账号侧 soft-limit / ban 候选
- 生产出站:租户 allow/deny、日配额、高风险工具确认、JSONL 审计可回放
- 文档写清:闸门误拦时的申诉与放行流程(避免运营靠关闸门「临时打通」)
11. 参考资料
- Anthropic,Strengthening our defenses against distillation attacks,2026-10-12,https://www.anthropic.com/research/distillation-defenses
- Anthropic,Investigating unintended model actions in our evaluations and internal use,2026-10-09,https://www.anthropic.com/research/investigating-unintended-model-actions
- 媒体综述(评测断网与政府站点相关报道):Yahoo / The Verge / The Hacker News 等对上述报告的报道(约 2026-10-10 起)
说明:文中六道闸门划分、字段名、阈值、域名列表示例与 Python 骨架均为作者工程归纳,不代表 Anthropic 内部实现;公开数字仅转述上述一手博文,未外推为其它模型或平台的保证值。