攻防实验室 #3:我们的「身份归因」是演戏——任何人都能用你的 Agent 花你的钱
KYA 闸只查「这个 agent 有没有被归因」,从没查过「你是不是它」。真实结果:攻击者零凭证冒用受害者 agentId 付款,200 放行;还能篡改归因实体污染审计链。我们补上第七道闸 KYA/Proof。没有证明的归因,是演戏。
攻防实验室 · 第 3 期。上期我们说要去打"归因"层。结果:地基是空的。
第 1 期我们六发攻击全挡下,第 2 期我们发现自己没实现"单日累计"、补上了第六道闸。这一期,我们去打整个框架的支柱 1:身份与归因(KYA)。
它没撑住。而且塌得比我们想的更彻底。
攻击:我用你的 agent 花你的钱
我们的 KYA 闸做了一件事:检查这个 agentId 有没有被归因到一个已 KYC 的实体。归因了,就放行。
问题是——它从没检查过:你是不是这个 agent。
真实运行结果(线上网关):
1) 受害者归因自己的 agent
→ 已归因:Victim Corp(已KYC)
2) 攻击者(完全不同的人)直接用受害者的 agentId 发起支付,零凭证
→ 200 allow
→ KYA 闸原话:"已归因:Victim Corp"
3) 攻击者篡改受害者的归因实体
→ 该 agent 现在归因到:"我是攻击者冒充的"
第 2 步是致命的:我什么都不需要知道,只要知道你的 agentId,就能用你的授权额度花钱。 而 KYA 闸会一边放行、一边向你保证"这笔支付已归因到 Victim Corp"。
第 3 步更糟:攻击者能把归因指向任何人。审计链从根上被污染了——事后追责时,日志会指着一个无辜的实体。
病根:认证 ≠ 授权
我们把两件事搞混了:
- "这个身份存在吗?"(我们做了)
- "你是这个身份吗?"(我们没做)
只做第一件,等于在门口检查"这张身份证是真的吗",却不看举着它的人是不是本人。
没有证明的归因,是演戏。 而支柱 1 是整个 RAP 框架的地基——地基是演戏,上面五道闸再漂亮也是装饰。这句话不好写,但它是这次最重要的结论。
补:第七道闸 KYA/Proof
注册时签发一枚一次性凭证(agentSecret),之后每一次调用都要出示它:
- 付款不带凭证 / 凭证不符 → 拦于 KYA/Proof
- 想更新一个已归因的 agentId → 必须出示原凭证,否则拒绝(防篡改归因)
补完之后,同样的三发攻击:
| 攻击 | 修复前 | 修复后 | |---|---|---| | 冒用他人 agentId 付款(零凭证) | 🔴 200 allow | ✅ 403 拦于 KYA/Proof | | 篡改他人归因实体 | 🔴 成功 | ✅ 被拒绝 | | 本人带凭证付款 | 200 | ✅ 200(不误伤) |
第 4 行同样重要:修完之后,合法的人必须照样能过。 一道会误杀好支付的闸,最终会被人关掉。
三个教训
1. 最基础的那一层,最容易没人查。 我们花了很多力气打磨额度、白名单、意图比对——那些都是"看起来像安全"的东西。而地基上"你是谁"这个问题,我们默认它成立了。攻击者不会挑我们打磨过的地方下手。
2. 一句"已归因"可以是假的安慰。 更危险的不是没有 KYA,而是有一个会撒谎的 KYA——它让你以为查过了。没有防线的人会小心;以为有防线的人不会。
3. 我们连续三期都打穿了自己。 第 1 期挡住了六发,像个好消息;第 2 期漏了累计限额;第 3 期地基是空的。这才是攻防实验室存在的理由——如果我们不打自己,总有人会替我们打,而且不会告诉我们。
我们把每一次打穿都公开写出来,包括这次难看的。一个标准的可信度,不来自它宣称自己多完备,而来自它被自己人打穿时,是否敢把结果贴出来。
下一期
我们会去打审计链:被拦下的攻击,日志能不能被伪造或抹掉?
亲手打一次:oceanalt.com/firewall · 用你自己的 agent 测:集成指南
(OceanAlt 攻防实验室 · 研究笔记)
这篇内容的出处与状态
- 署名
- OceanAlt 编辑部
- 首次发布
- 2026-07-17
- 最后更新
- 2026-08-01
- 原始资料
- 未标注来源

