被黑 6.1 亿美金的 Poly Network 事件分析与疑难问答( 二 )


被黑 6.1 亿美金的 Poly Network 事件分析与疑难问答
文章图片
被黑 6.1 亿美金的 Poly Network 事件分析与疑难问答
文章图片
签名验证后会通过ECCUtils.merkleProve进行默克尔根验证 , 只要是正常跨链操作即可通过此项检查 。 随后会对交易是否重复发送进行检查并存储已验证后的数据 。 这里只需保证不重复提交即可 。
最后 , 也是最关键的一步 , 其将通过内部调用_executeCrossChainTx函数执行构造的数据 。 _
_
被黑 6.1 亿美金的 Poly Network 事件分析与疑难问答
文章图片
从上图我们可以看出_executeCrossChainTx函数未对传入的_toContract、_method等参数进行检查就直接以_toContract.call的方式执行交易 。
其中通过链上数据我们可以看出EthCrossChainData合约的owner即为EthCrossChainManager合约 , 而先前我们知道中继链验证人(即Keeper)的公钥存在EthCrossChainData合约中 , 且此合约存在putCurEpochConPubKeyBytes函数可以直接修改Keeper公钥 。
经过以上分析 , 结果已经很明确了 , 攻击者只需在其他链通过crossChain正常发起跨链操作的交易 , 此交易目的是为了调用EthCrossChainData合约的putCurEpochConPubKeyBytes函数以修改Keeper角色 。 随后通过正常的跨链流程 , Keeper会解析用户请求的目标合约以及调用参数 , 构造出一个新的交易提交到以太坊上 。 这本质上也只是一笔正常的跨链操作 , 因此可以直接通过Keeper检查与默克尔根检查 。 最后成功执行修改Keeper的操作 。
但我们注意到putCurEpochStartHeight函数定义为
被黑 6.1 亿美金的 Poly Network 事件分析与疑难问答】functionputCurEpochConPubKeyBytes(bytescalldatacurEpochPkBytes)externalreturns(bool);
而_executeCrossChainTx函数执行的定义为
abi.encodePacked(bytes4(keccak256(abi.encodePacked(_method,''(bytes,bytes,uint64)'')))
我们可以知道这两个函数的函数签名在正常情况下传入的_method为putCurEpochStartHeight肯定是完全不同的 , 因此通过_toContract.call理论上是无法调用到putCurEpochStartHeight函数的 。 但_method是攻击者可以控制的 , 其完全可以通过枚举各个字符组合以获得与调用putCurEpochConPubKeyBytes函数相同的函数签名 , 这要求其只需枚举前4个字节符合即可 。 我们也可以自己尝试枚举验证 , 如下所示:
被黑 6.1 亿美金的 Poly Network 事件分析与疑难问答
文章图片
被黑 6.1 亿美金的 Poly Network 事件分析与疑难问答
文章图片
可以看出前四个字节与putCurEpochConPubKeyBytes函数是一致的
至此我们就已还原出攻击者的攻击细节 。
通过解析链上数据 , 我们可以发现攻击者将Keeper替换为了
0xA87fB85A93Ca072Cd4e5F0D4f178Bc831Df8a00B 。
被黑 6.1 亿美金的 Poly Network 事件分析与疑难问答
文章图片
最后攻击者只需使用替换后的Keeper地址进行签名即可通过所有检查执行调用LockProxy合约将其管理的资产转出 。
攻击流程
1、攻击者在源链精心构造一笔修改目标链Keeper的操作 。
2、利用官方Relayer正常在目标链提交数据并执行替换Keeper操作 。
3、攻击者通过替换后的Keeper地址对其转出资产的操作进行签名提交至EthCrossChainManager进行验证 。
4、验证Keeper为攻击者已替换完的地址通过检查 , 执行将资产转移至攻击者指定地址 。
5、获利走人 。
MistTrack分析过程
慢雾AML团队分析统计 , 本次攻击损失共计超6.1亿美元!
具体如下:
被黑 6.1 亿美金的 Poly Network 事件分析与疑难问答
文章图片
资金流向分析
慢雾AML旗下MistTrack反洗钱追踪系统分析发现 , 攻击者初始的资金来源是门罗币(XMR) 。