XCarnival遭遇攻击,黑客获利3000余枚ETH事件分析

 

0x1 事件背景

零时科技区块链安全情报平台监控到消息,北京时间 2022年6月26日,NFT借贷协议 XCarnival 遭到黑客攻击,黑客获利3087枚ETH。零时科技安全团队及时对此安全事件进行分析。

 

0x2 攻击信息

  • 攻击者地址

0xb7CBB4d43F1e08327A90B32A8417688C9D0B800a

  • 攻击者合约

0xf70F691D30ce23786cfb3a1522CFD76D159AcA8d

0x3edf976dF38f7d6273884B4066e3689Ef547D816

0x7b5a2f7cd1cc4eef1a75d473e1210509c55265d8

0x234e4B5FeC50646D1D4868331F29368fa9286238

  • 官方合约

XToken 0x5417da20ac8157dd5c07230cfc2b226fdcfc5663

XNFT 0x39360ac1239a0b98cb8076d4135d0f72b7fd9909

P2Controller 0x34ca24ddcdaf00105a3bf10ba5aae67953178b85

 

0x3 攻击步骤

1)通过混币平台 Tornado.Cash 获取初始约资金共 120 枚 ETH。

2)使用 87 枚 ETH 购买 BAYC ,ID 为 5110。

3)部署攻击合约,并将 5110 BAYC 转移给攻击合约,这里以攻击合约0x7b5a2f7cd1cc4eef1a75d473e1210509c55265d8为例。

4)进行NFT质押借贷,调用 XNFT.pledgeAndBorrow方法。

攻击者质押NFT后未进行资金借贷,随后将 NFT 通过 XNFT.withdrawNFT 取出。一笔交易中进行了多次质押借贷和取出NFT的操作,目的为了增加攻击者控制地址对应的 orderId 数量。

5)攻击者通过历史质押过的 orderId 进行借款,将上一步生成的 orderId 逐个进行借款。

6)攻击者将获利资金转移至钱包地址。

 

0x4 漏洞核心

攻击者通过多次质押借贷和取出NFT操作增加了攻击者相关地址和 orderId 的对应性,之后调用Xtoken合约进行借款,由于借款时检查的是攻击者质押的订单id地址,所以攻击者可以通过多次调用借款传入之前的订单id,获取大量借款。

攻击主要调用的方法流程如下:

 

0x5 总结及建议

通过此次攻击事件来看,攻击者主要通过多次质押借贷和取出NFT获取大量和自己地址对应订单id,随后通过多次调用借款方法取出大量资金,由于XNFT合约未对调用者质押借贷时的时间做严格限制,导致攻击者可以多次刷单增加自己质押的订单数量,之后Xtoken合约中,只通过订单id判断是否可以借款,从而使得攻击者完成质押订单后进行了多次借款操作。

安全建议

  • 建议严格限制NFT质押时间,确保不能瞬时取出;
  • 建议严格限制NFT质押时间对领取奖励的影响;
  • 建议质押之后借款时应检查多个条件是否满足。
(完)