本文为社区投稿。作者为CertiK的审计师Minzhi He。
本文的观点是投稿人/作者的观点,未必反应币安学院的观点。
摘要
区块链桥是区块链领域实现互操作性的根本所在。因此,跨链桥接技术的安全至关重要。一些常见的区块链桥安全漏洞包括链上和链下验证不足、原生代币处理不当以及配置错误。为了确保验证逻辑合理,建议针对所有可能的攻击向量对跨链桥进行测试。
区块链桥是连接两个区块链,让二者实现交互的协议。通过区块链桥,用户如要参与以太坊网络的DeFi活动,只需持有比特币,无需出售即可达成目的。
区块链桥是区块链领域实现互操作性的根基。它们使用各种链上和链下验证来发挥作用,因此也可能存在不同的安全漏洞。
区块链桥通常会持有用户想从一条链转移到另一条链的代币。区块链桥通常以智能合约的形式部署,随着跨链转移的持续积累,桥上会持有大量的代币,这笔巨额的财富就会使它们成为黑客觊觎的目标。
此外,由于涉及许多组件,区块链桥的攻击面往往很大。因此,不法分子有着强烈的动机把跨链应用作为目标,以期攫取大量资金。
根据CertiK的估计,在2022年,区块链桥攻击造成了超过13亿美元的损失,占当年总损失的36%。
为了增强区块链桥的安全性,了解常见的跨链桥接安全漏洞并在启动前测试区块链桥十分重要。这些漏洞主要来自以下四个方面:
对于简单的区块链桥,尤其是专为特定dApp设计的区块链桥,通常只有最低程度的链上验证。这些桥依靠集中式后端来执行基本操作,例如铸币、销毁和代币转移,所有验证都是在链下进行的。
而其他类型的桥则使用智能合约来验证消息并在链上进行验证。在这种情况下,当用户将资金存入链中时,智能合约会生成签名的消息并在交易中返回签名。这个签名就会用作充值的证明,用于验证用户在另一条链上的提现请求。这一流程应该能够防止各种安全攻击,包括重放攻击和伪造充值记录。
但是,如果链上验证过程存在漏洞,攻击可能会造成严重损失。例如,如果区块链用默克尔树来验证交易记录,那攻击者就可以生成伪造证明。这意味着,如果验证过程存在漏洞,攻击者就可以绕过证明验证,并在其账户中铸造新的代币。
某些区块链桥会实施“包装代币(wrapped tokens)”的概念。例如,当用户将DAI从以太坊转移到BNB Chain时,他们的DAI将从以太坊合约中取出,并在BNB Chain上发行等量的包装DAI。
但是,如果此交易没有正确验证,攻击者就可以部署恶意合约,通过操纵该功能,将包装的代币从桥接路由到错误的地址。
攻击者还需要受害者先批准跨链桥合约,才能使用“TransferFrom”功能转移代币,从而从跨链桥合约中卷走资产。
但棘手的是,许多跨链桥都会要求dApp用户无限地批准代币,这种做法很常见,它可以降低燃料费,但允许智能合约从用户的钱包中访问不限量的代币,会带来额外的风险。攻击者会利用这些验证不足和批准过度,将代币从其他用户转移给自己。
在某些跨链桥系统中,链下后端服务器在验证从区块链发送的消息的合法性时起着至关重要的作用。在这种情况下,我们要重点关注充值交易的验证。
有链下验证的区块链桥的工作原理如下:
用户与dApp交互,将代币存入源链上的智能合约。
然后,dApp通过API将充值交易哈希发送到后端服务器。
交易哈希需要经过服务器的多次验证。如果被认为合法,则签名者会签署一条消息,并将签名通过API发回到用户界面。
收到签名后,dApp会对其进行验证,并允许用户从目标链中提取代币。
后端服务器必须确保其处理的充值交易是真实发生而并非伪造的。该后端服务器会决定用户是否可以在目标链上提取代币,因此成为首当其冲的攻击目标。
后端服务器需要验证交易发起事件的结构,以及发起该事件的合约地址。如果忽视后者,攻击者就可能会部署恶意合约,来伪造与合法充值事件结构相同的充值事件。
如果后端服务器不验证哪个地址发起了该事件,它就会认为这是有效交易,并且签署消息。攻击者就可以向后端服务器发送交易哈希,绕过验证,使其从目标链中提取代币。
跨链桥采用不同的方法来处理原生代币和效用代币。比如,在以太坊网络上,原生代币是ETH,大多数效用代币都符合ERC-20标准。
如果用户打算把自己的ETH转移到另一条链,必须先将其存入跨链桥合约。为此,用户只需将ETH附到交易中,即可通过读取“msg.value”交易字段来检索ETH的数量。
存入ERC-20代币与存入ETH有很大区别。要存入ERC-20代币,用户必须先允许跨链桥合约使用他们的代币。在他们批准并将代币存入跨链桥合约后,合约将用 “burnFrom()”函数销毁用户的代币,或用“transferFrom()”函数将用户的代币转移到合约中。
要区别是哪种操作,可以在同一个函数中使用if-else语句。或是创建两个单独的函数来处理每种场景。由于处理方式不同,如果用户尝试使用ERC-20充值函数来存入ETH,那么这些ETH可能会丢失。
在处理ERC-20充值请求时,用户通常提供代币地址作为输入参数传递给充值函数。这会构成重大风险,因为在交易过程中可能会发生不可信的外部调用。使用白名单来只包含跨链桥支持的代币,是把风险降到最低的常见做法。只有列入白名单的地址会作为参数传递。这样可以防止外部调用,因为项目团队已经过滤了代币地址。
但是,当跨链桥处理原生代币跨链传输时,也有个麻烦,因为原生代币没有地址。原生代币可以使用一个特殊的地址来代表,即“零地址”(0x000... 0)。但这样做存在一个问题,如果未正确实现白名单验证逻辑,使用零地址传递给函数可能会绕过白名单验证。
当跨链桥合约调用“TransferFrom”将用户资产转移到合约时,对零地址的外部调用会返回false,因为零地址中没有实现“transferFrom”函数。但是,如果合约没有正确处理返回值,交易仍可能继续发生。这就会为攻击者创造机会,使其不用向合约转移任何代币就能执行交易。
在大多数区块链桥中,有一个特权角色负责将代币和地址列入白名单或黑名单,分配或改变签名者,以及其他关键配置。确保所有配置准确无误非常关键,因为看似微不足道的疏忽也可能导致重大损失。
实际上,曾经真的发生过攻击者由于配置错误而成功绕过传输记录验证的事件。该项目团队在黑客攻击发生前几天实施了协议升级,其中更改了某个变量。该变量是用来表示可信消息的默认值。这个更改导致所有消息都被自动认为是经过验证的,因此使攻击者随便提交一个消息就能通过验证。
上面所述的四个常见跨链桥漏洞表明,在互联区块链生态系统中安全所面临的挑战不可小觑。要应对这些漏洞,需要“因地制宜”地考虑,没有哪个方法可以全能地对付所有漏洞。
例如,由于每个跨链桥都有独特的验证要求,因此仅仅提供通用准则就想确保验证过程没有错误,这很难做到。防止绕过验证的最有效方法,是针对所有可能的攻击向量对跨链桥进行全面测试,并确保验证逻辑是合理的。
总而言之,必须针对潜在攻击进行严格的测试,并特别注意跨链桥中最常见的安全漏洞。
由于资金量巨大,跨链桥长期以来一直是攻击者的目标。构建者可以通过进行全面的部署前测试和纳入第三方审计来加强跨链桥的安全,从而降低过去几年来笼罩在跨链桥上的灾难性黑客攻击的风险。跨链桥在多链的世界中至关重要,但在设计和构建有效的Web3基础架构时,安全性必须是首要考虑因素。
什么是区块链桥?
什么是跨链互操作性?
三大人气加密货币桥及工作原理
什么是包装代币?
免责声明与风险提示:本文内容均为事实,仅作一般资讯及教育用途,不构成任何陈述或保证。本文不应解释为财务、法律或其他专业建议,且未推荐您购买任何特定产品或服务。您应自行向适当的专业顾问寻求建议。如果本文由第三方贡献者提供,请注意本文观点属于第三方贡献者,不一定反映币安学院的观点。欲知详情,敬请点击此处阅读我们的完整免责声明。数字资产价格可能会波动。您的投资价值可能会下跌或上涨,且您可能无法收回投资本金。您对自己的投资决策全权负责,币安学院对您可能遭受的任何损失概不负责。本文不构成财务、法律或其他专业建议。欲知详情,敬请参阅我们的《使用条款》和《风险提示》。