简而言之——导致你的桥被黑的 5 件事
正在构建跨链桥? 以下是超过 20 亿美元损失漏洞背后的关键失败之处:
- 验证者安全性弱——小型多重签名、密钥管理不善、没有惩罚(Ronin:6.25 亿美元)
- 缺少消息验证——签名未正确验证,允许伪造铸币(Wormhole:3.2 亿美元)
- 初始化失败——有缺陷的合约设置让任何人都能通过验证(Nomad:1.9 亿美元)
- 没有断路器——当漏洞利用正在进行时,无法暂停
- 最终性检查不足——在源链达到最终性之前进行铸币
此清单涵盖了 7 个领域中的 100 多项安全检查。 在审核之前、开发期间以及作为启动前的关卡使用它。
🔐 可用的交互式清单
我们创建了此清单的交互式版本,其中包含可扩展的详细信息、代码示例和审核复选框。 非常适合审计师和开发团队。
→ 查看 EVM 跨链桥安全检查表
简介:为什么桥梁安全不可协商
跨链桥已成为多链 DeFi 的关键基础设施。 它们使资产和消息能够在区块链之间流动,从而释放跨生态系统的可组合性。 但这种力量伴随着非凡的风险。
这些数字令人清醒:
- 6.25 亿美元——Ronin Bridge(2022 年 3 月)
- 3.2 亿美元——Wormhole(2022 年 2 月)
- 1.9 亿美元——Nomad Bridge(2022 年 8 月)
- 1 亿美元——Harmony Horizon(2022 年 6 月)
- 8000 万美元——Orbit Chain(2024 年 1 月)
桥梁的价值锁定不到 DeFi 总价值的 10%,但却占 DeFi 漏洞利用中所有被盗资金的 50% 以上。 为什么? 因为桥梁非常复杂:它们必须同时跨多个信任边界、共识机制和执行环境保持安全保证。
本清单是从分析 Cyfrin、Pashov、Guardian Audits 和 BailSec 的 18 份以上桥梁审计报告中提炼出来的,并结合了每次重大桥梁漏洞利用的事后分析。 无论你是构建自定义桥、集成 LayerZero 还是实施 Chainlink CCIP,本指南都将帮助你避免成为下一个头条新闻。
如何使用本清单
此清单分为七个关键领域:
- 架构和信任模型
- 消息传递安全性
- 资产转移机制
- 预言机和验证安全性
- 经济安全
- 紧急机制和操作
- 特定于链的注意事项
每个部分包括:
- 为什么重要——背景和真实世界的漏洞利用示例
- 安全检查——要验证的特定项目
- 危险信号——表明漏洞的警告信号
对于集成现有桥协议的团队,我们包含了 LayerZero 和 Chainlink CCIP 的专用部分。
1. 架构和信任模型
为什么重要
每个桥都做出了信任假设。 Ronin Bridge 黑客攻击(6.25 亿美元)的发生是因为攻击者攻破了 9 个验证者密钥中的 5 个——信任模型的单点故障。 在编写单行代码之前,你必须定义和捍卫你的信任边界。
安全检查
验证者集安全性
- [ ] 多重签名阈值是适当的——2/3 多重签名不足以支撑 1 亿美元以上的桥。 考虑阈值签名 (TSS) 或更高的比率(例如,最低 5/9,对于大型 TVL,则为 7/11 或更高)。
- [ ] 验证者选择是去中心化的——验证者应在地理上分布、组织上独立,并通过透明的标准进行选择。
- [ ] 密钥管理已加强——硬件安全模块 (HSM)、气隙签名和多方计算 (MPC) 用于密钥生成。
- [ ] 存在轮换机制——可以删除和替换受损或不活跃的验证者,而不会停止桥。
- [ ] 定义了惩罚条件——验证者因签署无效消息或双重签名而面临经济处罚。
共识和最终性
- [ ] 最终性要求适合链——以太坊需要大约 15 分钟才能达到经济最终性; Solana 在几秒钟内实现。 你的桥必须尊重每个链的最终性保证。
- [ ] 分叉处理是明确的——如果源链在消息中继后重组会发生什么? 桥必须优雅地处理这种情况。
- [ ] 拜占庭容错 (BFT) 假设已记录——在系统失败之前,可以有多少验证者是恶意的? 这应该是明确的,而不是隐含的。
危险信号
-
验证者密钥存储在没有 HSM 保护的云环境中
-
单个组织控制着大多数验证者密钥
-
没有针对恶意行为的惩罚机制
-
最终性假设未记录或未测试
-
2. 消息传递安全性
为什么重要
Wormhole 漏洞利用(3.2 亿美元)的发生是因为桥未能正确验证消息的来源,从而允许攻击者在没有实际在源链上存款的情况下铸造代币。 消息身份验证是桥的最关键功能。
安全检查
消息身份验证
- [ ] 源链经过加密验证——消息必须可证明地来自声称的源链。 这通常需要验证者对消息哈希进行签名,包括链 ID。
- [ ] 消息完整性得到保证——对消息有效负载的任何修改都必须使消息无效。 使用加密哈希和签名,而不仅仅是序列号。
- [ ] 发送者授权已验证——在目标链上,验证消息是否由源链上的授权合约发送(受信任的远程模式)。
重放攻击预防
- [ ] Nonce 是按发送者实施的——每条消息都应该有一个唯一的 nonce,不能重复使用。
- [ ] 存在跨链重放保护——在链 A 上有效的消息不应在链 B 上重放。 在签名有效负载中包含链 ID。
- [ ] 阻止了历史消息重放——拥有旧的有效消息的攻击者不应能够重新执行它。 跟踪已处理的消息哈希。
消息排序
- [ ] 定义了排序保证——你的桥是否保证按顺序传递? 如果是,请强制执行。 如果没有,请确保你的应用程序逻辑处理乱序消息。
- [ ] 存在超时机制——消息应在合理的时间段后过期。 过时的消息存在安全风险。
- [ ] 重试逻辑是安全的——重试的失败消息不应创建双重执行漏洞。
危险信号
3. 资产转移机制
为什么重要
Nomad Bridge 漏洞利用(1.9 亿美元)是由一个有缺陷的初始化引起的,该初始化允许任何人通过任何消息的验证。 这将桥变成了一个自由放任的场所,攻击者可以通过复制成功的交易并替换接收者地址来耗尽资金。
安全检查
锁定和铸造桥
- [ ] 强制执行供应量守恒——所有链上包装代币的总供应量绝不能超过源链上锁定的抵押品。
- [ ] 铸币权限受到严格控制——只有桥合约(经过验证的消息接收者)才能铸造包装代币。 没有管理铸币功能。
- [ ] 销毁验证已完成——在解锁抵押品之前,以加密方式验证是否在目标链上销毁了包装代币。
- [ ] 记账是原子的——锁定和铸造(或销毁和解锁)应该是不能部分执行的原子操作。
流动性池桥
- [ ] 保证池偿付能力——桥不应承诺超过存在的流动性。 在转移之前实施检查。
- [ ] 强制执行滑点保护——大型转移不应耗尽池或导致过度滑点。 实施每笔交易和每个时代的限制。
- [ ] 重新平衡是安全的——如果桥重新平衡跨链的流动性,请确保此机制不会被利用以牺牲协议为代价进行套利。
代币处理
- [ ] 处理了转移时收费代币——在转移时收取费用的代币将导致记账不匹配。 阻止它们或测量实际收到的金额。
- [ ] 处理了重新调整基数的代币——自动更改余额的代币(如 stETH)需要特殊的记账逻辑。
- [ ] 代币小数已标准化——不同的链可以用不同的小数位表示相同的代币。 确保转换正确。
- [ ] 原生代币(ETH/MATIC 等)处理是明确的——包装和解包装逻辑必须万无一失。
危险信号
4. 预言机和验证安全性
为什么重要
依赖外部验证(预言机、轻客户端、中继器)的桥继承了这些系统的安全属性。 Harmony Horizon 桥(1 亿美元)遭到破坏,因为攻击者获得了控制桥的多重签名——预言机的信任假设是最薄弱的环节。
安全检查
预言机集成
- [ ] 验证了预言机操纵抵抗——如果使用价格预言机,请确保它们能够抵抗闪贷操纵。 使用 TWAP 或多个预言机来源。
- [ ] 监控了预言机活跃度——过时的预言机数据很危险。 实施心跳检查和回退机制。
- [ ] 验证了跨链价格一致性——资产价格应在各链上保持一致。 较大的差异可能表明存在操纵。
轻客户端安全性
- [ ] 已完成区块头验证——如果使用轻客户端,请验证整个标头的有效性,而不仅仅是选定的字段。
- [ ] 验证了状态证明——必须根据经过验证的区块头完全验证 Merkle 证明。
- [ ] 客户端更新是安全的——轻客户端更新机制应需要足够的验证者签名,并且不易受到日蚀攻击。
中继器网络
- [ ] 存在中继器审查阻力——多个独立的中继器应能够中继消息。 没有单个中继器能够审查。
- [ ] 中继器激励措施已对齐——中继器应在经济上有动力及时、诚实地传递消息。
- [ ] 定义了失败的中继处理——如果没有中继器接收到消息会发生什么? 用户应该有追索权。
危险信号
-
关键价格数据的单个预言机来源
-
可以通过少量密钥更新的轻客户端
-
没有回退机制的单个中继器
-
没有监控预言机/中继器活跃度
-
5. 经济安全
为什么重要
即使在技术上正确的桥也可能受到经济上的利用。 如果攻击成本低于潜在利润,理性的攻击者将进行攻击。 你的桥的经济安全模型必须使攻击无利可图。
安全检查
攻击成本分析
- [ ] 破坏验证者的成本 > TVL——破坏足够多的验证者以窃取资金的经济成本应超过风险资金。
- [ ] 惩罚超过潜在利润——恶意验证者应损失超过他们从攻击中获得的收益。
- [ ] 大额提款的时间锁定——大额提款应有一个延迟期,以便有时间检测和响应攻击。
费用机制
- [ ] 费用涵盖运营成本——中继器 gas、验证者基础设施和安全监控都需要资金。 费用应该是可持续的。
- [ ] 费用计算具有抗操纵性——攻击者不应能够操纵费用计算来耗尽资金或使使用者感到痛苦。
- [ ] 验证了费用代币——如果可以使用多种代币支付费用,请确保所有代币都经过适当验证和估值。
MEV 保护
- [ ] 存在抢先交易阻力——由桥创建的跨链套利机会不应被抢先交易者以用户为代价提取。
- [ ] 三明治攻击保护——大型转移应受到任一链上的三明治攻击的保护。
- [ ] 考虑了定序器/验证者 MEV——在具有中心化定序器的 L2 或链上,请考虑定序器 MEV 如何影响桥用户。
危险信号
-
TVL 显著超过风险中的验证者权益
-
大额提款没有提款延迟
-
以未经验证或易于操纵的代币支付的费用
-
在桥设计中没有考虑 MEV
-
6. 紧急机制和操作
为什么重要
当 Nomad 桥被利用时,没有断路器。 攻击者在几个小时内耗尽了 1.9 亿美元,而团队则争先恐后地做出回应。 每座桥都需要一个紧急停止开关。
安全检查
断路器
- [ ] 存在暂停功能——可以在紧急情况下快速暂停桥。 这应需要最少的签名者(例如,1/N 监护人)。
- [ ] 可以按链暂停——如果一条链受到破坏,你应该能够仅暂停该链,而不会影响其他链。
- [ ] 存在基于数量的限制——在检测到异常数量时自动进行速率限制。 减缓潜在的漏洞利用。
- [ ] 存在速度控制——限制资金离开桥的速度,即使对于合法交易也是如此。
恢复机制
- [ ] 记录了资产恢复程序——如何恢复由于错误或失败的交易而卡在桥中的资金?
- [ ] 事件发生后的状态同步——如果桥在操作中暂停,你如何协调跨链的状态?
- [ ] 存在用户补偿机制——如果用户因桥问题而损失资金,如何对他们进行补偿?
运营安全
- [ ] 密钥管理遵循最佳实践——多方计算、硬件安全模块、地理分布。
- [ ] 访问控制是最小权限原则——每个角色都应仅具有其所需的权限。
- [ ] 监控和警报是全面的——实时监控异常活动,并自动发出警报。
- [ ] 存在事件响应计划——记录了常见事件类型的程序,并具有明确的角色和沟通渠道。
危险信号
-
没有暂停功能或暂停需要太多的签名者
-
没有速率限制或数量上限
-
所有管理密钥由同一实体/位置持有
-
没有记录的事件响应计划
-
7. 特定于链的注意事项
EVM 链
- [ ] 处理了 gas 限制差异——交易 gas 限制因链而异。 确保跨链调用不会因 gas 限制而失败。
- [ ] 考虑了区块时间差异——确认要求应基于最终性,而不是区块计数。
- [ ] 验证了预编译可用性——某些 EVM 链缺少某些预编译。 验证加密操作是否在所有目标链上都有效。
- [ ] 确认了 EIP 兼容性——不同的 EVM 链支持不同的 EIP。 验证你的合约是否在所有目标上都有效。
非 EVM 链(Solana、Cosmos 等)
- [ ] 处理了帐户模型差异——基于 UTXO 与基于帐户的模型需要不同的安全注意事项。
- [ ] 签名方案是兼容的——Ed25519 与 secp256k1——确保签名验证跨链有效。
- [ ] 了解了最终性模型——概率性与确定性最终性需要不同的确认策略。
- [ ] 程序/合约升级模式不同——了解每个链上的升级方式并相应地进行保护。
L2 特有
-
[ ] 记录了定序器信任假设——中心化定序器可以审查或重新排序交易。
-
[ ] 考虑了提款延迟——Optimistic Rollup 具有 7 天的提款窗口。 你的桥 UX 必须考虑到这一点。
-
[ ] 存在 L1 回退——如果 L2 定序器出现故障,用户应该能够通过 L1 退出。
-
LayerZero 集成清单
如果你正在 LayerZero 上构建,则适用以下附加检查:
端点配置
- [ ] 正确配置了受信任的远程端点——每个链的合约都必须显式信任其他链上的正确合约地址。
- [ ] 路径配置是最小的——仅启用你实际需要的路径(链对)。
- [ ] 库版本已固定——不要在没有审核更改的情况下自动升级到新的 LayerZero 库。
消息处理
- [ ] 无法直接调用
lzReceive——只有 LayerZero 端点才能调用你的接收函数。
- [ ] gas 转发受到限制——不要将无限的 gas 转发到目标调用。 实施上限。
- [ ] 处理了失败的消息——实施
nonblockingLzReceive 模式以防止一条失败的消息阻止所有后续消息。
- [ ] 验证了适配器参数——应验证自定义适配器参数以防止 gas 操纵攻击。
OFT(全链同质化代币)特有
-
[ ] 共享小数位是一致的——OFT 使用共享小数位进行跨链记帐。 确保一致性。
-
[ ] 实施了速率限制——大型转移应触发速率限制以防止快速耗尽。
-
[ ] 了解了信用系统——了解 LayerZero 的信用系统如何运作及其对你的代币的影响。
-
Chainlink CCIP 集成清单
对于使用 Chainlink CCIP 的团队:
路由器配置
- [ ] 验证了支持的链——CCIP 仅支持特定的链对。 验证你的链是否受支持。
- [ ] 费用代币已批准——必须批准 LINK 或原生代币用于支付费用。
- [ ] gas 限制已适当设置——目标 gas 限制必须足以满足你的回调逻辑。
消息处理
-
[ ] ccipReceive 受到适当保护——只有 CCIP 路由器才能调用此函数。
-
[ ] 消息验证已完成——验证源链、发件人地址和消息内容。
-
[ ] 配置了速率限制——CCIP 支持速率限制——为你的用例配置适当的限制。
-
[ ] 处理了乱序执行——CCIP 不能保证消息排序。 你的逻辑必须处理这一点。
-
测试你的桥
安全检查仅与你的测试一样有效。 以下是你的测试套件应涵盖的内容:
单元测试
- [ ] 消息编码/解码边缘情况
- [ ] 使用各种代币类型的费用计算
- [ ] 所有特权功能的访问控制
- [ ] 暂停和取消暂停功能
集成测试
- [ ] 完整的往返转移(来源 → 目的地 → 来源)
- [ ] 失败的消息处理和重试逻辑
- [ ] 多链状态一致性
- [ ] 所有链上的升级程序
对抗性测试
- [ ] 重放攻击尝试
- [ ] 消息伪造尝试
- [ ] 验证者串通场景
- [ ] 经济攻击(例如,耗尽流动性池)
混沌测试
-
[ ] 验证者之间的网络分区
-
[ ] 待处理转移期间的链重组
-
[ ] 验证者节点故障
-
[ ] 高延迟网络条件
-
启动之前:最终清单
-
[ ] 完成了多个独立的审计——至少来自信誉良好的公司的两次审计,并解决了所有发现。
-
[ ] 启动了漏洞赏金计划——激励白帽黑客在黑帽黑客之前发现漏洞。
-
[ ] 监控和警报已启动——实时了解桥操作,并自动发出警报。
-
[ ] 确定了事件响应团队——指定了具有明确责任和沟通渠道的个人。
-
[ ] 计划了渐进式推出——从低 TVL 上限开始,并随着信心的增强逐渐增加。
-
[ ] 考虑了保险或用户保护基金——如果出现问题,将如何弥补受影响的用户的损失?
-
结论:构建持久的桥
跨链桥是 DeFi 中最复杂和高风险的系统之一。 安全桥和 1 亿美元的漏洞利用之间的区别通常归结为容易被忽略的细节:缺少验证检查、不正确的信任假设或未处理的边缘情况。
将此清单用作起点,而不是终点。 每座桥都是独一无二的,你的安全分析应根据你的特定架构、信任模型和目标链量身定制。
桥安全出错的代价是以数亿美元来衡量的。 正确的安全代价是什么? 彻底的审计和严格的开发实践。 明智地选择。
联系我们
正在构建跨链桥或将其集成到你的协议中? 安全不是可选项——它是生存之道。
在 Zealynx,我们审计了桥、跨链消息传递协议和全链 DeFi 应用程序。 我们知道漏洞隐藏在哪里以及如何在攻击者找到它们之前修复它们。
准备好保护你的桥了吗? 获取报价 或 直接联系 以讨论你的项目。
附加资源
常见问题解答:跨链桥安全
- 桥漏洞利用最常见的原因是什么?
验证者或密钥泄露是主要原因。 Ronin Bridge(6.25 亿美元)和 Harmony Horizon(1 亿美元)黑客攻击都是由于攻击者获得了足够的验证者密钥控制权,从而授权了欺诈性提款。 适当的密钥管理、阈值签名和验证者多样性至关重要。
- 桥安全与常规智能合约安全有何不同?
桥必须同时跨多个信任边界维护安全。 来源链或目标链上的漏洞——或连接它们的验证者/中继器层中的漏洞——可能会危及整个系统。 与单链协议相比,这增加了攻击面。
- 我应该构建自定义桥还是使用现有的协议,如 LayerZero 或 CCIP?
对于大多数团队来说,集成已建立的桥协议更安全。 LayerZero、Chainlink CCIP 和类似协议已经过广泛的审计和实战测试。 只有当你有现有解决方案无法满足的特定要求——以及安全构建的专业知识时,自定义桥才有意义。
- 在启动之前,桥需要进行多少次审计?
至少来自信誉良好的公司的两次独立审计。 桥是具有复杂攻击面的高价值目标。 不同的审计师会发现不同的问题。 此外,运行漏洞赏金计划并考虑对关键组件进行形式化验证。
- 锁定和铸造桥与流动性池桥之间有什么区别?
锁定和铸造桥在来源链上锁定资产,并在目标链上铸造包装代币。 流动性池桥使用每个链上预先注资的池并在它们之间交换。 锁定和铸造的资本效率更高,但需要信任托管机制。 流动性池有滑点,但可以提供原生资产。
- 如何保护我的桥免受重放攻击?
在所有签名消息中包含链 ID,跟踪已处理的消息哈希以防止重新提交,对每个发件人使用顺序 nonce,并设置消息到期时间。 EIP-712 域分离也有助于防止跨协议重放攻击。
术语表
| 术语 |
定义 |
| 跨链 |
不同区块链网络之间的通信或资产转移。 |
| 多重签名钱包 |
需要多个私钥才能授权交易的钱包。 |
| 拜占庭容错 |
即使某些参与者恶意行事,系统也能正常运行的能力。 |
| 轻客户端 |
无需下载完整链状态即可验证交易的区块链客户端。 |
| 验证者集 |
负责验证交易并达成共识的节点组。 |
| 锁定和铸造 |
一种桥机制,其中资产在来源链上锁定,包装代币在目标链上铸造。 |
| 断路器 |
一种紧急机制,用于在检测到异常情况时停止协议操作。 |
| 重放攻击 |
一种攻击,其中恶意地重新提交有效的交易以多次执行。 |
查看完整术语表 →