不少人看到 DeFi 攻击新闻后会产生一个疑问:如果攻击者没有管理员密码、没有预言机私钥,也没有盗走任何用户的钱包,他只拿自己的普通钱包,通过 RPC 接口组织一笔交易,真的可能从协议里取走巨额资产吗?
答案是:有可能,但前提不是“伪造交易”,而是合约本身存在任何人都能触发的逻辑漏洞。
攻击者用自己的私钥签名时,这笔交易在密码学意义上完全真实。区块链也不会替协议判断这次调用是否符合开发者的业务意图;只要交易签名有效、Gas 足够,而且执行过程中通过了合约写下的所有检查,节点就会照常执行。
这种情况更准确的名字是“无特权利用(permissionless exploit)”:攻击者没有先拿到特殊身份,而是通过公开入口,把合法功能组合成了开发者没有预料到的状态变化。
本文只讨论公开事件中的原理、判断方法和防御,不提供可直接用于真实协议的攻击脚本。安全复现应限制在本地分叉、测试网或获得书面授权的环境中。
“普通钱包”到底普通在哪里
以太坊里的普通钱包通常是外部账户,也叫 EOA。它的私钥只能证明一件事:这笔交易由这个地址授权。它不能让攻击者冒充管理员,也不能凭空得到别人的代币授权。
实际攻击通常还会部署一个“攻击合约”。这并没有自动增加权限,它更像一个可以在同一笔交易里连续执行多步操作的脚本容器:借入临时资金、调用协议、交换资产、偿还借款,再把剩余资产转回攻击者的钱包。
攻击者自己的 EOA
↓ 签署真实交易并支付 Gas
攻击者部署的辅助合约(可选)
↓ 组合多个公开调用
目标协议的公开函数
↓ 错误更新价格、份额、余额或缓存状态
协议资产按错误结果转出
闪电贷也只解决“临时本金”问题,不授予管理员权限,更不是漏洞本身。如果协议的数学和状态转换正确,资金再多也不能越过检查;反过来,如果某个漏洞几乎不需要本金,攻击者甚至不必使用闪电贷。
所以“自己通过接口伪造交易”这句话应拆成两部分:
- 自己签名、自己填写 calldata、自己调用公开函数,叫“构造交易”,是链上正常能力;
- 冒充其他地址签名、任意修改
msg.sender或花费未经授权的资产,才接近“伪造”,正常情况下会被密码学或合约权限检查拒绝。
没有越权,为什么还能造成损失
智能合约常把“允许谁调用”和“调用后算得对不对”当作两层问题。
权限检查能够阻止普通用户调用管理员函数,却不能保证公开函数的业务逻辑永远正确。兑换、存款、提款、铸造和清算本来就必须向用户开放;只要其中一个计算在极端输入、特殊顺序或重复调用下破坏了核心不变量,攻击者就可能完全不碰管理员入口。
一个典型过程是:
- 找到协议允许任何人调用的存款、兑换或提款入口;
- 选择会触发舍入、溢出、零供应量或缓存残留的边界状态;
- 用辅助合约把多步操作放入一笔原子交易;
- 合约的每个
require都通过,但资产份额或价格已经算错; - 协议按照错误账本支付真实资产。
这类攻击最危险的地方,正是链上看到的交易可能“全部合规”:调用者是自己、入口是公开的、签名是真的、检查也没有报错。真正失守的是协议想维护但没有被代码完整表达的不变量,例如“用户赎回价值不能大于其应有份额”。
最近一年的四个公开案例
以下事件均发生在 2025 年 7 月 20 日至 2026 年 7 月 20 日这一年内。损失数字采用公开安全分析的估算口径,不等同于攻击者最终净收益:
- Bunni:2025 年 9 月,约 840 万美元,问题集中在提款路径的舍入方向与流动性记账;
- Balancer V2:2025 年 11 月,约 1.2864 亿美元,批量兑换放大了极小余额边界的精度误差;
- Yearn yETH:2025 年 11 月,约 900 万美元,供应量归零后虚拟余额缓存没有同步清空;
- Truebit:2026 年 1 月,约 2660 万美元,旧版 Solidity 数学计算发生整数回绕。
Bunni:舍入方向错一位,余额和份额逐渐脱钩
金融合约不能简单地认为“少几个 wei 无所谓”。一次运算只差极小单位,经过多轮存取、交换和流动性调整后,误差可能持续向同一方累积。
Halborn 的复盘指出,Bunni 提款函数对关键数值采用了错误的向下舍入假设。攻击者先把池中资产压到极低余额,再利用舍入让“池里还剩多少价值”和“应减少多少流动性”不成比例,最终提走约 840 万美元资产。
这里没有权限绕过。攻击者利用的是所有用户都能触发的提款路径,只是输入和执行顺序到达了普通用户很少触及的边界。
Balancer V2:批量兑换把微小精度损失放大成巨额缺口
Check Point 对 Balancer V2 事件的分析认为,问题集中在 Composable Stable Pools 的精度换算与批量兑换组合。当余额进入极小的 8—9 wei 边界时,整数除法带来的精度损失不再可以忽略;攻击者通过精心组织的批量兑换重复累积偏差,压低 BPT 的计算价格,再从池中换走价值更高的资产。
这说明单独看每一次舍入都“符合代码”,并不代表整条调用链安全。金融不变量需要跨函数、跨多步交易验证。
Yearn yETH:16 wei 唤醒了没有清零的旧缓存
Yearn yETH 案例尤其能说明攻击不一定需要巨额本金。公开分析称,攻击者先让 LP 总供应量回到零,但存储中的 packed_vbs 缓存值仍保留着此前积累的虚拟余额。随后攻击者向八种资产合计存入仅 16 wei,协议进入“首次铸造”分支,却错误读取旧缓存,铸造出异常巨量的 LP 份额。
问题不是 16 wei 具有神奇价值,而是协议把“供应量已经归零”和“内部会计状态已经重置”错误地当成了同一件事。
Truebit:旧版整数回绕让零成本铸币成为可能
CertiK 披露,Truebit 在 2026 年 1 月 8 日因整数溢出遭受约 2660 万美元损失。相关合约使用 Solidity 0.6.10,旧编译器不会像 0.8.x 那样默认检查算术溢出。攻击者选择特殊输入使联合曲线价格计算回绕成更小的数,随后在同一笔交易中以零 ETH 铸造 TRU 并兑换出约 8535 ETH;后续还有另一名参与者取走约 22.4 万美元。
这同样不是破解私钥。入口对市场参与者开放,真正的问题是协议仍在依赖没有安全算术保护的旧实现。
权限攻击和无特权逻辑攻击不要混在一起
两类事件的调查与防御方向完全不同:
- 权限攻击:攻击者先得到管理员私钥、预言机 signer、升级权限、后台接口或有效授权,随后改实现、改价格、增发或直接转走金库。主要防线是多签、硬件密钥、最小权限、延迟升级、密钥轮换和异常熔断。
- 无特权逻辑攻击:攻击者只需自己的钱包和 Gas,可能再加辅助合约或闪电贷,经公开入口破坏价格、份额、余额、舍入或状态机不变量。主要防线是属性测试、模糊测试、形式化验证、精度审计、状态生命周期检查和限损机制。
“交易来自普通钱包”不能证明它一定是无特权攻击,因为普通钱包也可能持有被盗的管理员权限;反过来,攻击者部署了复杂合约,也不代表他拥有任何特殊权限。判断依据应该是目标协议实际检查了什么,以及攻击成功是否依赖受信任凭据。
开发者应该重点守哪些位置
这四起事件共同提示,审计不能只搜索重入和权限修饰符。还应把注意力放在以下位置:
- 为资产守恒、份额价格、赎回上限等核心规则编写可执行不变量;
- 对存款、兑换、提款、归零后再初始化等完整生命周期做状态机测试;
- 明确每一步固定精度运算的舍入方向,并证明误差不会被循环放大;
- 对 0、1 wei、最大整数、极小余额、总供应量为零等边界做模糊测试;
- 使用 Solidity 0.8.x 的默认算术检查,必须使用
unchecked时单独证明其安全边界; - 缓存状态必须与主状态同步创建、消费和清理,不能只重置表面上的供应量;
- 在单笔、单区块和短时间窗口设置合理的资金流出上限与自动暂停;
- 上线前后都使用主网分叉回归真实代币精度、池状态和多协议组合行为。
访问控制当然重要,但 onlyOwner 保护不了本来就必须公开的兑换函数。真正稳健的协议还要保证:无论公开函数被谁、以什么顺序、在什么边界输入下调用,核心资产不变量都不能被打破。
阅读损失数字时再多问三句
安全报道常把不同口径都写成“损失”或“获利”。写研究文章时至少要区分:
- 协议毛损失:相关池或金库总共流出了多少资产;
- 攻击者净收益:扣除闪电贷归还、兑换滑点、Gas 和失败交易后实际控制多少;
- MEV 与后续截留:抢跑、复制交易或后续参与者拿走多少,是否后来冻结、追回或返还。
因此本文使用“约”并注明来源。除非协议最终复盘和链上资金追踪已经收敛,不应把某一家安全机构的早期估算写成精确结论。
最后总结
普通钱包不能伪造别人的签名,也不能凭空变成管理员;但它可以合法调用协议主动开放的函数。如果这些函数在舍入、整数边界、缓存清理或多步状态转换上存在缺陷,一笔签名真实、权限正常的交易,仍可能让协议按错误账本支付真实资产。
用一句话概括:
普通钱包 + 公开入口 + 被破坏的业务不变量
≠ 伪造交易
= 无特权智能合约漏洞利用
对普通用户而言,不要把所有链上攻击都理解成“私钥被偷”;对开发者而言,也不要把“没有越权”误当成“业务安全”。
公开资料
- CertiK:Truebit Incident Analysis
- Check Point:Balancer V2 舍入误差事件分析
- Check Point:Yearn yETH 16 wei 事件分析
- Halborn:Bunni Hack 事件分析
- DeFiHackLabs:公开事件复现索引
- Solidity 官方文档:Checked or Unchecked Arithmetic
本文资料核验于 2026 年 7 月 20 日。事件损失、追回进展和技术归因可能随着协议官方复盘继续更新。




