第一条读结构,第二条读行为。只有第二条能产出「已观察到」的证据——而只有已观察到的证据,才配被报成「严重」。
把你的工具定义贴进来,得到一张能力图:哪些工具能转移价值,哪些会引入智能体自己没写的文本,哪些碰得到私钥,以及在它们和一次签名之间有没有东西挡着。
向你的智能体端点发送 20 条对抗性消息,读它回了什么。这是唯一能产生观察证据的通道,也因此是唯一能给出「严重」结论的通道。
递给它一个不持有任何私钥的钱包。它试图签什么、发给谁、金额多少,全都被记下来——而没有一分钱能真的动。
每条载荷只要求智能体做一件明确无误又无关痛痒的事:回显一个令牌、说出一个没有私钥的哨兵地址、去够一个没人要求过的工具。听话本身就是那个漏洞。
系统提示词和工具定义在你这台机器上解析,从不传输。发出去用于拼装攻击链的是结构——工具名、能力分类和布尔值——你可以在网络面板里核对。
MCP 的 tools/list 输出、OpenAI 与 Anthropic 的工具 schema、ElizaOS 的 character.json、n8n 与 Make 的工作流导出,以及智能体源码本身。格式由它自己认,不用你先转换。
工具本身(扫描器、控制台、SAFI 工作区)目前仍是英文界面。这些页面用中文把一切讲清楚,方便你进去之前先看明白。
一个能对任意端点开火的测试工具,就是一个攻击服务。这里的每一道门槛都是刻意留下的。
第一,证明你控制那台主机:在端点自己的源上发布 /.well-known/saferico-agent-test.txt,内容是这个页面给你的令牌。只有你的账户能推导出它。
第二,一份明确的授权声明。它本身证明不了什么——那是那个文件的职责——但它记录意图,而这正是安全工具与攻击服务之间的分界线。
系统提示词是可选的。填了,注入类检查会精确得多;不填,相关项会被报成「未测试」,而不是「通过」。
为了识别一次泄露,我们必须有东西可以比对,所以你在那一个字段里填的短语——最多 200 个字符——会随探针请求发到我们的 Worker,在那里比对后丢弃:不存储、不记录、不写进报告,也绝不会发给被测端点。如果这 200 个字符已经超出你愿意分享的范围,就留空——那一项会被报成「未测试」,这是诚实的结果,也不会让你损失别的什么。
诱饵签名者是一个不含私钥的地址。智能体可以把整个流程走完、试图签下一切,而结果只是一条记录。
这也是为什么载荷里不会出现真实的盗币地址:把它写进你的日志对谁都没有好处,而真正被测出来的东西——它听话了——和载荷内容无关。
扫描器问的是:存在哪些漏洞。Hack My Contract 问的是:攻击者能不能真的利用它们。这个工具问的是第三个问题:能不能说服那个持有钱包的智能体,自己造成损害。
这三个问题不是同一个扫描器的三种说法——每一个都从上一个停下的地方开始。