风险提示:理性看待区块链,提高风险意识!
滥用智能合约窃取6亿美元:Poly网络黑客事件的真相
Kraken交易所APP下载 > 滥用智能合约窃取6亿美元:Poly网络黑客事件的真相 2025-10-31 10:15:05
摘要
8 月 10 日,一名黑客通过 Poly Network 窃取了超过 6 亿美元,随后发生了一系列离奇事件。在本文中,Kraken Security Labs 深入探讨了攻击者如何窃取如此巨额资金的技...

8 月 10 日,一名黑客通过 Poly Network 窃取了超过 6 亿美元,随后发生了一系列离奇事件。

在本文中,Kraken Security Labs 深入探讨了攻击者如何窃取如此巨额资金的技术细节,以及 Poly Network 为确保将来不再发生此类漏洞而实施的后续修复措施。 

Poly Network Hack 的机制

Poly Network 允许跨链调用合约:例如,在黑客攻击之前,可以从 Ontology 调用以太坊上任何合约的任何方法

能够调用任何合约上的任何公共方法本身并非坏事——理论上,任何以太坊交易都可以做到这一点。然而,在 Poly Network 上,跨链到以太坊的交易是由一个名为 EthCrossChainManager(管理器)的合约执行的,该合约拥有一些特殊权限。

Manager是另一个名为 EthCrossChainData (简称 Data)的合约的所有者。Data负责管理“金蛋” 也称为“守护者”),这些守护者是管理 Poly Network 钱包的实体(通过其公钥识别)。DataManager开放了更新守护者列表的功能。

攻击者发现,由于所有交易都由Manager执行,他可以更新 Data 中的保管人列表然后,他在 Ontology 上创建了一个跨链交易,该交易会在以太坊上执行,并将他自己(且仅他自己)设置为以太坊上所有 Poly Network 资金的保管人。这赋予了他将所有资金转移到自己钱包所需的权限。

事后,Poly Network 限制了可以通过跨链交易调用的合约和方法,从而防止攻击再次发生。

简化的多路网络

Poly Network 利用所谓的“中继器”在链间转发信息。例如,要执行 Ontology 到以太坊的跨链交易,用户需要与 Ontology 上的 Poly Network 跨链管理合约进行交互。然后,中继器会从智能合约中获取信息并将其发送到以太坊区块链。在两条链之间,Poly Network 链会同步所有参与链的当前区块头。

Poly Network智能合约

以太坊跨链管理器

EthCrossChain Manager是在跨链交易中调用的以太坊合约。它接收传入的交易,对其进行验证,然后执行交易中指定的方法和目标合约。

当中继器将交易传输到以太坊时,它会使用Manager合约。中继器会调用Manager 的 verifyHeaderAndExecuteTx 方法,该方法会验证交易头,确保交易尚未执行,然后使用 _executeCrossChainTx 方法执行交易。

有趣的地方就在这里。跨链交易可以调用任何方法,没有任何限制。可以提供任何方法名称,然后会附加固定的参数列表(bytes,bytes,uint64)

基本上,任何具有签名(bytes,bytes,uint64)的方法都可以被调用。 

例如,要执行kraken(bytes,bytes,uint64)方法,合约会将其转换为 Solidity 方法 ID,即合约中每个方法的 4 字节唯一标识符。

此方法 ID 是通过对方法名称(包括签名)进行 keccak 哈希运算,然后取所得哈希值的前四个字节生成的:

虽然哈希值本身被认为是密码学安全的,但截断哈希值(只获取前四个字节)使其容易受到哈希碰撞攻击。由于我们可以自由选择方法名称,我们可以暴力破解一个字符串,使其生成与另一个方法相同的方法 ID——而且由于只截断了 4 个字节,我们很可能只需要不到 4,294,967,296 次尝试(忽略生日悖论,它可能会使攻击更容易)。

简而言之,我们可以在以太坊上调用任何合约的任何方法,并传入任何参数签名——而这正是 Poly 攻击者所做的。他提供了方法名f1121318093,该方法生成的 ID 为0x41973cd9 。但是,这个方法有什么特别之处呢?

以太坊跨链数据

Poly 攻击者发现Manager (将执行我们的方法调用的合约)也是名为Data 的合约的所有者

管理员掌握着一些非常重要的信息:属于Keeper的公钥,Keeper是管理Poly Network钱包资金的实体。有了Keeper的私钥,Poly黑客就能将资金从Poly Network钱包转移到他自己的钱包。

需要注意的重要一点是,Data包含一个方法,允许合约的所有者Manager替换 Keepers 的公钥。

putCurEpochConPubKeyBytes 的 Solidity 方法 ID 为:

0x41973cd9是攻击者提供的方法名称f1121318093解析到的方法 ID 完全相同

由于Manager被允许执行 putCurEpochConPubKeyBytes 方法,攻击者得以上传自己的公钥,从而完全控制了以太坊资金。

本体交易 f771ba610625d5a37b67d30bf2f8829703540c86ad76542802567caaffff280c中,攻击者执行了从本体网络到以太坊的跨链交易,调用了合约 EthCrossChainData 上名为f1121318093的方法。该方法名随后被转换为 putCurEpochConPubKeyBytes 的 Solidity ID。

通常情况下,`putCurEpochConPubKeyBytes` 作为`Data`的特权方法,任何合约都无法调用它。但由于`Manager`既是 `EthCrossChainData` 的所有者,又是执行跨链调用的上下文,因此 Poly hacker 的调用成功执行。

攻击者通过将自己的公钥作为参数传递给 `putCurEpochConPubKeyBytes` 函数,成为了唯一的守护者,从而完全控制了本体(Ontology)的资金。随后,他将所有以太坊资金转移到了自己的钱包,并对其他网络重复了相同的操作,总共盗取了超过 6.1 亿美元。

Poly Network Fix

攻击发生后,Poly Network 的开发者发布了Manager修复程序。现在,不再允许调用任何合约和方法,而是设置了一个白名单,限制了跨链交易可以执行的操作。

漏洞集合

导致资金遭受灾难性损失的这次攻击,是由少数几个设计决策和漏洞造成的:

  • 数据Manager所有,尽管Manager具有很大的风险敞口,并且用于调用外部提供的智能合约。

  • 这里隐含了一个假设,即只有签名为 (bytes,bytes,uint64) 的方法才能被调用。

  • 管理器能够调用任何合约和任何方法,从而可以访问其拥有的合约上的特权方法。

事后,攻击者决定将所有资金归还给 Poly Network,Poly Network 随后向他提供了一份首席安全顾问的工作。 

Poly Network 攻击揭示了保护智能合约解决方案的重要性,并强调了在开发和实施加密协议时进行严格审计和其他安全测试措施的必要性。

Kraken Security Labs 是一支精英安全研究团队,致力于通过测试常见的第三方产品和服务,与供应商合作修复问题,并向公众普及如何更好地保护自身安全,从而保护和发展加密货币生态系统。了解更多关于Kraken Security Labs 的信息,并始终牢记安全第一的理念。

版权说明:本文章来源于网络信息 ,不作为本网站提供的投资理财建议或其他任何类型的建议。 投资有风险,入市须谨慎。

相关阅读