46分钟才停机:跨链伪造消息怎么把 2.92 亿美元搬走?(附 AI 复盘与告警模板)
4 月 18 日这波 DeFi 安全事故,观感很刺眼:
- 黑客伪造了一条跨链消息
- LayerZero 信了
- Kelp DAO 的桥也信了
- 116,500 枚 rsETH(约 2.92 亿美元)消失
- 46 分钟后协议才暂停
钱没了,暂停也晚了。
更离谱的是:同一天,Fenz AI 的审计报告里已经把完整攻击链写出来了。
这篇不聊情绪,聊怎么做事:把“攻击链复盘”做成“能提前报警的规则”。你照着抄就能用。🧯
1)这类事故的核心:跨链消息被当成“真相”
很多跨链/桥接系统都有一个隐含前提:
只要某条跨链消息(message)来自“可信通道”,就可以驱动铸币/解锁/记账。
一旦攻击者能伪造消息、重放消息、绕过验证,后面的合约逻辑再严谨也没用。
你可以把它理解成:
- 合约像门禁
- 跨链消息像“万能通行证”
- 验证模块一旦被绕开,门禁形同虚设
这也是为什么很多桥的事故不是“数学被破了”,而是“信任链断了”。
2)把新闻一句话拆成“可检查的攻击链”
原始信息很短,但足够拆出一条工程化的链路:
- 入口:伪造跨链消息
- 信任传递:消息通过 LayerZero 相关验证流程
- 落地执行:Kelp DAO 桥接/铸造模块执行了“发币/放币”
- 结果:rsETH 被异常增发或异常释放,并被迅速转走
- 响应:46 分钟后暂停
你要做的复盘,不是写作文,是回答 3 个问题:
- 消息为什么会被当成合法?(验证缺口在哪)
- 一旦合法,资金路径怎么走?(函数、事件、资产流)
- 有没有“能提前触发的异常信号”?(告警点)
3)用 AI 读审计报告:把“描述”变成“规则”
Fenz AI 这类审计报告的价值,不止是告诉你“哪里有洞”。更大的价值是:
- 里面有攻击前置条件
- 有可观测的链上行为
- 有建议的修复点
问题在于:报告很长,安全同学看得懂,业务同学直接眼神发直。
这时候大模型就很好用:让它做“信息压缩 + 规则化”。
3.1 你可以直接抄的提示词(读报告用)
把审计报告(或 thread、公告、GitHub issue)丢给模型,然后用这个提示词:
你是DeFi安全工程师。请从下列材料中提取“可执行信息”,输出必须包含:
1) 攻击链时间线(按步骤列出触发条件→关键调用→资产变化→资金去向)
2) 被利用的信任假设(用一句话说明“系统信了什么”)
3) 需要打点监控的链上信号(事件/函数/地址行为),每条信号给出阈值建议
4) 能在不改合约的情况下立刻做的临时止血措施
5) 修复建议:必须拆分成“验证层”“业务层”“运维响应”三类
输出要短句、要清单,不要写背景科普。
你会得到一份“更像工单”的输出,而不是读后感。
3.2 再追问一次:把监控点变成“告警规则草案”
很多模型会给你监控点,但不够落地。继续追问:
把上面的“链上监控信号”改写成告警规则草案:
- 规则名称
- 触发条件(可被工程实现)
- 严重级别(P0/P1/P2)
- 误报来源
- 建议处置动作(暂停/限额/人工复核/提高确认数等)
至少给10条。
这一步很关键。
你想要的是:凌晨 3 点出事时,机器人直接把“该干嘛”贴你脸上。
4)告警怎么布:给你一套“能救命”的最小方案
不聊花活,给一套小团队也能做的。
4.1 监控对象清单(你要盯住的 4 类东西)
- 跨链入口合约:接收 message / proof 的入口函数、事件
- 验证/执行分离点:验证通过的标志位、nonce、payload hash
- 铸造/解锁模块:mint、withdraw、redeem、release 等关键函数
- 资金归集路径:大额转出地址、CEX 充值地址、混币器已知地址
4.2 立刻能上的 8 条高性价比规则
把它们当成“最小可用告警包”:
- 跨链消息验证通过次数突增:单位时间内超过历史均值 N 倍
- 同一来源链/同一应用的 nonce 跳跃:出现大跨度或重复
- payload hash 重复出现:疑似重放
- mint/解锁金额异常:单笔超过日均值、或超过风控限额
- mint 后立刻多跳转出:同区块或 2 分钟内连环转账
- 新地址突然接收超大额资产:地址历史交互为 0 或极少
- 桥接合约余额快速下降:在短时间下降超过 X%
- 关键管理员动作:暂停失败、延迟执行、权限变更(这类要单独 P0)
阈值怎么定?别纠结完美。
- 先用 7 天数据跑出基线
- 再把阈值定在“宁可多叫醒一次,也别睡死”
你被吵醒一次,最多骂两句。
你睡死一次,项目可能直接进历史。
5)“46分钟才暂停”怎么破:把响应写成剧本
很多协议不是没暂停按钮,而是:
- 按钮在,但没值班
- 有值班,但不知道该不该按
- 想按,但权限/流程卡住
5.1 一份能直接贴进内部 Wiki 的响应剧本
- P0 触发条件:出现“跨链验证异常 + 大额铸造/解锁”任意组合
- P0 动作(允许保守):
- 暂停跨链入口(如果能分模块暂停)
- 降低限额/提高确认数
- 临时拉黑可疑源地址/消息源
- 锁定 mint/withdraw 通道(保留查询功能)
- 沟通模板:
- 10 分钟内:一句话说明“已暂停/限流,正在核查”
- 30 分钟内:公布受影响范围 + 资金流向追踪进度
- 2 小时内:给出临时修复和恢复条件
别追求写得体面,追求快。
6)避坑清单:跨链/桥接最容易“信错的 7 件事”
把这份清单当成评审时的“拷问题库”:
- 你们验证的“来源”到底是谁?是链、是合约、还是一组中继者?
- message 的唯一性怎么保证?nonce、hash、时间窗谁说了算?
- 验证与执行有没有彻底分离?能不能做到“先冻结、再人工放行”?
- 出现异常时,你们能不能只停跨链入口,而不是全站关机?
- 限额是写在合约里,还是靠运维口头约定?(口头约定等于没有)
- 监控有没有覆盖“验证通过事件”?很多团队只盯资金转账,太晚。
- 权限与响应流程有没有演练?没演练的暂停按钮,关键时刻大概率按不下去。
7)给你一套“复盘→规则→上线”的落地流程(适合小团队)
你按这个节奏走,1 天内能把基本盘搭起来:
- 找到材料:公告 + 交易哈希 + 审计报告(Fenz AI 或其他)
- 用大模型提取:时间线、信任假设、监控点
- 把监控点改成规则草案:每条规则带阈值、误报、处置动作
- 用你们现有栈实现:Dune/Nansen/自建 indexer/DefiLlama 警报/自写脚本都行
- 跑 24 小时影子模式:只报警不执行,调阈值
- 上线 P0 联动:报警→值班群→一键暂停/限流(哪怕是半自动)
做完你会明显感觉:出事时不再是“我好像该做点什么”,而是“我知道现在该按哪三个按钮”。
8)你可以直接拿去用的“复盘输出模板”(Markdown)
### 事件概述
- 时间:
- 影响资产:
- 影响金额:
- 发现方式:
- 响应动作与耗时:
### 攻击链(按步骤)
1.
2.
3.
### 被利用的信任假设
- 系统信了:
### 关键证据
- 交易哈希:
- 关键事件:
- 关键合约/函数:
### 可观测的预警信号(可告警)
- 信号1:阈值 / 误报 / 处置
- 信号2:阈值 / 误报 / 处置
### 临时止血
-
### 修复计划
- 验证层:
- 业务层:
- 运维响应:
### 回归测试清单
-
把这个模板塞进你们 repo。 每次事故/演练都按它写,团队成长速度会快很多。
想把这一套做成自动化(监控脚本 + Slack/Telegram 告警 + 简单的风控开关),你把你们用的链、桥接框架、监控栈(Dune/自建/ThirdWeb/Alchemy 等)发我,我给你一份更贴近你们系统的规则清单和实现思路。