un.Block

Posted on Oct 09, 2021Read on Mirror.xyz

PolyNetwork 被黑

这周黑客攻击了 PolyNetwork,并盗取了有史以来最大的金额,约 6 亿美金。邻近周末的时候,黑客几乎归还了全部资产。

相信读过我们上一期周报的读者对于 PolyNetwork 不会陌生。O3 Swap 跨链部分的实现就得益于 PolyNetwork 这样的跨链桥。本次 O3 Swap 也遭到了黑客攻击的影响。

攻击手法

关于 PolyNetwork 的架构,可以参考*上一期*。

简单的来说,这一次的问题在于黑客成功的让 PolyNetwork 的合约执行了更换管理员(Keeper)的操作。黑客将管理员更换为自己后,从多签钱包中盗取了资金。

具体的来说,这次攻击涉及到两个合约,EthCrossChainDataEthCrossChainManager 。其中 EthCrossChainManagerEthCrossChainData 的管理员。

此次攻击中,核心是 EthCrossChainManager.verifyHeaderAndExecuteTx() 。此函数会验证跨链交易的真实性,并调用内部函数 EthCrossChainManager._executeCrossChainTx() 来执行跨链交易。黑客通过精心构造的数据,使 EthCrossChainManager 执行了更换管理员(Keeper)的交易。

Solidity 通过函数名称哈希的前四位来鉴别函数。

bytes4(keccak256(abi.encodePacked(_method,"(bytes,bytes,uint64)")))

也就是说攻击者可以通过输入不同的 _method 来调整哈希的前四位,直到这四位字符与他想要调用的函数哈希的前四位一致即可。通过这样的哈希碰撞,攻击者使 EthCrossChainManager 执行了更换 管理员(Keeper)的交易。

修复

大部分时候我们读的都是 Farming,代币之类的代码,很少会看跨链的代码。因此这一次安全事件对我们来说是全新的体验,攻击者利用了一个从未被利用过的漏洞思路。这次安全事件揭示了跨链合约对于权限管理的疏忽。我们应该分离重要权限,或者限制用户调用敏感函数。

小插曲

在黑客攻击发生后,有用户在发给黑客的交易中提醒他 Tether 已经冻结了他的 USDT 资产。为此黑客打赏了这名用户 13.37 eth($42k)。在这之后,无数的用户给黑客发送各种消息,希望获得打赏。这名获得打赏的用户或许为了规避风险,将这笔钱尽数捐赠给各个机构。

这名黑客最后归还了盗窃的资产,或许是因变现困难,又或者各个安全公司多多少少从他的蛛丝马迹中推断出了一些关键信息。

相关阅读: