慢雾:XCarnival NFT借贷协议漏洞分析_ROW:XTOKEN

原文作者:九九,慢雾安全团队

2022年6月27日,据慢雾区消息,XCarnival项目被曝出严重漏洞遭黑客攻击并盗走3,087个ETH。XCarnival是一个ETH链上的NFT借贷项目,目前项目团队正在修复漏洞并承诺会对受影响的用户提供解决方案。慢雾安全团队第一时间介入分析,并将结果分享如下:

相关信息

核心合约地址

P2Controller:

0x34ca24ddcdaf00105a3bf10ba5aae67953178b85

XNFT:

0x39360AC1239a0b98Cb8076d4135d0F72B7fd9909

xToken:

0x5417da20aC8157Dd5c07230Cfc2b226fDCFc5663

慢雾:NEXT空投领取资格检查通过默克尔证明进行,没有资格领取空投的用户无法绕过检查领取他人空投:金色财经报道,据慢雾区情报,有部分账户的NEXT代币被claim到非预期的地址,慢雾安全团队跟进分析后分享简析如下:

用户可以通过NEXTDistributor合约的claimBySignature函数领取NEXT代币。其中存在recipient与beneficiary角色,recipient角色用于接收claim的NEXT代币,beneficiary角色是有资格领取NEXT代币的地址,其在Connext协议公布空投资格时就已经确定。

在用户进行NEXT代币claim时,合约会进行两次检查:一是检查beneficiary角色的签名,二是检查beneficiary角色是否有资格领取空投。在进行第一次检查时其会检查用户传入的recipient是否是由beneficiary角色进行签名,因此随意传入recipient地址在未经过beneficiary签名的情况下是无法通过检查的。如果指定一个beneficiary地址进行构造签名即使可以通过签名检查,但却无法通过第二个对空投领取资格的检查。

空投领取资格检查是通过默克尔证明进行检查的,其证明应由Connext协议官方生成,因此没有资格领取空投的用户是无法绕过检查领取他人的空投的。[2023/9/5 13:19:43]

攻击者EOA地址

慢雾:昨日MEV机器人攻击者恶意构造无效区块,建议中继运营者及时升级:金色财经报道,慢雾分析显示,昨日MEV机器人被攻击的问题原因在于即使信标区块不正确,中继仍将有效载荷(payload)返回给提议者,导致了提议者在另一个区块被最终确定之前就能访问区块内容。攻击者利用此问题,恶意构造了无效的区块,使得该区块无法被验证,中继无法进行广播(状态码为202)从而提前获得交易内容。mev-boost-relay昨日已紧急发布新版本缓解此问题,建议中继运营者及时升级中继。

据此前报道,昨日夹击MEV机器人的恶意验证者已被Slash惩罚并踢出验证者队列。[2023/4/4 13:43:37]

0xb7cbb4d43f1e08327a90b32a8417688c9d0b800a

攻击合约地址

0xf70F691D30ce23786cfb3a1522CFD76D159AcA8d

慢雾:Equalizer Finance被黑主要在于FlashLoanProvider合约与Vault合约不兼容:据慢雾区消息,6 月 7 日,Equalizer Finance 遭受闪电贷攻击。慢雾安全团队以简讯形式将攻击原理分享如下:

1. Equalizer Finance 存在 FlashLoanProvider 与 Vault 合约,FlashLoanProvider 合约提供闪电贷服务,用户通过调用 flashLoan 函数即可通过 FlashLoanProvider 合约从 Vault 合约中借取资金,Vault 合约的资金来源于用户提供的流动性。

2. 用户可以通过 Vault 合约的 provideLiquidity/removeLiquidity 函数进行流动性提供/移除,流动性提供获得的凭证与流动性移除获得的资金都受 Vault 合约中的流动性余额与流动性凭证总供应量的比值影响。

3. 以 WBNB Vault 为例攻击者首先从 PancekeSwap 闪电贷借出 WBNB

4. 通过 FlashLoanProvider 合约进行二次 WBNB 闪电贷操作,FlashLoanProvider 会先将 WBNB Vault 合约中 WBNB 流动性转给攻击者,随后进行闪电贷回调。

5. 攻击者在二次闪电贷回调中,向 WBNB Vault 提供流动性,由于此时 WBNB Vault 中的流动性已经借出一部分给攻击者,因此流动性余额少于预期,则攻击者所能获取的流动性凭证将多于预期。

6. 攻击者先归还二次闪电贷,然后从 WBNB Vault 中移除流动性,此时由于 WBNB Vault 中的流动性已恢复正常,因此攻击者使用添加流动性获得凭证所取出的流动性数量将多于预期。

7. 攻击者通过以上方式攻击了在各个链上的 Vault 合约,耗尽了 Equalizer Finance 的流动性。

此次攻击的主要原因在于 Equalizer Finance 协议的 FlashLoanProvider 合约与 Vault 合约不兼容。慢雾安全团队建议协议在进行实际实现时应充分考虑各个模块间的兼容性。[2022/6/8 4:09:22]

0x234e4B5FeC50646D1D4868331F29368fa9286238

声音 | 慢雾:使用中心化数字货币交易所及钱包的用户注意撞库攻击:据慢雾消息,近日,注意到撞库攻击导致用户数字货币被盗的情况,具体原因在于用户重复使用了已泄露的密码或密码通过撞库攻击的“密码生成基本算法”可以被轻易猜测,同时用户在这些中心化服务里并未开启双因素认证。分析认为,被盗用户之所以没开启双因素认证是以为设置了独立的资金密码就很安全,但实际上依赖密码的认证体系本身就不是个足够靠谱的安全体系,且各大中心化数字货币交易所及钱包在用户账号风控体系的策略不一定都一致,这种不一致可能导致用户由于“惯性思维”而出现安全问题。[2019/3/10]

0x7B5A2F7cd1cc4eEf1a75d473e1210509C55265d8

0xc45876C90530cF0EE936c93FDc8991534F8A6962

漏洞核心点分析

1.攻击者通过XNFT合约中的pledgeAndBorrow函数来进行抵押NFT并借出xToken。

在pledgeInternal函数中转入NFT并生成订单:

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提走之后再利用之前生成的订单来借款而无需还款,以此来获利。针对此类漏洞,慢雾安全团队建议在进行借款操作时应做好订单状态中是否已经提走抵押品的判断,避免再次出现此类问题。

来源:金色财经

郑重声明: 本文版权归原作者所有, 转载文章仅为传播更多信息之目的, 如作者信息标记有误, 请第一时间联系我们修改或删除, 多谢。

金智博客

[0:0ms0-3:300ms