最近,PolyNetwork
遭到黑客攻击,导致数百万美元被耗尽。
保利团队说:
黑客利用了合同呼叫之间的漏洞,攻击不是由传闻中的单一守门员造成的。
我想知道是怎么做的。稳固代码中的漏洞是什么。
=>之前是否有可靠的处理机制或某种批准机制来防止这一攻击?
保利网络遭到重大黑客攻击,总共有6.1亿美元的密码货币被盗。
发布于 2021-08-16 07:46:47
以下摘自这两个来源:
基本上,保利有一份合同,负责核实它是否通过正确的帐户与之沟通。这是一个白名单,一个地址列表,这些地址被批准向系统发送关于不同链上txs状态的消息。这个合同叫做EthCrossChainData
,我们称之为Data
。如果你能把你的地址添加到这个白名单中,那么你就可以告诉保利你喜欢什么,它就会相信你。例如,你可以告诉保利,保利的所有资产现在实际上都是你的,因为你做了相关的交易,把资金锁定在其他链上,网络就会相信你。
黑客就是这么做的。但是怎么做呢?
Data
合同属于另一个合同:EthCrossChainManager
合同,我们称之为Manager
合同。Manager
的部分目的是执行来自其他链的调用,这意味着它具有执行一些任意代码的功能,在这种情况下,它的开放度也比应该的高一些--特别是,来自另一个链的任何人都可以调用一个名为verifyHeaderAndExecuteTx
的函数,该函数可以调用其他的Poly契约。还记得Manager
是Data
的所有者吗?这意味着,如果黑客能够想出如何创建一个有效负载,而Manager
契约将解释为它应该将黑客添加到Data
合同的白名单中,那么它就会这样做。
我相信你知道,黑客就是这么做的。但事实要复杂得多。verifyHeaderAndExecuteTx
只执行与_method, "(bytes,bytes,uint64)"
的函数签名一致的代码--函数签名是函数名称和参数的keccak256哈希的前4个字节(您可以在称为“函数签名”一节的这优秀文章中更多地了解这一点)。这可能有助于阻止函数调用任何其他函数,但由于_method
是用户生成的,黑客所要做的就是想办法在其中放置一些任意值,从而使keccak256哈希的前4个字节符合他们想要的目标有效负载。(换句话说,它们不需要哈希冲突,因为函数选择器只使用前四个字节,而碰撞四个字节并不难。)
一旦他们能够构建一个与函数签名相冲突的有效载荷,以便将自己添加到白名单中,他们就会将自己添加到所有可能的链上,并耗尽所有的资金。
发布于 2021-08-18 09:09:06
契约执行桥接任意(用户定义的)调用,代表用户拥有锁定(桥接)令牌库智能合同。黑客桥接假电话,使这一智能合同,添加黑客的公钥到令牌库智能合同。
任意(用户定义的)调用功能应该被提取出来,以分离smart契约,后者既没有平衡,也没有所有权。
https://ethereum.stackexchange.com/questions/106943
复制相似问题