当前位置:首页>货币平台

Cobo 安全团队 - ETH 硬分叉中的隐藏风险和套利机会

日期:2023-03-17

来源:玫瑰财经网

浏览:

    Cobo 安全团队 - ETH 硬分叉中的隐藏风险和套利机会

    本文由Cobo区块链安全团队提供。团队成员来自知名区块链安全企业,拥有丰富的智能合同审计经验。他们在多个DeFi项目中发现了高风险漏洞。团队目前专注于智能合同安全、DeFi安全等方面,正在研究和共享最先进的区块链安全技术。

    我们还希望在加密* * *领域拥有研究精神和科学方面* * * *的终身迭代学习者能加入我们,向业界输出思维观点和研究观点!

    这是科波的第十六句话。

    前言

    随着ETH升级到PoS共识系统,原PoW机制的ETH链在部分社区(以下简称ETHW)的支持下成功地进行了硬分叉。但是,由于某些链上的协议在设计初期没有为可能的硬分叉做好准备,因此该协议对ETHW分支链存在安全风险,其中最严重的安全风险如下:

    硬分叉完成后

    Cobo 安全团队 - ETH 硬分叉中的隐藏风险和套利机会

    ,ETHW主互联网上至少有两次使用再生机制的攻击,分别是再生攻击和再生攻击。本文以这两个事件为例,分析了重放攻击对分叉链的影响,以及协议应如何防止这种攻击。

    播放类型

    首先,在开始分析之前,需要对重放攻击类型有初步的了解。通常,回放攻击分为两类:事务回放和签名消息回放。接下来,我们来谈谈这两种再生机制的区别。

    交易重播

    重放事务是将原始链中的事务原封不动地转移到大象链中的操作。属于事务级别重放。回放后,可以正常运行事务分叉,完成事务验证。最著名的事例是平台的攻击事件,直接造成了2000万个以上的OP令牌损失。但是,在实施EIP 155之后,如果由于事务本身的签名(这是区分链本身和其他分叉链的标识符)而播放的大象链不同,则不能播放事务本身。中选择另一种天花板类型。

    播放签名消息

    播放签名消息与播放事务不同。用于播放用私钥签名的消息(例如,Cobo最好)。在播放签名消息中,攻击者不需要播放整个事务,只播放签名消息。对于消息签名,以Cobo为例。消息不包含与链相关的特殊参数,因此签名后理论上可以在所有分支链中使用消息。可以检查。为了避免分支的消息回放,Cobo可以添加到消息内容中,例如最好的消息内容()。携带特定的链标识后,每个季度的消息内容不同,消息签名也不同,不能直接播放和重复使用。

    和攻击原理

    让我们分析原理,攻击它。首先得出结论

    Cobo 安全团队 - ETH 硬分叉中的隐藏风险和套利机会

    ,这两种攻击本身不是交易回放攻击。原因是ETHW使用与ETH家庭网络不同的东西,因此无法直接确认播放事务。那么剩下的唯一选择就是播放信息。那么,让我们逐一分析一下ETHW分叉链中,各自是如何被消息播放攻击的。

    这是XDAI和ETH主网络之间资产转移的桥梁。主要依靠布里奇提交的指定跨链消息完成跨链资产转移。中提交的验证消息的逻辑如下

    functionexecutesignatures(bytes _ data,bytes _ signatures) pu * * * IC {

    _ allowmess * * * eexecution (_ data,_ signatures);

    Bytes32msgId

    Addresssender

    Addressexecutor

    Uint32gasLimit

    Uint8dataType

    uint 256[2]memory chainids;

    Bytesmemorydata

    (msgid、sender、executor、gaslimit、datatype、chain ids、data)=arbitrary mess * * * e.un * *

    _ execute mess * * * e (msgid、sender、executor、gas limit、datatype、chain ids和data);

    }

    该函数首先根据第#L2行上的签名确认来确认提交的签名是否为指定的签名,然后在第#L11行上解码数据消息。在解码的内容中不难找到。返回的字段包含字段。那么,不能播放表示签名的消息吗我们继续分析。

    Function_executeMess***e(

    Bytes32msgId、

    Addresssender、

    Addressexecutor、

    Uint32gasLimit、

    Uint8dataType,

    Uint256[2]memorychainIds、

    Bytesmemorydata

    )internal{

    请求(_ * * * mess * * * eversion valid(msgid));

    require(_ * * * destinationchainidvalid(chain ids[1]));

    Require(!relayed mess * * * es(msgId);

    SetRelayedMess***es(msgId,true);

    Processmess * * * e (sender、executor、msgid、gaslimit、datatype、chain ids [0]、data);

    }

    通过跟踪函数,在第#L11行发现了函数的合法性

    function _ * * * destinationchainidvalid(uint 256 _ chainid)internal returns(boolres){

    return _ chainId==source chainId();

    }

    functionsourcechainid()pu * * * icviewreturns(uint 256){

    returnuintstor * * * e[source _ chain _ id];

    }

    继续分析下面的函数逻辑,我们会发现实际验证不是使用EVM的基础来获取链本身,而是直接使用变量中存储的值。那么这个值显然可以认为* * *在消息本身没有链ID eth分叉,所以理论上可以播放签名的消息。

    在硬分叉期间,分叉前的所有状态在两条链中保持不变,因此后续xDAI团队没有进一步的工作。分叉后,Omni合同在ETHW和ETH州互联网上的状态不变。换句话说,合同不变。根据这种情况,我们可以推测主网的签名也可以在ETHW上确认。然后,由于签名消息本身不包含,攻击者可以使用签名回放从ETHW中提取同一合同的资产。

    和Omni一样,它是来往于ETH主网络的资产转让的桥梁。与Omni不同,它依赖于块证书* * *。逻辑如下:

    function exit(bytescalldatainputdata)外部override {

    //.省略不重要的逻辑

    //verifyreceiptinclusion

    Require(

    MerklePatriciaProof.verify(

    Receipt.toBytes()、

    BranchMaskBytes,

    ***yload.getReceiptProof()、

    ***yload.getReceiptRoot()

    ),

    root chain man * * er:invalid _ proof '

    );

    //verifycheckpointinclusion

    _ checkblockmembershipincheckpoint(

    ***yload.getBlockNumber()、

    ***yload.getBlockTime()、

    ***yload.getTxRoot()、

    ***yload.getReceiptRoot()、

    ***yload.getHeaderNumber()、

    ***yload.getBlockProof()

    );

    itokenpredicate(predicate address)。exittokens(

    _msgSender()、

    根令牌,

    Log.toRlpBytes()

    );

    }

    通过函数逻辑可以很容易地看出,合同通过两种检查来确定消息的合法性。一种是检查总额,以便交易实际发生在子链(Chain)上。任何人都可以通过交易数据构成自己,所以第一次检查可以绕过,但第二次检查不能绕过。因为如果你看逻辑,你会发现:

    function _ checkblockmembershipincheckpoint(

    Uint256***ockNumber、

    Uint256***ockTime、

    Byte s32tx根,

    Byte s32 receipt根,

    Uint256headerNumber、

    Bytesmemory***ockProof

    )privateviewreturns(uint256){

    (请参阅)

    Bytes32headerRoot,

    Uint256startBlock,

    而且,

    Uint256createdAt、

    )=_ checkpointman * * * er . header blocks(标头编号);

    Require(

    Keccak256(

    Abi.encodepacked (* * * ocknumber、* * * ocktime、tx根、receipt根)

    )。

    .checkMembership(

    * * * ocknumber.sub(起始块)、

    HeaderRoot,

    ***ockProof

    ),

    root chain man * * er:invalid _ header '

    );

    ReturncreatedAt

    }

    从合同中提取相应的项目。按照这个逻辑,我们来看看设定。

    在functionsubmitcheckpoint(bytescalldatadata,uint [3] [] calldatasigs)之外{

    (address proposer、uint 256 start、uint 256 end、byte s32 root hash、byte s32 account hash和uint 256 _ borchainid)

    .decode (data、(address、uint 256、uint 256、byte s32、byte s32和uint 256));

    Require (chain id==_ borchainid,' invalidborchainid ');

    require(_ buildheaderblock(proposer、start、end、root hash)、' incorrect _ header _ data ')

    //checkifit * * * * * * * tertokeepitinlocalstor * * * * e instead

    istakeman * * * erstakeman * * * er=istakeman * * * er(reg * * * try . getstakeman * * * eraddrer)

    uint 256 _ reward=stakeman * * * er . check signatures(

    End.sub(start)。add(1)、

    /* *

    Prefix01todata

    01 representspositivevoteondataand 00 * * * negative vote

    maliciousvalidatorcantrytosend 2/3 onnegativevoteso 01 * * * appended

    */

    Kec cak 256 (ABI .encode packed (bytes (hex' 01 'data))、

    帐户散列,

    Proposer,

    西格斯

    );

    //.省略剩馀逻辑

    不难看出,在代码#L2行中,仅检查签名数据,而不检查链本身。信息是由合同签署的,所以理论上攻击者也可以划分链条。播放消息的签名是合法的,可以在ETHW链上调用exit函数并提交相应的事务证明,成功撤回并通过后续验证。

    以地址B9为例,该地址通过以下步骤成功完成了ETHW链的套利。

    首先,依靠纸币能力从主网交易所提取货币。通过传递给链条的功能节省资金。通过ETH主网络调用的exit函数取钱。复制并提取提交的ETH家庭网络。ETHW播放在上一步中提取的签名消息。ETHW调用exit提取呼叫

    为什么会这样

    上面分析的两个例子不难发现,这两个协议在ETHW上受到重放攻击,是因为协议本身没有做好防止重放的保护,所以协议对应的资产是空荡荡的链。但是,由于这两条腿不支持ETHW分支链,用户没有受到任何损失。但是我们要考虑的是,为什么这两条腿没有设计再生保护措施。原因很简单。他们设计的应用场景很简单

    Cobo 安全团队 - ETH 硬分叉中的隐藏风险和套利机会

    ,但因为他们被用来将资产转移到自己指定的相应链上。没有多链部署计划

    Cobo 安全团队 - ETH 硬分叉中的隐藏风险和套利机会

    ,因此没有得到保护。合同本身没有安全风险。

    另一方面,ETHW的用户在ETHW分支链上工作时,ETHW主网络会受到消息播放攻击,因为桥本身不支持多链场景。

    例如,当前的采矿合同包含变量的函数。

    Function permit (address owner、address spender、uint value、uint deadline、uint 8v、byte s32r和byte s32s)extent

    require(deadline=* * * ock . timestamp,' un * * * WAP v2:expired ');

    Bytes32digest=keccak256(

    Abi.encodePacked(

    x19x 01’,

    domain _ separator,

    keccak 256(ABI . encode(permit _ type hash、owner、spender、value、nonces [owner]、deadline))

    )。

    );

    addressrecoveredaddress=e crecover(digest、v、r、s);

    Require(recoveredAddress!=address(0)recover edaddress==owner,' un * * * WAP v 2:invalid _ signature ');

    _approve(owner、spender、value);

    }

    首先定义这个变量。此变量从设计初期开始就包含可能的多链场景的防重放功能,但根据矿井池合同的逻辑,如下所示:

    Constructor()pu***ic{

    UintchainId

    Assem***y{

    ChainId:=chainid

    }

    DOMAIN_SEPARATOR=keccak256(

    Abi.encode(

    keccak 256(' EIP 712 domain(string name,string version,uint 256 chain id,addressverifyingcontract)')、

    Keccak256(bytes(name))、

    Keccak256(bytes('1 '))、

    ChainId,

    Address(th*** *)

    )。

    );

    }

    构造函数中已定义。这意味着,即使在硬分叉后链本身发生了变化,矿池合同也无法获得新的更新。用户以后批准ETHW后,ETHW的签名可以在ETH主互联网上播放。此外,类似的协议(例如特定版本的yearn vault协议)也是固定的。用户在ETHW上交互时,还必须防止这些协议的再生风险。

    协议设计初始考虑事项

    对于开发人员来说,在自定义协议本身的消息签名机制时,应考虑后续的多链方案。如果路线图有多链部署的可能性,则必须在签名消息中添加为变量。另外,在验证签名时,硬分叉不会在分叉前改变状态,因此,不要将用于验证签名消息的合同变量设置为协议变量,而是要重新获得每次验证,然后为了安全起见验证签名。

    对用户的影响

    一般来说,如果协议不支持分叉链,请尽可能不要对分叉链执行任何操作。这样,相应的签名消息将无法在主internet上播放,从而使用户在主网络上丢失资产。

    对交易所和受托人的影响

    因为很多交易所本身支持ETHW代币,所以在攻击中提取的代币可以充入交易所。但是需要注意的是,这种攻击不是连锁协议本身的问题。交易所造成的恶意蒸发对交易所来说,这种攻击不需要进一步预防

    摘要

    随着多链场景的发展,再生攻击在理论层面逐渐成为主流攻击手段。开发者必须仔细考虑协议设计。设计消息签名机制时,请尝试添加其他可能的元素作为签名内容。遵循相关最佳实践,防止用户资产损失。

    Cobo是亚太地区最大的加密货币托管机构。自成立以来,为500多家业界顶尖机构和高顺人士提供了优质的服务。在确保加密资产安全存储的前提下,加密资产的稳定收益也将实现。受到全世界用户的信任。Cobo专注于构建可扩展的基础架构,为组织提供安全托管、资产增值、链交互、多类型资产跨链层管理等多种解决方案,并为组织转变为Web转换提供解决方案3.0最强大的基于技术的支持和功能。Cobo是Cobo、Cobo DaaS、Cobo MaaS、Cobo StaaS、Cobo、

    原文来源于微信公众号(COBO): COBO安全团队——ETH硬分叉的隐患和套利机会。

    以上就是网编给大家带来的所有内容。希望能帮助大家

相关文章阅读

Copyright (c) 2022 玫瑰财经网 版权所有

备案号:冀ICP备17019481号

玫瑰财经网发布此信息的目的在于传播更多信息,与本站立场无关。玫瑰财经网不保证该信息(包含但不限于文字、视频、音频、数据及图表)全部或者部分内容的准确性、真实性、完整性、有效性、及时性、原创性等。
相关信息并未经过本网站证实,不对您构成任何投资建议,据此操作,风险自担。