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质押时间对领取奖励的影响;
- 建议质押之后借款时应检查多个条件是否满足。