KelpDAO 2.92 亿美元跨链桥被盗事件完整复盘

凌晨四点北京时间 2026 年 4 月 18 日,KelpDAO 在 Arbitrum 上部署的 rsETH OFT(Omnichain Fungible Token)合约出现了一笔异常铸造。攻击者没有发送任何来自以太坊主网的合法 LayerZero message,却让 Arbitrum 侧的合约凭空 mint 出了 116,500 枚 rsETH,按当时 2,505 美元的 ETH 价格折合 约 2.92 亿美元。这是 2026 年至今规模最大的跨链桥事件,也是流动性再质押(LRT)赛道第一次正面承受这种量级的打击。
时间线复盘:90 分钟内发生了什么
我把 Tenderly 和 Arbiscan 上的交易回放整理成了下面这张时间表。所有时间为 UTC,方便你和其他公开 post-mortem 对照。
| 时间(UTC) | 事件 | 影响 |
|---|---|---|
| 04:12 | 攻击合约部署到 Arbitrum,gas 由 Tornado Cash 出金支付 | 准备阶段 |
| 04:18 | 第一笔 lzReceive 调用成功,mint 12,500 rsETH |
漏洞验证 |
| 04:21 | 连续 8 笔批量 mint,合计 104,000 rsETH | 主要攻击 |
| 04:29 | 攻击者通过 Camelot V3 把约 4 万枚 rsETH 换成 wstETH | 第一波套现 |
| 04:47 | KelpDAO multisig 暂停 OFT 合约 mint 函数 | 止血 |
| 05:34 | rsETH 在 Curve rsETH-WETH 池脱锚至 0.71 | 二级市场冲击 |
整个攻击核心窗口只有 29 分钟,但市场震荡持续了三天。Curve 上的 rsETH-WETH 池在被冲击后引发了一连串的连锁清算,这部分我会放到第三节展开。
漏洞本质:LayerZero 的可信端点假设被绕过
很多人第一反应是「LayerZero 又被攻破了」,这其实不准确。LayerZero v2 协议本身并没有出问题,问题出在 KelpDAO 自己在 OFT 合约里对 _lzReceive 入参做的可信判断。
简化一下,KelpDAO 的 Arbitrum 端 OFT 合约接收消息后的处理逻辑大致是这样:
function _lzReceive(
Origin calldata _origin,
bytes32 _guid,
bytes calldata _message,
address _executor,
bytes calldata _extraData
) internal override {
if (_origin.srcEid == ETHEREUM_EID) {
(address to, uint256 amount) = abi.decode(_message, (address, uint256));
_mint(to, amount);
}
}
看出问题了吗?这段代码只校验了源链的 eid(endpoint id),没有校验消息发送者地址 _origin.sender。LayerZero v2 的安全模型从来都要求开发者在应用层自己 enforce peer 校验——也就是说,「来自以太坊主网某个特定地址」这件事必须显式断言。KelpDAO 的代码相当于在门口装了把锁,但没检查钥匙上的指纹,谁带着一把形状对的钥匙都能进。
攻击者做的事情非常直白:在以太坊主网上随便部一个合约,通过 LayerZero endpoint 朝 Arbitrum 发送一条经过 ABI 编码的 message,内容是「给我地址 mint 12,500 rsETH」。endpoint 不会替你检查应用层语义,它只负责忠实地把消息送达。Arbitrum 侧的 KelpDAO 合约收到后,看到 srcEid 是 30101(以太坊),就照单全收。
这类端点信任错配的漏洞在 LayerZero 整合方里出现过不止一次。我之前在 跨链桥被盗事件简史 里整理过类似案例,可以对比着看。

资金路径:为什么追回的比例可能不到 15%
事件后第 48 小时,链上分析师跟踪到攻击者的资金大致按下面的路径分散。我把它整理成列表方便阅读:
- 第一阶段(Arbitrum 内部):11.65 万枚 rsETH → 通过 Camelot V3、Uniswap V3 兑换为 wstETH、WETH、USDC,合计回收约 1.78 亿美元 等值资产
- 第二阶段(跨链):其中约 8,200 万美元通过 Across 与 Stargate 桥到主网,剩余 9,600 万美元留在 Arbitrum
- 第三阶段(混淆):主网部分中 3,400 万美元进入 Tornado Cash,4,800 万美元通过 Railgun,其余分散到 10+ 个新建钱包
- 冷处理:Arbitrum 上剩余的 9,600 万美元被分割到 27 个地址,链上停滞超过两周
KelpDAO 团队联合 Chainalysis、TRM Labs 在事件第三天向 OFAC 申请冻结了部分 CEX 入金地址。截至 5 月底,公开可追溯的 冻结金额约为 4,100 万美元,占被盗总额的 14%。剩下 86% 要么仍在攻击者控制的钱包里,要么已经通过隐私桥彻底洗清。
协议响应:补偿、重启与社区治理
KelpDAO 团队的响应速度算是相对快的。事件后 36 小时,他们发布了第一份官方 post-mortem 并提出了三选一的补偿方案,由 KIP-12 治理提案投票决定:
- 方案 A:用国库 60% 储备金 + 未来 12 个月协议收入,1:1 回购被盗 rsETH 持有人地址中的份额
- 方案 B:发行新代币
rsETH-R(R for Recovery),按 1:1 替换被烧毁的 rsETH,新代币享有未来追回资金的全部分配权 - 方案 C:混合方案,前 50% 立即 1:1 补偿,后 50% 转换为 rsETH-R
最终投票结果是 方案 C 以 67.4% 通过。这个结果挺务实——既给了急需流动性的散户出口,也保留了对长期持有者的追讨权。值得注意的是,Curve rsETH-WETH 池的 LP 不在补偿范围内,因为他们持有的是 LP token 而非直接的 rsETH。这一点引发了不小的社区争议,我个人觉得这个边界划得过于机械。
如果你想理解 LRT 协议在出事后的国库管理思路,可以参考 restaking 真实风险案例 和 EigenLayer AVS 现状 两篇,把这次事件放在整个赛道里看才有坐标。
对 LRT 赛道的传导:三个二阶效应
这次事件最让我警觉的不是 2.92 亿这个绝对数字,而是它揭示出的结构性脆弱。LRT 这条赛道目前依赖三个互相强化的假设,这次事件至少动摇了其中两个。
第一,「LRT token 跨链 = 普通 ERC20 跨链」的认知偏差。一个普通的 USDC OFT 出事,顶多就是这条链上 USDC 脱锚;但 LRT token 背后有数十亿质押的 ETH 作为底层资产,而且与 Aave、Morpho、Pendle 等借贷协议深度耦合。rsETH 脱锚直接触发了 Aave 上约 6,800 万美元的清算,后续也影响到了 Aave 的 rsETH 坏账事件,这是后话。
第二,审计的覆盖盲区。KelpDAO 的 OFT 合约在 2025 年通过了三家审计机构的复审,但三份报告里都没有标注 peer 校验缺失这个问题。原因很简单:OFT 模版代码本身是包含 peer 校验的,KelpDAO 是在自定义实现时把它「精简」掉了,而审计员没有把这部分作为重点检查项。审计的边界永远是合约文本,合约设计意图里的安全假设,得靠开发团队自己守。
第三,LayerZero v2 的 DVN(Decentralized Verifier Network)经济模型没有起到该有的作用。理论上 DVN 多个验证节点之间应当能识别异常 message pattern,但 KelpDAO 当时只配置了 LayerZero Labs 自己的默认 DVN 一家,等于把所有验证压力集中在单点。这个事件之后,所有主流 LRT 协议都在重新审视自己的 DVN 配置,这是这次教训里少数有正面价值的部分。
给普通用户的三个具体建议
写到这里如果你只是个 LRT 持有人,我把可以马上做的事情列出来:
- 检查你持有的每个 LRT 的 OFT 配置:LayerZero Scan 上可以查到每个 OFT 合约的 DVN 配置和 peer 校验状态。少于 2 个 DVN 的项目我会直接归类为高风险。
- 不要长期持有跨链版本的 LRT:rsETH、ezETH、weETH 这类资产,主网原版和 L2 跨链版的风险曲线是不一样的。如果你只是想拿收益,就把它放在主网。
- 关注 LRT 在借贷市场的清算线:这次 Aave 上的清算很多是因为 rsETH 价格走偏触发的,如果你用 LRT 做抵押借出,把 LTV 控制在 50% 以下,你才有缓冲应对脱锚。
跨链桥的安全模型本质上是「最弱环节假设」——一个 OFT 合约里漏掉一行 require,就能让整条链上的总锁仓灰飞烟灭。这次 KelpDAO 给我们的,是一次代价昂贵但教学价值充足的实例。