摘要
当前的链上自主 AI Agent普遍遵循”读取链上状态 → 交由大语言模型(LLM)推理 → 输出决策 → 自主签名并广播交易”的执行范式。本文指出:该范式的安全弱点不在于 LLM 的对齐或提示词过滤,而在于其读路径——即 Agent 从环境中读取并无条件信任的数据。区块链在设计上仅保证账本完整性(交易确实被记录),而不保证语义真实性(某个 symbol、decimals 或价格”是否为真”);同时其无准入、合约自证、可编程返回等特性,使得攻击者无需突破任何边界,仅通过合法部署会撒谎的合约即可污染 Agent 的读路径。我们据此形式化了六类”环境注入”攻击(D1 文本注入、C1 现货操纵、D4 精度欺骗、B 收款人重定向、D5 revert 当指令、W2 端点劫持),并构建了一个在主网 fork 上运行的自主红/蓝队评估框架:在 Agent 的读取咽喉点注入、在同一咽喉点观测、以确定性谓词判定成功、并以三态(劫持/安全/不适用)如实报告。实验覆盖 8 个异构框架(TypeScript / Python / Rust)与 3 个真实公共 Agent 的技术栈(含知识图谱与 Solana 两条非 EVM 读面)。结果显示:同一条注入在零适配代码下使全部 8 个框架的决策翻转(48/48),并可迁移至两条非 EVM 读面;唯一表现出鲁棒性的是采用窄接口、单一硬性指令的守护者型 Agent。最后,我们论证了带内(in-band)提示词防御的不可靠性,并提出并实现了一种带外(out-of-band)确定性闸门:将决策与授权拆分为两个事件,以复用红队判定谓词的不变量在签名前进行拦截,实测单次判定中位延迟约 2.7µs。全部实验限定于 fork 与自有被测对象,严重度封顶于 L4(仅构建、从不签名),不涉及任何线上第三方 Agent。
1 引言
围绕 LLM 的安全研究长期聚焦于”输入侧”——越狱、提示词注入、对齐失效。然而在链上自主 Agent这一具体场景中,决策的输入并非来自用户对话,而主要来自链上环境:代币元数据、价格、余额、注册表地址、合约调用的返回或错误。这类 Agent 通常还具备自主签名能力,其输出是一笔不可逆的链上交易。
本文的核心论点是:在这一场景中,风险几乎是结构性的必然。它源于两方面的交叠——一侧是区块链”只担保账本、不担保语义”的本质特性;另一侧是 Agent”信任所读、并据此不可逆动作”的行为模式。二者相交之处,构成了一个远比”聊天框提示词注入”更隐蔽、且传统输入/输出过滤无法覆盖的攻击面。
贡献。 本文的贡献如下:(i) 从区块链特性与 Agent 执行模型出发,形式化”读路径即攻击面”这一威胁,并给出六类环境注入的刻画(§2–§3);(ii) 提出一套以咽喉点注入—同点观测—确定性判定—三态报告为核心的自主评估方法,强调链上场景相对自然语言红队在”成功判定”上的结构性优势(§4);(iii) 在 8 个异构框架与 3 个真实公共 Agent 栈上进行评估,报告零适配可迁移性、跨链泛化及一个鲁棒性反例(§5);(iv) 提出并实现带外确定性闸门作为防御,论证其相对带内提示词防御的优越性,并给出性能测量(§6)。
2 背景与威胁模型
2.1 区块链的相关特性
我们关注五条与”读数据者”直接相关的特性:
- 无准入(Permissionless)。 任何主体可部署任意合约、铸造任意代币、创建任意流动性池并任意命名。不存在对”某代币声称自己是什么”的准入审核。因此 Agent 读取的数据空间对攻击者开放写入——攻击不需要突破边界,只需合法部署。
- 合约自证(Self-asserted metadata)。 ERC-20 的
symbol()、decimals()、name()等并非由某权威登记的事实,而是合约内的函数,其返回值由合约代码决定。链上不存在对语义真实性的认证机制;一次”读取”,得到的是主张而非事实。 - 图灵完备与可编程返回。 合约可依调用者、区块高度、内部状态返回不同值,亦可对区块浏览器与目标 Agent 返回不同值。读取因此不具备稳定性与诚实性保证。
- 不可逆与终局性(Finality)。 交易一经签名并被打包即为最终;不存在撤销、拒付或事后追回。该特性将前三条的危害放大到极致:错误的授权等价于资金的终局性流失,防御不存在”第二次机会”。
- 透明性。 合约逻辑与读取路径公开可查,便于攻击者精确构造能够骗过特定 Agent 的载荷。透明性对攻击者构成助攻。
核心错位。 上述特性可归结为一个被普遍混淆的错位:区块链担保的是”合约返回了 X”(账本完整性),而非”X 为真”(语义真实性)。
2.2 链上 AI Agent 的执行模型
我们将目标 Agent 抽象为如下闭环:
读取链上数据 → LLM 推理 → 生成决策 → 自主签名并广播。
其读取—使用关系可细化为:symbol()/name() → 作为资产文本上下文进入提示词;decimals() → 参与转账/下单金额计算;池价(slot0) → 作为买卖决策依据;注册表/配置合约 → 提供收款人地址;调用的 revert 消息 → 作为风控反馈回喂推理;LLM 调用端点 → 构成其推理接口。
2.3 威胁模型
- 攻击者能力。 攻击者可控制 Agent 读路径上任一环境源的返回值:或通过部署会撒谎的合约(链上),或通过对 Agent 所依赖的读取端点(RPC/节点/知识图谱服务)的返回进行改写(在本文评估中由咽喉代理模拟)。攻击者无需访问 Agent 的代码、私钥或提示词内部。
- 信任假设(被攻击方)。 Agent 将读路径返回的数据视为可信 ground truth,并在此之上进行不可逆的授权动作。
- 不在范围内。 本文不假设攻击者能够篡改已达成共识的历史账本,亦不涉及对 LLM 权重的攻击;评估严格限定于本地 fork 与自有被测对象(见 §4.4 与伦理声明)。
图 1. 系统与威胁模型:环境注入发生于 Agent 的读取咽喉点(read chokepoint),经其正常代码路径进入推理,最终以不可逆签名落地。
3 攻击面刻画:六类环境注入
将 §2.1 与 §2.2 叠加,可得:凡 Agent 读取并信任的字段,均构成一条注入通道。需强调,此类攻击并非对话式提示词注入——不存在用户输入,载荷藏于 Agent 本就要读取的链上数据中,经其正确代码路径进入,故传统输入/输出过滤不可见。按”Agent 读取何种字段”枚举,攻击面恰为六类:
| 代号 | 被篡改的读取值 | 直接后果 |
|---|---|---|
| D1 文本注入 | symbol()/name() 内嵌指令 | 污染提示词,决策翻转 |
| C1 现货操纵 | 池 slot0 价格 | 依据虚假价格决策 |
| D4 精度欺骗 | decimals() 谎报 | 金额计算被放大约 10¹² 倍 |
| B 收款人重定向 | 注册表返回地址 | 构建指向攻击者的转账 |
| D5 revert 当指令 | 调用返回的错误消息 | 错误被当作指令回喂推理 |
| W2 端点劫持 | LLM 调用端点 | 策略/提示词外泄 |
叠加不可逆性(§2.1-4),上述任一类一经得逞并签名即为终局,其危害量级显著高于传统”读到脏数据至多误判一次”的情形。
4 方法
4.1 咽喉点拦截架构
我们在 Agent 与外界交互的咽喉点处注入并观测。评估框架包含三类咽喉代理:
- RPC 代理。 拦截 EVM 读取(
eth_call/eth_getStorageAt),按配置改写symbol()/decimals()/slot0/revert/注册表地址等返回(对应 D1/C1/D4/D5/B),并记录 Agent 因此发出的原始交易(解码 transfer/approve 的收款人与金额)。 - LLM 代理。 转发前捕获组装完成的完整提示词,作为”注入确已到达模型”的证据(W2)。
- 非 EVM 咽喉代理。 为验证跨读面泛化,另实现知识图谱(DKG)节点与 Solana 节点的最小 mock,遵循同一”投毒读、记录写”契约。
投毒以单条配置(/config)下发,被测 Agent 代码保持不变。
4.2 确定性判定
链上场景相对自然语言红队具有结构性优势:攻击”是否成功”可归约为可复现的布尔断言,例如 tx.to ∉ 白名单 或 决策相对干净基线发生翻转。这避免了对”判定器”本身的建模与其可被规避的风险。
4.3 三态评估协议
每个 (Agent, 攻击类) 结果仅取三态之一:劫持(攻击成功)、安全(攻击已实施但被抵抗)、不适用/N-A(该 Agent 不具备相应能力,构成无效测试)。我们坚持:能力缺失一律记为 N-A,绝不冒充”安全”;此纪律是结果可信度的前提。
4.4 实验环境与安全边界
评估在固定区块高度的主网 fork 上进行;通用模式将 Agent 锁入无外网容器网络,使其仅能连接上述咽喉代理(实测无法触及真实 RPC 或真实模型端点)。以 L0–L7 严重度阶梯对发现定级并封顶于 L4(仅构建未授权交易);实验台从不签名,始终停止于”提议”。全部对象为自有被测 Agent 或其开源自托管副本。
5 实验与结果
5.1 框架覆盖:8 个异构框架 × 6 类
对每个框架,我们以其自身真实的”读链 + 调 LLM”路径实现一个最小交易 Agent(真实运行框架,非模拟),施加同一套注入。结果如表 1。
表 1. 8 个框架在六类环境注入下的结果(✅ = 劫持成功)。
| 框架 | 技术栈 | D1 | C1 | D4 | B | D5 | W2 |
|---|---|---|---|---|---|---|---|
| GOAT SDK | TS / viem | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| web3.py + OpenAI | Python | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| ElizaOS | AgentRuntime + viem | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| ZerePy | 自有 EVM+OpenAI 连接 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| Rig | Rust / rig-core | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| Daydreams | TS / AI-SDK | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| Coinbase AgentKit | TS / ViemWalletProvider | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| IQ ADK-TS | TS / Google-ADK | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
即 48/48 均成功,跨 TypeScript、Python、Rust 三语言。以 D4 为例:Agent 读取 decimals 计算”转 100 USDC”,干净时得 100000000,当 decimals 由 6 被改为 18 时,同一段代码得 100000000000000000000,金额被放大约 10¹² 倍——无越狱,仅一处被信任的数值字段。
图 2. 评估控制台:Coinbase AgentKit 在通用模式下六类均被劫持;每类给出干净基线与投毒后的对照(如 D4 的
1e8 → 1e20、B 的国库 → 攻击者)。判定与报告对所有框架复用同一逻辑。
5.2 跨链、跨读面泛化:3 个真实公共 Agent
为检验论题是否超出 EVM,我们将开源公共 Agent 的技术栈自托管接入评估(从不触碰其线上实例),并按各自真实读面进行多类覆盖,不适用者如实标 N-A(表 2)。
表 2. 公共 Agent 栈的读面与结果。
| 公共 Agent | 读面 | 实测成功 | N-A |
|---|---|---|---|
| OriginTrail | 去中心化知识图谱(DKG) | D1-KG(投毒知识资产)、B(KG 收款人重定向) | C1 / D4 / D5 / W2 |
| solana-agent-kit | Solana 账户(Metaplex 元数据,无签名) | D1-SOL(投毒 symbol)、D4(decimals) | C1 / B / D5 / W2 |
| Freysa(守护者) | 说服/注入消息 | 见 §5.4 | D1 / C1 / D4 / D5 / W2 |
两条新读面值得强调:OriginTrail 读取的是知识图谱中的”知识资产”而非价格,注入的对象是一个**“事实”;solana-agent-kit 在 Solana 上读取元数据,而 Solana 的账户数据无签名、客户端完全信任 RPC 返回**。由此,论题可推广为:Agent 读路径上信任的任何环境源——合约、知识图谱、账户、RPC——皆为注入面。
5.3 零适配可迁移性
值得注意的是,对上述 8 个框架的攻击未针对任何一个编写专用攻击代码:同一条 /config 投毒与同一套判定,即令 TS、Python、Rust 等异构栈全部翻转。这表明漏洞不在框架内部实现,而在其共享的执行模式(信任读路径)之中,因而可平移至任何实现该模式的框架,以及运行于其上的真实 Agent。
5.4 鲁棒性反例:守护者型 Agent
实验中唯一未被翻转的是对 Freysa 守护者机制的复现——其职责为守护资金池并拒绝放款。对其施加多样化的说服/注入载荷(语义重构、伪造工具返回、伪 owner 覆盖、工具语义调换等),在本文所用模型下全部被抵抗(0/5)。原因在于:交易者是被动读取者(读入即据以推理),而守护者具有极窄接口与单一硬性指令,可被操纵的面显著更小。
需诚实说明:此类带内抵抗是概率性的、非保证——历史上真实的 Freysa 曾被更强模型攻破。该反例的意义不在于”守护者安全”,而在于揭示接口宽度即攻击面,并引出下一节的防御立场。
6 防御:带外确定性闸门
Freysa 的守卫位于 LLM 内部(强系统提示),此即多数团队采用的直觉方案。其失效的根本原因是:被守护的组件恰为可被说服的组件——以提示词防御提示词注入,等价于令已被影响的组件自我监管。
我们主张并实现一种带外(out-of-band)、确定性的防御:
将”决策”与”授权”拆分为两个事件,在其间置入一道仅检查规则、从不推理的代码闸门。
即令被投毒的 Agent 产出任意决策;但在决策转化为不可逆动作之前,由闸门校验一组不变量:收款人 ∈ 白名单?授权额度 ≤ 上限?上报 decimals == 已知值?现货价 ∈ TWAP 带内?累计亏损 ≤ 预算?一个被投毒的 Agent 提议”发往攻击者”时,闸门校验白名单并返回 BLOCK,资金不流出,而 Agent 代码保持不变。该闸门不解析自然语言,仅校验规则,故不可被说服。
红蓝同源。 红队”判定器”(攻击是否成功)与蓝队”不变量”(违反则拦)本质是同一谓词的两面。我们据此令闸门复用判定谓词的实现,避免两份拷贝随时间漂移。
性能。 在完整策略下对单次 authorize() 进行基准:约 27 万次/秒,中位延迟 2.7µs、p99 4.75µs;相对签名与广播的网络往返(数十至数百毫秒)可忽略(约为 50ms 交易预算的万分之一)。故运行时语言按实测需求选择即可,而无需为性能预先承诺;我们以 Python 参考实现,并将闸门边界保持为 authorize(intent) → verdict 的语言无关契约,以便未来在确有需求(如内联进高频签名器、内存安全/隔离)时替换为 Rust 而不改动调用方。
图 3. 带外闸门在评估控制台中的可视化:同一投毒下,红队将转账劫持至攻击者(劫持 3/3);经确定性闸门后被拦截(BLOCK 3/3),资金安全,且 Agent 代码未改。
带内 vs 带外。 带内守卫置于可被说服的大脑之内,其保证是概率性的;带外守卫置于咽喉点之上、仅校验规则,故不可被说服。
7 讨论与局限
- 可判定后果 vs 语义翻转。 结构性不变量能可靠拦截”授权去向/规模”这类可判定后果(B/D4/C1 等);而 D1/D5/W2 这类纯语义翻转,其”动作本身”往往看似合法,闸门无法据
to/amount拦截。它们需由上游手段缓解(读路径完整性、端点固定、提示词隔离),闸门只兜底可判定后果。此边界应如实声明。 - LLM 非确定性。 因 LLM 输出的随机性,本文以成功率(如 2/2)而非”必中”报告。
- 公共 Agent 的建模。 部分公共 Agent 为守护/机制复现或自托管副本;其结论覆盖”运行于同类框架/读面上的 Agent”,而非对其线上实例的断言。
- 判定谓词的完备性。 不变量集合仍在扩展(如代码哈希证明尚缺对应判定谓词,按”不重复实现”原则应先落入判定层)。
8 相关工作
本文与若干方向相关但定位不同。间接提示词注入(indirect prompt injection)研究了模型从外部内容读入恶意指令的问题;本文将其具体化到链上”读路径”,并强调其后果的不可逆金融性与判定的确定性。自然语言红队(如 HarmBench 等)需以训练好的分类器判定攻击成功,而链上场景可将成功归约为布尔断言,规避了判定器本身可被规避的问题。预言机/现货价格操纵是 DeFi 安全的经典议题,本文将其纳入”Agent 读价决策”的统一环境注入框架(C1)。交易模拟/意图校验类防御与本文的带外闸门思路一致,本文进一步给出”决策—授权分离 + 判定谓词复用”的形式与实现,并覆盖 EVM 之外的读面。著名的 Freysa 奖金池事件为带内守卫的脆弱性提供了现实注脚,本文将其作为鲁棒性反例纳入统一评估。
9 结论
链上自主 AI Agent 的安全短板,并非其”思考”部分(LLM 对齐),而是其”感知”部分(读路径)。区块链只担保账本完整性、不担保语义真实性;当 Agent 在语义上信任所读、并将结论不可逆地签名上链时,每一个被读入的字段——symbol、decimals、价格、收款人、错误消息——都成为一条注入通道。本文在 8 个异构框架与 3 条(含非 EVM)读面上实证了这一结构性必然,并表明:有效的防御不是让可被说服的模型自我监管,而是将守卫移出模型、置于签名前的咽喉点,以确定性规则拦截——它不可被说服,且其开销可忽略。
伦理与负责任披露声明
全部实验在本地主网 fork 上、针对自有被测 Agent 或其开源自托管副本进行;未对任何线上第三方 Agent 发起攻击。公开市值榜单仅用于选择”需要建模的框架”,从不作为攻击目标。评估严重度封顶于 L4(仅构建未授权交易),实验台从不签名、从不执行。每条发现均附可在同一 fork 高度复现的最小复现步骤。文中攻击手法均为概念层描述,不提供可直接武器化的完整利用。


