2021年8月10日,根据慢雾团队的消息,跨链互操作协议pogon网络遭到黑客攻击。慢雾安全团队立即介入分析,并分享分析结果如下:
攻击背景
Po network是一个跨链组织,由 Neo、Ontology、Switcheo 基金会共同作为创始成员,分布式技术作为技术提供商共同发起。
如下图所示,通过官方介绍,我们可以清楚地看到po network的架构设计:用户可以在源链上发起跨链交易。交易确认后,源链中继将块头信息同步到po-chain,然后po-chain将块头信息同步到目标链中继,目标链中继将验证信息传输到目标链,然后,在目标链中验证块头,并执行用户预期的事务。
以下是此次攻击涉及的具体地址:
攻击核心
1、源链未对发起的跨链操作的数据进行检查。
2、目标链未对解析出的目标调用合约以及调用参数进行检查。
3、ETHCrossChainData 合约的 owner 为 ETHCrossChainManager。
4、 bytes4(keccak256(abi.encodePacked(_mETHod, “(bytes,bytes,uint64)”))) 可以被 hash 碰撞。
攻击细节
Po network将在每条链上部署智能合约,以实现跨链互操作性(分析将以以太坊中部署的智能合约为例)。其中 ETHCrossChainManager 合约用于验证 Po Chain 同步来的区块头以确认跨链信息的真实。ETHCrossChainData 合约用于存储跨链数据,中继链验证人 (即 Keeper) 的公钥也存储在这个合约中。LockProxy 则用于资产管理。
在此攻击中,攻击者分两步完成攻击。接下来,我们将对其进行详细分析:
首先,攻击者通过调用crosschain函数在其他链中构造数据来启动跨链事务。
让我们切入这个函数进行分析:
ETHrosschainmanager.crossChain
( https://github.com/ponetwork/ETH-contracts/blob/master/contracts/core/crosschainmanager/logic/ETHCrossChainManager.SOL#L91 )
从上图中,我们可以清楚地看到,此函数仅用于帮助用户构造maketxparam并存储构造的哈希以供后续验证。它不会对用户传入的跨链操作参数施加任何限制。因此,攻击者可以通过构造任何所需数据,完全使中继同步到多链,通过多链将其同步到以太坊中继。
然后,以太坊上的中继调用ETHcrosschainmanager合同
的VerifyHeaderAndExecutex函数提交块头信息,以验证跨链信息的真实性。
让我们切入这个函数进行分析:
ETHrosschainmanager.verifyheaderandexecutex
( https://github.com/ponetwork/ETH-contracts/blob/master/contracts/core/crosschainmanager/logic/ETHCrossChainManager.SOL#L127 )
通过上面的代码,我们可以看到它首先对块头进行反序列化,以解决要验证的特定信息。然后调用getCurEpochConPubKeyBytes函数从ETHCrossChainData契约获取Keeper公钥,并通过反序列化keepers函数获取Keeper地址。
接下来,我们将通过ECCUtils.verifySig验证签名是否为Keeper。从下面的代码中,我们可以发现verifySig函数会剪切签名者的v r s,通过ecrecover接口获取签名者的地址,然后调用ContainerAddress函数比较签名者是否为Keeper,只要Keeper签名的数量满足要求,我们就可以通过检查。数量要求是由ETHcrosschainmanager合同传入的n-(n-1)/3)。
签名验证后,将通过eccutils.merkleprove进行Merkel根验证。只要是正常的交叉链操作,就可以通过此检查。然后,它将检查事务是否重复发送,并存储已验证的数据。在这里,您只需要确保没有重复提交。
是**一个也是最关键的步骤,将在内部调用。executecrosschaintx函数执行构造的数据_
从上图可以看出,传入的toContract、方法和其他参数没有执行executecrosschaintx函数,直接检查toContract.call执行事务。
从链上的数据中,我们可以看到ETHcrosschaindata合同的所有者是ETHcrosschainmanager合同。之前我们知道ETHcrosschaindata合约中存在中继链验证器(即keeper)的公钥,该合约中存在putcurepochconpubkeybytes函数,可以直接修改keeper公钥。
通过以上分析,很明显攻击者通常只需要通过其他链中的crosschain启动跨链事务。此事务的目的是调用ETHcrosschaindata协定的putcurepochconpubkeybytes函数来修改keeper角色。然后,通过正常的跨链流程,keeper将解析用户请求的目标合同和调用参数,构建一个新事务并提交给以太坊。这本质上只是一个正常的跨链操作,因此可以由keeper和Merkel root直接检查。**,成功执行了修改keeper的操作。
但是,我们注意到putcurepochstartheight函数定义为
函数putCurEpochConPubKeyBytes(bytes calldata curEpochPkBytes)外部返回(bool);
和uuExecuteCrossChainTx函数定义为
abi.encodePacked(字节4(keccak256(abi.encodePacked(u方法,“(字节,字节,uint64)”))
我们可以知道,这两个函数的函数签名是在正常情况下传入的,方法是putcurepochstartheight,它必须是完全不同的,因此传递给Contract。理论上,call不能调用putcurepochstartheight函数。但是u方法可以由攻击者控制。通过枚举各种字符组合,它可以获得与调用putcurepochconpubkeybytes函数相同的函数签名,这要求它只枚举前四个字节。我们也可以自己尝试枚举验证,如下所示:
可以看出,前四个字节与putcurepochconpubkeybytes函数一致
到目前为止,我们已经恢复了攻击者的攻击详细信息。
通过分析链上的数据,我们可以发现攻击者用
0xA87fB85A93Ca072Cd4e5F0D4f178Bc831Df8a00B
**,攻击者只需使用替换的保管人地址签名即可调用lockproxy合同,通过所有检查将其管理的资产转出。
攻击过程
1.攻击者仔细构造一个操作来修改源链中目标链的守护者。
2.使用官方中继正常提交目标链中的数据并执行替换管理员操作。
3.攻击者通过替换的保管人地址签署资产转出操作,并提交给ETHcrosschainmanager进行验证。
4.验证keeper是攻击者已替换的地址。通过检查,将资产转移到攻击者指定的地址。
5.有利可图地离开。
跟踪分析过程
根据慢雾安全团队的分析和统计,此次攻击的总损失超过6.1亿美元!
详情如下:
资本流动分析
慢雾反洗钱Misttrack跟踪系统分析发现,攻击者最初的资金来源是梦露货币(XmR)。
然后在交易所兑换成BNB/ETH/matic和其他货币,并将货币分别提取到三个地址。很快,它对三条锁链发起了攻击。
事件排序
资金情况(截至北京时间8月11日13:00)
BSC 上:
黑客地址1:近1.2亿美元(包括约3210万busds和约8760万USDC)的黑客流动性已添加到曲线分叉项目ellipses finance中。目前,它仍在制造市场,没有任何变化。
POLOGAN上:
资金没有变化。
在以太坊上:
1) 黑客地址3:13.37 ETH中只有一个传输到该地址
0xF8B5C45C6388C9EE12546061786026AEAAA4B682
2) 黑客在 Curve 上添加了超 9706 万美元(包括 67 万枚 DAI 和 9638 万枚 USDC)的流动性。后又撤销流动性将 9638 万枚 USDC 和 67 万枚 DAI 换成 9694 万枚 DAI,这笔资金仍停留在地址 3。目前,3343 万枚 USDT 已被 Tether 冻结。
疑难问答
注:eccm 为 ETHCrossChainManager 合约的简称,eccd 为 ETHCrossChainData 合约的简称。
问:为什么 keeper 能更换成功,合约代码没有进行鉴权吗?
答:eccd 合约有进行鉴权,仅允许 owner 调用 putCurEpochConPubKeyBytes 更改 keeper,因为 eccd 合约的 owner 是 eccm,所以通过 eccm 可以更改 keeper 的值。
问:为什么能签名一笔更换 keeper 的交易?
答:因为跨链要执行的数据没有判断好 toContract,所以可能原先的 keeper 以为是一笔正常的跨链交易就签名了 , 但是他是一笔更换 keeper 的交易。
问:为什么能绕过代码 bytes4(keccak256(abi.encodePacked(_mETHod, “(bytes,bytes,uint64)”))) 的这个限制,然后执行 putCurEpochConPubKeyBytes(bytes) 函数?
答:函数签名用的是 keccak-256 进行哈希,然后取前面的 4bytes,这种情况下是较容易被 hash 碰撞的。
问:黑客更换 keeper 的交易如何被旧的 keepers 签名?
答:keepers 是一个链中继器 (Replayer),会对所有正常用户的跨链请求进行签名。当用户在 BSC 上发起跨链交易时,keepers 会解析用户请求的目标合约以及调用参数,构造出一个新的交易提交到以太坊上,并在以太坊上用 eccm 合约调用用户交易里包含的目标合约。黑客替换 keeper 的交易本质上也是一笔正常的跨链交易,只不过调用的目标合约是 eccd 合约,调用的参数是更换 keeper,所以能被正常签名。
总结
此攻击主要在于ETHcrosschaindata合约的keepers可以通过ETHcrosschainmanager合约修改,ETHcrosschainmanager合约的VerifyHeaderAndExecutex函数可以通过执行用户传入的数据来修改。因此,攻击者通过此函数传入精心构造的数据,并修改ETHcrosschaindata契约保管人为攻击者指定的地址。它不是通过网络传输的。发生此事件的原因是保管人的私钥泄漏。
慢雾的misttrack反洗钱跟踪系统将继续监控被盗资金的转移,屏蔽攻击者控制的所有钱包地址,提醒交易所和钱包加强地址监控,防止相关恶意资金流入平台。此外, 特别感谢虎符 Hoo、Po Network、火币 Zlabs、链闻、WePiggy、TokenPocket 钱包、Bibox、区块链等团队及许多个人伙伴在合规的前提下及时与慢雾安全团队同步相关攻击者信息,为追踪攻击者争取了宝贵的时间。
目前,在多方努力下,黑客开始陆续返还资金。
文章标题:Poly Network黑客攻击事件分析
文章链接:https://www.btchangqing.cn/311214.html
更新时间:2021年08月12日
本站大部分内容均收集于网络,若内容若侵犯到您的权益,请联系我们,我们将第一时间处理。