原文作者:九九,慢雾安全团队
2022年6月27日,据慢雾区消息,XCarnival项目被曝出严重漏洞遭黑客攻击并盗走3,087个ETH。XCarnival是一个ETH链上的NFT借贷项目,目前项目团队正在修复漏洞并承诺会对受影响的用户提供解决方案。慢雾安全团队第一时间介入分析,并将结果分享如下:
相关信息
核心合约地址
P2Controller:
0x34ca24ddcdaf00105a3bf10ba5aae67953178b85
XNFT:
0x39360AC1239a0b98Cb8076d4135d0F72B7fd9909
xToken:
0x5417da20aC8157Dd5c07230Cfc2b226fDCFc5663
贝莱德欲购买BTC期货 灰度创始人向其发起邀请:刚刚,灰度创始人、前首席执行官Barry Silbert发推“Hey Blackrock”,并附图疑似向贝莱德发出投资邀请。今日凌晨消息,全球最大的资产管理公司之一贝莱德(BlackRock)向美国SEC提交的文件显示,其可能将通过旗下部分基金购买比特币期货。[2021/1/21 16:40:24]
攻击者EOA地址
0xb7cbb4d43f1e08327a90b32a8417688c9d0b800a
攻击合约地址
0xf70F691D30ce23786cfb3a1522CFD76D159AcA8d
0x234e4B5FeC50646D1D4868331F29368fa9286238
0x7B5A2F7cd1cc4eEf1a75d473e1210509C55265d8
动态 | 灰度比特币信托基金(GBTC)再次启动私募:灰度投资(Grayscale Investments)今日宣布,将再次启动旗下比特币信托基金(OTCQX:GBTC)份额的私募配售。该信托基金的私募全年定期进行,目前已可供合格投资者每日认购。(GlobeNewsWire)[2020/1/13]
0xc45876C90530cF0EE936c93FDc8991534F8A6962
漏洞核心点分析
1.攻击者通过XNFT合约中的pledgeAndBorrow函数来进行抵押NFT并借出xToken。
在pledgeInternal函数中转入NFT并生成订单:
Polygon联合创始人:Polygon的使命一直是大规模采用Web3:金色财经报道,Polygon 联合创始人 Sandeep Nailwal 表示,基于以太坊的第 2 层区块链Polygon专注于成为主流。Polygon 的使命一直是大规模采用 Web3。实际上在 Web3 空间中构建的人之间一直存在这种冲动,即目前还没有大规模采用 Web3。借助 Polygon,面向消费者的公司可以扩展他们与客户互动和互动的方式。以Reddit为例,一家公司已经利用 Polygon,因为它希望继续扩大其不可替代代币 (NFT) 市场。
Nailwal 说,实现大规模采用最终将归结为 Web3 应用程序可以提供的好处,例如自我保管和数字收藏品的所有权。例如,星巴克的 Odyssey 计划将客户忠诚度奖励与 NFT 以及游戏化元素相结合。[2023/4/4 13:43:09]
声音 | 慢雾:Ghostscript存在多个漏洞:据慢雾区消息,Google Project Zero发布Ghostscript多个漏洞预警,远端攻击者可利用漏洞在目标系统执行任意代码及绕过安全限制。Ghostscript 9.26及更早版本都受影响。软件供应商已提供补丁程序。[2019/1/24]
2.接着调用withdrawNFT函数提取出质押的NFT,其中首先判断该订单是否被清算状态,如果不是则判断该订单的状态是否为NFT还未被提取且借款金额为0,如果通过即可提取抵押的NFT。
3.以上为攻击前生成订单的准备操作,接着攻击者开始利用生成的订单直接调用xToken合约中的borrow函数进行借款。
在borrowInternal函数中,会外部调用controller合约中的borrowAllowed函数来判断是否可以借款。
可以看到在borrowAllowed函数会调用orderAllowed函数进行订单相关信息的判断,但是在这两个函数中均没有进行_order.isWithdraw状态的判断。因此攻击者可以利用之前生成的订单来调用XToken的borrow函数来借款,而因为抵押的NFT在之前已经被提出,故攻击者可以不用还款来实现获利。
攻击交易分析
此处仅展示其中一笔攻击交易的细节,其余攻击交易的手法均一致,不再赘述。
攻击前准备——生成订单的交易:
0x61a6a8936afab47a3f2750e1ea40ac63430a01dd4f53a933e1c25e737dd32b2f
1.首先攻击者将NFT转入攻击合约并进行授权,接着调用xNFT合约中的pledgeAndBorrow函数在进行抵押NFT生成订单并借款的操作,此处需要注意一点是该函数可以控制传入的xToken,攻击者传入了自己构造的xToken合约地址,并且让借款数量为0,目的是为了满足后续能成功提出NFT时的不被清算且负债为0的条件。
2.攻击者紧接着调用withdrawNFT函数来进行提取抵押的NFT:
正式攻击交易:
0x51cbfd46f21afb44da4fa971f220bd28a14530e1d5da5009cfbdfee012e57e35
攻击者调用xToken合约的borrow函数,传入之前生成的订单的orderID,重复了该操作22次,而因为NFT在准备阶段已经提走,估计无需还款以此来获利。
总结
本次漏洞的核心在于借款的时候,没有进行订单中NFT是否被提走的状态的判断,导致攻击者可以在把NFT提走之后再利用之前生成的订单来借款而无需还款,以此来获利。针对此类漏洞,慢雾安全团队建议在进行借款操作时应做好订单状态中是否已经提走抵押品的判断,避免再次出现此类问题。
来源:金色财经
郑重声明: 本文版权归原作者所有, 转载文章仅为传播更多信息之目的, 如作者信息标记有误, 请第一时间联系我们修改或删除, 多谢。