
桥攻击:为什么黑客以它们为目标
想象一下,如果互联网由十几个无法相互通信的独立网络组成,会是怎样? 这就是桥接出现之前的区块链生态系统的样子。跨链桥是数字基础设施,允许在一个区块链(如比特币)上的资产在另一个区块链(如以太坊)上使用。 它们对于多链未来至关重要,但它们作为价值转移的中心点,使其成为攻击者的主要目标。
当数十亿美元锁定在单个智能合约中时,桥接成为 Web3 安全领域中最常被利用的目标也就不足为奇了。 本指南将引导你了解桥接的脆弱性以及如何保护它们。
跨链桥如何运作?
最常见的桥接类型使用“锁定和铸造(lock-and-mint)”机制。 这是一个简化的解释:
- 锁定(Lock): 你想将你的 token 从链 A 移动到链 B。你将你的 token 发送到链 A 上的智能合约,该合约会锁定它们。
- 验证(Validate): 桥的验证者——一组独立的实体——确认 token 已在链 A 上成功锁定。
- 铸造(Mint): 验证后,桥在链 B 上的智能合约会铸造等效的、封装版本的你的 token。 这种“封装”的 token 由锁定在链 A 上的原始 token 以 1:1 的比例支持。
此过程允许你在链 B 上使用你的资产,而无需将原生网络暴露给它。 反向过程(销毁链 B 上的封装 token 以解锁链 A 上的原始 token)是你将资产移回的方式。
主要漏洞利用一览
理解理论是一回事,但查看真实世界的例子有助于巩固重点。 下表重点介绍了一些迄今为止最重大的桥接黑客攻击事件。

智能合约代码中的常见漏洞
桥接安全性的核心在于其智能合约。 以下是这些合约中最常见的一些漏洞:
1. 弱的链下验证和私钥管理
许多桥依赖于一小群验证者(甚至是一个单一实体)来批准交易。 如果这些验证者的私钥通过网络钓鱼、社会工程或对其系统的黑客攻击而泄露,攻击者就可以控制桥的资金。 Ronin Bridge 攻击就是一个完美的例子。
2. 逻辑错误和访问控制缺陷
智能合约代码中的一个微小错误可能会产生灾难性的后果。 这可能是一个逻辑缺陷,允许用户提取超过他们存入的金额,或者是一个错位的访问控制,允许未经授权的用户调用敏感功能。
3. 不正确的输入验证
这是一个常见的编码错误,会影响所有软件,而不仅仅是智能合约。 如果合约没有正确检查它接收的数据,攻击者可以输入恶意数据来触发意外的操作。 Nomad Bridge 的黑客攻击是这种缺陷的直接结果。
一个简单的代码示例
这是一个非常基本的 Solidity 代码片段,用于说明桥上的“锁定(lock)”功能。 此代码已高度简化且不安全——它仅用于教育目的,以演示该概念。
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; // This is a HIGHLY simplified and INSECURE example. DO NOT USE IN PRODUCTION. // 这是一个高度简化且不安全的例子。请勿在生产环境中使用。 contract BasicBridge { // The address of the token on the current blockchain // 当前区块链上 token 的地址 IERC20 public token; // The public key of the single trusted validator // 单个受信任验证者的公钥 address public trustedValidator; // This event will be listened to by the relayer/validator // 此事件将被中继者/验证者监听 event Locked(address indexed from, uint256 amount); constructor(address _tokenAddress, address _validator) { token = IERC20(_tokenAddress); trustedValidator = _validator; } // Function to lock tokens on this chain // 用于锁定此链上 token 的函数 function lock(uint256 amount) public { // Transfer tokens from the user to this bridge contract // 将 token 从用户转移到此桥合约 // NOTE: A more secure version would use a permit signature or approve/transferFrom pattern // 注意:更安全的版本应使用许可签名或 approve/transferFrom 模式 token.transferFrom(msg.sender, address(this), amount); // Emit a log event that a validator would pick up // 发出一个日志事件,验证者会收到该事件 emit Locked(msg.sender, amount); } // A simple, and INSECURE, way to 'unlock' tokens after a cross-chain event // 一种简单且不安全的方式,在跨链事件后“解锁” token // This function can be called by anyone! This is the kind of logic flaw that is exploited. // 任何人都可以调用此函数! 这就是被利用的那种逻辑缺陷。 function unlock(address to, uint256 amount) public { // In a real bridge, this would be a secure, validated cross-chain message // 在真正的桥中,这将是一个安全、经过验证的跨链消息 // Here, we just have an insecure check to show the concept // 在这里,我们只是进行不安全的检查来展示这个概念 require(msg.sender == trustedValidator, "Only the trusted validator can unlock."); token.transfer(to, amount); } }解释:
lock函数只是获取你的 token 并将其放入桥合约中。Locked事件至关重要。链下验证者不断扫描区块链以查找此事件。当它看到它时,它知道一个 token 已被锁定,并且可以开始在另一侧进行铸造过程。unlock函数是此简化示例中存在巨大安全风险的地方。因为它仅检查msg.sender是否为trustedValidator,如果该验证者的密钥泄露,攻击者可以调用此函数并耗尽所有锁定的 token。
必要的安全考虑
构建安全的桥梁是一项巨大的挑战。 项目必须超越简单的代码,并考虑整体安全方法。
- 独立审计: 每行代码都应由多个信誉良好的第三方公司进行审计。
- 去中心化验证: 依赖于单个或一小群验证者是灾难的根源。 真正安全的桥使用大型的、去中心化的验证者网络,使得破坏大多数验证者变得更加困难。
- 实时监控: 项目应建立系统来监控可疑活动,例如大量、突然的提款或不寻常的交易模式。 这些系统可以充当“断路器”,暂停桥并防止全面耗尽。
- 强大的密钥管理: 验证者密钥必须以最高级别的安全性存储,通常使用专门的硬件安全模块(HSM)。
结论:桥接到更安全的未来
跨链桥将长期存在,但它们的安全性是一个持续的挑战。 虽然过去的漏洞利用导致了巨大的损失,但它们也为社区提供了宝贵的教训。 通过优先考虑去中心化设计、严格的代码审计和强大的运营安全,我们可以构建一个更具弹性的多链生态系统。 了解这些漏洞是成为建设者而不是目标的第一步。
让我们一起构建一些令人难以置信的东西。
- 原文链接: blog.blockmagnates.com/b...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~