2022年6月27日,据慢雾区消息,XCarnival项目被曝出严重漏洞遭黑客攻击并盗走3,087个ETH。XCarnival是一个ETH链上的NFT借贷项目,目前项目团队正在修复漏洞并承诺会对受影响的用户提供解决方案。慢雾安全团队第一时间介入分析,并将结果分享如下:相关信息
核心合约地址P2Controller:0x34ca24ddcdaf00105a3bf10ba5aae67953178b85XNFT:0x39360AC1239a0b98Cb8076d4135d0F72B7fd9909xToken:0x5417da20aC8157Dd5c07230Cfc2b226fDCFc5663攻击者EOA地址0xb7cbb4d43f1e08327a90b32a8417688c9d0b800a攻击合约地址0xf70F691D30ce23786cfb3a1522CFD76D159AcA8d0x234e4B5FeC50646D1D4868331F29368fa92862380x7B5A2F7cd1cc4eEf1a75d473e1210509C55265d80xc45876C90530cF0EE936c93FDc8991534F8A6962漏洞核心点分析
慢雾:昨日MEV机器人攻击者恶意构造无效区块,建议中继运营者及时升级:金色财经报道,慢雾分析显示,昨日MEV机器人被攻击的问题原因在于即使信标区块不正确,中继仍将有效载荷(payload)返回给提议者,导致了提议者在另一个区块被最终确定之前就能访问区块内容。攻击者利用此问题,恶意构造了无效的区块,使得该区块无法被验证,中继无法进行广播(状态码为202)从而提前获得交易内容。mev-boost-relay昨日已紧急发布新版本缓解此问题,建议中继运营者及时升级中继。
据此前报道,昨日夹击MEV机器人的恶意验证者已被Slash惩罚并踢出验证者队列。[2023/4/4 13:43:37]
1.攻击者通过XNFT合约中的pledgeAndBorrow函数来进行抵押NFT并借出xToken。
慢雾:PREMINT攻击者共窃取约300枚NFT,总计获利约280枚ETH:7月18日消息,慢雾监测数据显示,攻击PREMINT的两个黑客地址一共窃取了大约300枚NFT,卖出后总计获利约280枚ETH。此前报道,黑客在PREMINT网站植入恶意JS文件实施钓鱼攻击,从而盗取用户的NFT等资产。[2022/7/18 2:19:58]
在pledgeInternal函数中转入NFT并生成订单:
慢雾:警惕 Honeyswap 前端被篡改导致 approvals 到恶意地址风险:据慢雾区消息,Honeyswap官方推特发文,Honeyswap 前端错误导致交易到恶意地址 “0xD3888a7E6D6A05c6b031F05DdAF3D3dCaB92FC5B” ,目前官网仍未删除该恶意地址,请立即停止使用Honeyswap进行交易,到revoke.cash排查是否有approvals 交易到恶意地址,避免不必要的损失。[2022/5/10 3:03:22]
2.接着调用withdrawNFT函数提取出质押的NFT,其中首先判断该订单是否被清算状态,如果不是则判断该订单的状态是否为NFT还未被提取且借款金额为0,如果通过即可提取抵押的NFT。
慢雾:Furucombo被盗资金发生异动,多次使用1inch进行兑换:据慢雾MistTrack,2月28日攻击Furucombo的黑客地址(0xb624E2...76B212)于今日发生异动。黑客通过1inch将342 GRO、69 cWBTC、1700万cUSDC兑换成282 ETH,并将147ETH从Compound转入到自己的地址,截至目前该黑客地址余额约170万美元,另一个黑客地址余额为约1200万美元。[2021/3/3 18:12:14]
3.以上为攻击前生成订单的准备操作,接着攻击者开始利用生成的订单直接调用xToken合约中的borrow函数进行借款。
在borrowInternal函数中,会外部调用controller合约中的borrowAllowed函数来判断是否可以借款。
可以看到在borrowAllowed函数会调用orderAllowed函数进行订单相关信息的判断,但是在这两个函数中均没有进行_order.isWithdraw状态的判断。因此攻击者可以利用之前生成的订单来调用XToken的borrow函数来借款,而因为抵押的NFT在之前已经被提出,故攻击者可以不用还款来实现获利。
攻击交易分析
此处仅展示其中一笔攻击交易的细节,其余攻击交易的手法均一致,不再赘述。攻击前准备——生成订单的交易:0x61a6a8936afab47a3f2750e1ea40ac63430a01dd4f53a933e1c25e737dd32b2f1.首先攻击者将NFT转入攻击合约并进行授权,接着调用xNFT合约中的pledgeAndBorrow函数在进行抵押NFT生成订单并借款的操作,此处需要注意一点是该函数可以控制传入的xToken,攻击者传入了自己构造的xToken合约地址,并且让借款数量为0,目的是为了满足后续能成功提出NFT时的不被清算且负债为0的条件。
2.攻击者紧接着调用withdrawNFT函数来进行提取抵押的NFT:
正式攻击交易:0x51cbfd46f21afb44da4fa971f220bd28a14530e1d5da5009cfbdfee012e57e35攻击者调用xToken合约的borrow函数,传入之前生成的订单的orderID,重复了该操作22次,而因为NFT在准备阶段已经提走,估计无需还款以此来获利。
总结
本次漏洞的核心在于借款的时候,没有进行订单中NFT是否被提走的状态的判断,导致攻击者可以在把NFT提走之后再利用之前生成的订单来借款而无需还款,以此来获利。针对此类漏洞,慢雾安全团队建议在进行借款操作时应做好订单状态中是否已经提走抵押品的判断,避免再次出现此类问题。
郑重声明: 本文版权归原作者所有, 转载文章仅为传播更多信息之目的, 如作者信息标记有误, 请第一时间联系我们修改或删除, 多谢。