被盗6.1亿美金,抽丝剥茧还原黑客攻击Poly Network 与O3 Swap现场

之前的明星爆火项目O3想必大家还有印象,不过在一天前崩盘了,O3Swap的池子被盗,因为O3的资金放在poly里,所以poly被黑导致了O3覆灭;8月10日晚,跨链协议Poly Network 遭受攻击,Ethereum、BinanceChain、Polygon3条链上近6亿美元资金被盗。因为两家被攻击的平台背后是同一家技术团队,且有NEO背书,被盗原因是项目方在合约里给自己留有超级权限,黑客利用这个超级权限的后门将池子里的币全部都转走。

LBank蓝贝壳学院这里科普一下,PolyNetwork被曾被认为是当前市场上可落地性最佳的跨链互操作性协议,真正做到异构跨链。目前,已经支持的异构跨链协议包括:Bitcoin、Ethereum、NEO、Ontology、Elornd、Ziliqa、币安智能链、Switcheo、火币生态链等。

回顾事件:

攻击最早发生于8月10日17:55,黑客在以太坊陆续从Poly Network智能合约转移了9638万个USDC、1032个WBTC等资产,总价值超过2.6亿美元;18:04起,黑客在Polygon从该项目智能合约转移了8508万USDC;18:08起,黑客在BSC从该项目智能合约转移了8760万个USDC、26629个ETH等资产。

这是整个加密历史上涉案金额最大的黑客事件,超过了鼎鼎大名的 Mt.Gox 事件(744408 枚 BTC,当时总价值约 4 亿美元),以及 2018 年的 Coincheck 大案(5.23 亿枚 XEM,当时总价值约 5.34 亿美元)。关于本次事件发生的具体原因,行业安全机构技术团队一直在进行实时监控,追踪漏洞原理和技术细节。

经过分析,攻击者是利用了EthCrossChainManager合约中存在的逻辑缺陷,通过该合约调用EthCrossChainData合约中putCurEpochConPubKeyBytes函数更改Keeper为自有地址,然后使用该地址对提取代币的交易进行签名,从而将LockProxy合约中的大量代币套取出来。

黑客是怎么得手的?

攻击者地址:

BSC:

0x0D6e286A7cfD25E0c01fEe9756765D8033B32C71

ETH:

0xC8a65Fadf0e0dDAf421F28FEAb69Bf6E2E589963

Polygon:

被攻击的合约:

BSC:

A:

0x7ceA671DABFBa880aF6723bDdd6B9f4caA15C87B(EthCrossChainManager)

B:

0x2f7ac9436ba4B548f9582af91CA1Ef02cd2F1f03(LockProxy)

ETH:

C:

0x838bf9E95CB12Dd76a54C9f9D2E3082EAF928270(EthCrossChainManager)

D:

0x250e76987d838a75310c34bf422ea9f1AC4Cc906(LockProxy)

Polygon:

E:

0xABD7f7B89c5fD5D0AEf06165f8173b1b83d7D5c9(EthCrossChainManager)

F:

攻击交易:

BSC:

0x3eba3f1fb50c4cbe76e7cc4dcc14ac7544762a0e785cf22034f175f67c8d3be9

0x50105b6d07b4d738cd11b4b8ae16943bed09c7ce724dc8b171c74155dd496c25

0xd65025a2dd953f529815bd3c669ada635c6001b3cc50e042f9477c7db077b4c9

0xea37b320843f75a8a849fdf13cd357cb64761a848d48a516c3cac5bbd6caaad5

ETH:

0xb1f70464bd95b774c6ce60fc706eb5f9e35cb5f06e6cfe7c17dcda46ffd59581

Polygon:

0x1d260d040f67eb2f3e474418bf85cc50b70101ca2473109fa1bf1e54525a3e01

0xfbe66beaadf82cc51a8739f387415da1f638d0654a28a1532c6333feb2857790

在BSC上,攻击者首先通过传递精心构造的数据调用EthCrossChainManager合约中的verifyHeaderAndExecuteTx(0xd450e04c)函数。由于verifyHeaderAndExecuteTx函数调用了内部函数_executeCrossChainTx,并且在该内部函数中使用用了call调用,攻击者通过精心构造的数据(通过其他漏洞获取了原Keeper签名后的数据)控制了call调用的参数_method,成功的以EthCrossChainManager合约的身份调用了EthCrossChainData合约中putCurEpochConPubKeyBytes函数更改Keeper为自有地址(0xa87fb85a93ca072cd4e5f0d4f178bc831df8a00b)。这一步操作是为了后续能够获得有效Keeper签名后的交易,然后提取合约中的代币。

上述调用攻击者构建的_method实际上并不是putCurEpochConPubKeyBytes,这是因为call调用中只有函数名是用户可控的,参数为固定的数量和类型。攻击者通过构造与putCurEpochConPubKeyBytes具有相同函数签名的f1121318093函数实现了对EthCrossChainData合约中putCurEpochConPubKeyBytes函数的调用。

完成修改Keeper之后,攻击者便可以对任意交易进行签名。攻击者通过多笔有效Keeper(在签名已被攻击者修改为自己的地址)签名后的交易将B合约中ETH、BTCB、BUSD以及USDC代币全部取出。

由于ETH和Polygon与BSC上具有相同的代码和Keeper,攻击者在完成BSC上的攻击之后,将之前构造的数据在ETH和Polygon上进行重放,将ETH和Polygon上Keeper也修改为了自有地址(0xa87fb85a93ca072cd4e5f0d4f178bc831df8a00b)。

然后使用同样的攻击手法,取出了D合约中全部的ETH、USDC、WBTC、UNI、DAI、SHIB、WETH、FEI、USDT和renBTC以及F合约中全部的USDC。

攻击者在Polygon归还101万USDC。Ps:现在一大堆人在打币给黑客地址留言要币因为听说有人要了以后得到13.5个eth

我们需要注意哪些事情?

本次攻击事件主要原因是合约权限管理逻辑存在问题,任意用户都可以调用verifyHeaderAndExecuteTx函数进行交易的执行,并且在其内部进行call调用时,函数名可由用户控制,恶意用户可以通过精心构造数据异常调用部分函数。同时EthCrossChainManager合约具有修改Keeper的权限,正常情况下是通过changeBookKeeper函数进行修改,但在此次攻击中攻击者是通过精心构造的数据通过verifyHeaderAndExecuteTx函数中的call调用成功修改Keeper地址,而Keeper地址又可以对交易进行签名,Defi诞生以来最大损失的攻击事件因此产生。

LBank蓝贝壳学院在此提醒大家,开发者在使用call调用时,尤其需要注意参数为用户可控的情况,一些特殊的合约以及函数需要对权限进行严格控制,避免被异常调用造成不可挽回的损失。