日期:2023-03-17
来源:玫瑰财经网
浏览:次
本文由Cobo区块链安全团队提供。团队成员来自知名区块链安全企业,拥有丰富的智能合同审计经验。他们在多个DeFi项目中发现了高风险漏洞。团队目前专注于智能合同安全、DeFi安全等方面,正在研究和共享最先进的区块链安全技术。
我们还希望在加密* * *领域拥有研究精神和科学方面* * * *的终身迭代学习者能加入我们,向业界输出思维观点和研究观点!
这是科波的第十六句话。
前言
随着ETH升级到PoS共识系统,原PoW机制的ETH链在部分社区(以下简称ETHW)的支持下成功地进行了硬分叉。但是,由于某些链上的协议在设计初期没有为可能的硬分叉做好准备,因此该协议对ETHW分支链存在安全风险,其中最严重的安全风险如下:
硬分叉完成后
,ETHW主互联网上至少有两次使用再生机制的攻击,分别是再生攻击和再生攻击。本文以这两个事件为例,分析了重放攻击对分叉链的影响,以及协议应如何防止这种攻击。播放类型
首先,在开始分析之前,需要对重放攻击类型有初步的了解。通常,回放攻击分为两类:事务回放和签名消息回放。接下来,我们来谈谈这两种再生机制的区别。
交易重播
重放事务是将原始链中的事务原封不动地转移到大象链中的操作。属于事务级别重放。回放后,可以正常运行事务分叉,完成事务验证。最著名的事例是平台的攻击事件,直接造成了2000万个以上的OP令牌损失。但是,在实施EIP 155之后,如果由于事务本身的签名(这是区分链本身和其他分叉链的标识符)而播放的大象链不同,则不能播放事务本身。中选择另一种天花板类型。
播放签名消息
播放签名消息与播放事务不同。用于播放用私钥签名的消息(例如,Cobo最好)。在播放签名消息中,攻击者不需要播放整个事务,只播放签名消息。对于消息签名,以Cobo为例。消息不包含与链相关的特殊参数,因此签名后理论上可以在所有分支链中使用消息。可以检查。为了避免分支的消息回放,Cobo可以添加到消息内容中,例如最好的消息内容()。携带特定的链标识后,每个季度的消息内容不同,消息签名也不同,不能直接播放和重复使用。
和攻击原理
让我们分析原理,攻击它。首先得出结论
,这两种攻击本身不是交易回放攻击。原因是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分支链,用户没有受到任何损失。但是我们要考虑的是,为什么这两条腿没有设计再生保护措施。原因很简单。他们设计的应用场景很简单
,但因为他们被用来将资产转移到自己指定的相应链上。没有多链部署计划,因此没有得到保护。合同本身没有安全风险。另一方面,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硬分叉的隐患和套利机会。
以上就是网编给大家带来的所有内容。希望能帮助大家
500吨汽车吊作业性能表(汽车吊支腿反力及抗倾覆验算)
石碣镇汽车站(今天,石碣汽车客运站恢复运营)
招贤汽车站(9月14日起,莒县K601路增开大站快车)
北京福田汽车图片(自重不到两吨,详解福田领航S1小卡)
东风轻型汽车(“东风轻型车”横空出世 未来无人驾驶车将快递送到家门口)
周口市汽车东站(郑阜高速铁路上的主要客运站——周口东站)
Copyright (c) 2022 玫瑰财经网 版权所有
备案号:冀ICP备17019481号
玫瑰财经网发布此信息的目的在于传播更多信息,与本站立场无关。玫瑰财经网不保证该信息(包含但不限于文字、视频、音频、数据及图表)全部或者部分内容的准确性、真实性、完整性、有效性、及时性、原创性等。
相关信息并未经过本网站证实,不对您构成任何投资建议,据此操作,风险自担。