摘要: 慢雾认为,攻击主要在于 EthCrossChainData 合约的 keeper 被修改,而非私钥泄漏导致。目前,黑客已开始陆续归还资金。
作者:慢雾安全小组
2021年8月10日,根据来自慢雾区的消息,跨链互操作协议聚网遭到黑客攻击。慢雾安全团队第一时间介入分析,分享分析结果如下。
攻击背景
聚网是由Neo、Ontology和Switcheo基金会作为创始成员,分布式技术作为技术提供者共同发起的跨链组织。
如下图所示,通过官方的介绍,我们可以清楚的看到聚链网的架构设计:用户可以在源链上发起跨链交易,交易确认后,源链中继器将块头信息同步到聚链,然后聚链将块头信息同步到目标链中继器,目标链中继器将验证信息传递到目标链,然后在目标链中验证块头,执行用户期望的交易。
以下是此次攻击涉及的具体地址:
攻击核心源链未对发起的跨链操作的数据进行检查。目标链未对解析出的目标调用合约以及调用参数进行检查。EthCrossChainData 合约的 owner 为 EthCrossChainManager。bytes4(keccak256(abi.encodePacked(_method, “(bytes,bytes,uint64)”))) 可以被 hash 碰撞。攻击细节
聚链网会在每个链上部署智能合约进行跨链互通(分析会以以太坊部署的智能合约为例),其中EthCrossChainManager合约用于验证聚链同步的块头,以确认跨链信息的真实性。EthCrossChainData契约用于存储跨链数据,中继链验证者(Keeper)的公钥也存储在该契约中。锁用于资产管理。
在这次攻击中,攻击者分两步完成了攻击。接下来,我们将进行详细的分析:
首先,攻击者通过调用跨链函数在其他链中构造数据来发起跨链事务。
我们切入这个函数进行分析:
ethcrossschainmanager . cross chain
从上图我们可以清楚的看到,这个函数只是用来帮助用户构造makeTxParam,并存储构造好的hash,以备后续验证。它对用户传入的跨链操作参数没有任何限制,所以攻击者完全可以通过构造他想要的任何数据,让中继将其同步到Poly Chain毫无戒备,并通过Poly Chain将其同步到以太坊中继。
然后以太坊上的Relayer调用EthCrossChainManager contract。
verifyHeaderAndExecuteTx函数提交块头信息,以验证此跨链信息的真实性。
我们切入这个函数进行分析:
ethcrossschainmanager . verifyheaderandexecutetx
通过上面的代码,我们可以看到,它先反序列化块头,找出需要验证的具体信息。然后调用getCurEpochConPubKeyBytes函数从EthCrossChainData契约中获取Keeper公钥,通过deserializeKeepers函数获取Keeper地址。
接下来我们会通过ECCUtils.verifySig来验证签名是否为保管人从下面的代码中我们可以发现,在verifySig函数中会裁剪出签名人的v r s,通过ecrecover接口获取签名人地址,然后调用containMAddresses函数循环比较签名人是否为保管人。只要保管员签名数量符合要求,就可以通过检验,数量要求是从EthCrossChainManager合约导入的n-(n-1)/3)。
签名验证后会通过 ECCUtils.merkleProve 进行默克尔根验证,只要是正常跨链操作即可通过此项检查。随后会对交易是否重复发送进行检查并存储已验证后的数据。这里只需保证不重复提交即可。签名验证后,会被ECCUtils.merkleProve验证,只要是正常的跨链操作都可以通过这个检查。然后检查交易是否重复发送,并存储验证过的数据。在这里,只要确保不重复提交即可。
最后,最关键的一步是通过内部调用_ executeCrossChainTx函数来执行构造的数据。
从上图我们可以看到_ executeCrossChainTx函数在没有检查_toContract和_method等传入参数的情况下,直接将事务作为_toContract.call执行。
根据链中的数据,我们可以看到EthCrossChainData契约的所有者是EthCrossChainManager契约。之前我们知道中继链验证者(也就是保管者)的公钥存在于EthCrossChainData契约中,这个契约有putCurEpochConPubKeyBytes函数,可以直接修改保管者的公钥。
经过上面的分析,结果是清楚的。攻击者只需要通过crossChain在其他链中发起跨链交易。此事务的目的是调用EthCrossChainData契约的putCurEpochConPubKeyBytes函数来修改Keeper角色。然后通过正常的跨链流程,Keeper会分析用户请求的目标合约和调用参数,构造一个新的交易,提交给以太坊。本质上这只是一个正常的跨链操作,可以直接被Keeper和Merkel root检查。最后,修改Keeper的操作成功执行。
但是我们注意到putCurEpochStartHeight函数被定义为
函数putCurEpochConPubKeyBytes(bytes calldata curepochkbytes)外部返回(bool);
而_ executeCrossChainTx函数执行的定义是
ABI . encodepacked(bytes 4(ke ccak 256(ABI . encodepacked(_ method,“(bytes,bytes,uint64)”))
我们可以知道,一般情况下传入的_method是putcurepochstarttheight时,这两个函数的函数签名是完全不同的,所以理论上不可能通过_ tocontract.call调用putcurepochstarttheight函数,但是_method可以被攻击者控制,它可以通过枚举每个字符组合获得与调用putCurEpochConPubKeyBytes函数相同的函数签名,这就要求它只需要枚举前4个字节就可以匹配。我们也可以自己尝试枚举验证,如下所示:
可以看出前四个字节与 putCurEpochConPubKeyBytes 函数是一致的可以看出,前四个字节与putCurEpochConPubKeyBytes函数是一致的。
到目前为止,我们已经还原了攻击者的攻击细节。
通过分析链中的数据,可以发现攻击者用0 xa 87 FB 85 a 93 ca 072 CD 4 e 5 f 0d 4 f 178 BC 831 df 8 a 00 b替换了Keeper。
最后,攻击者只需要签署替换后的保管人地址,就可以通过所有检查调用LockProxy契约,将自己管理的资产转出。
攻击流程
攻击者精心构造了一个操作来修改源链中目标链的Keeper。
使用官方中继器正常提交目标链中的数据,并执行替换保管员操作。
攻击者通过替换后的保管员地址对转出资产的操作进行签名,并提交给EthCrossChainManager进行验证。
验证Keeper是攻击者替换的地址。检查后,将资产转移到攻击者指定的地址。
赚了就走。
MistTrack 分析过程
据慢雾反洗钱团队分析统计,此次攻击损失总额超过6.1亿美元!
如下所示:
资金流向分析
慢雾AML下的MistTrack反洗钱追踪系统分析发现,攻击者最初的资金来源是门罗币(XMR)。
然后在交易所换成了BNB/ETH/MATIC等货币,钱分别取到三个地址。不久后,它对三条链发起了攻击。
事件梳理在BSC上:
黑客地址1、黑客近1.2亿美元的流动资金(其中BUSD约3210万,USDC约8760万)已加入曲线分叉项目Ellipsis Finance,目前仍在市场中。
在多边形上:
资金没有变化。
以太坊上:
1)黑客地址3,只有一次将13.37 ETH转移到地址0x F8 b5 c 45 c 6388 c 9 e 12546061786026 aae aa4b 682的交易;
2) Hackers为Curve增加了超过9706万美元的流动性(包括67万戴和9638万)。后来取消了流动性,9638万和67万戴换成了9694万戴。这个基金仍然停留在地址3。目前已有3343万USDT被系绳冻结。
疑难问答
注:eccm是EthCrossChainManager Contract的缩写,eccd是Ethcrosschain Manager Contract的缩写。
问:为什么守护者可以被成功替换?合同代码没有经过认证吗?
答:eccd契约是经过认证的,只允许拥有者调用putCurEpochConPubKeyBytes来更改保管者。因为eccd合同的所有者是eccm,所以可以通过eccm更改保管者值。
问:为什么我可以签约更换门将?
答:因为要跨链执行的数据没有被判定为契约,所以可能是原保管人作为正常的跨链交易签字,但他是替换保管人的交易。
问:为什么可以绕过代码bytes 4(keccak 256(ABI . encode 比特币听证会(比特币听证会上讨论了哪些?会不会崩盘?) packed(_ method,“(Bytes,Bytes,uint64)”)的这个限制,然后执行putcurepochconpubkeybytes(Bytes)函数?
答:函数签名使用KECC CAK-256散列,然后取前4个字节。在这种情况下,很容易被hash击中。
问:黑客更换保管员的交易如何让老保管员签字?
答:keepers是一个链播放器,它会对所有正常用户的跨链请求进行签名。当用户在BSC上发起跨链交易时,keepers会分析用户请求的目标契约和调用参数,构造一个新的交易提交给以太坊,在以太坊上用eccm契约调用用户交易中包含的目标契约。黑客的保管员替换的交易本质上是正常的跨链交易,只不过调用的目标契约是eccd契约,调用的参数是保管员替换,所以可以正常签约。
总结
这种攻击主要在于EthCrossChainData契约的keeper可以被ethcrossschainmanager契约修改,ethcrossschainmanager契约的verifyHeaderAndExecuteTx函数可以执行用户通过_ executeCrossChainTx函数输入的数据。因此,攻击者通过该函数输入精心构造的数据,修改了EthCrossChainData契约的保管人指定的地址。并不是守护者的私钥泄露导致了这次事件。
慢雾AML的MistTrack反洗钱追踪系统会持续监控被盗资金的转移,黑掉所有被攻击者控制的钱包地址,并提醒交易所和钱包注意加强地址监控,避免相关恶意资金流入平台。此外,特别感谢Hoo、聚网、Zlabs、链讯、WePiggy、TokenPocket Wallet、Bibox、欧直云链等团队,以及众多个人合作伙伴,在合规的前提下,及时与慢雾安全团队同步相关攻击者信息,为追踪攻击者赢得了宝贵的时间。
目前,在多方努力下,黑客开始陆续返还资金。
链家仅提供相关信息展示,不构成任何投资建议。