2022年3月27日,以太坊上的stakingDeFi项目RevestFinance遭到黑客攻击,损失约200万美元。BlockSecTeam团队第一时间介入分析,并在tweeter上向社区分享了我们的分析成果。事实上,就在我们通过tweeter向社区分享我们的分析成果时,我们发现了RevestFinance的TokenVault合约中还存在着一个criticalzero-dayvulnerability。利用该漏洞,攻击者可以用更加简单的方式盗取协议中的资产。于是我们立刻联系了RevestFinance项目方。在确定该漏洞已经被修复后,我们决定向社区分享这篇blog。
0.What'stheRevestFinanceFNFT
RevestFinance是针对DeFi领域中staking的解决方案,用户通过RevestFinance参与的任何DeFi的staking,都可以直接生成一个NFT,即FNFT(FinanceNon-FungibleToken),该NFT代表了这个staking仓位的当前以及未来价值。用户可以通过RevestFinance提供的3个接口和项目进行交互。质押自己的数字资产,mint出相应的FNFT。
?mintTimeLock:用户质押的数字资产在一段时间之后才能被解锁。
?mintValueLock:用户质押的数字资产只有在升值或者贬值到预设数值才能被解锁。
?mintAddressLock:用户质押的数字资产只能被预设的账户解锁。
RevestFinance通过以下3个智能合约完成对用户存入的数字资产的锁定和解锁。
?FNFTHandler:继承自ERC-1155token(openzepplin实现)。每次执行lock操作时,fnftId会进行自增(fnftId类似于ERC721中的tokenId)。FNFT在被创建时,用户需要指定它的totalSupply。当用户想要提走FNFT背后的underlyingasset,需要burn掉相应比例的FNTF。
加密审计公司Spearbit筹集700万美元:金色财经报道,加密审计初创公司在Framework Ventures领投的一轮融资中筹集了700万美元,参与方包括Nascent、1kx、Volt Capital、Breed VC和Robot Ventures。公司联合创始人SpencerMacDonald表示,这笔资金将用于建设Cantina(为web3安全审核员提供的开放市场),并聘请更多软件工程师来实现服务和产品市场工作流程的自动化。
该初创公司此前于2021年底筹集了150万美元的种子前融资,目前筹集的总资本达到850万美元。这家初创公司没有透露估值,但PitchBook数据显示该公司的投后估值约为4800万美元。[2023/8/10 16:18:37]
?LockManage:记录FNFT被解锁(unlock)的条件。
?TokenVault:接收和发送用户存入的underlyingasset,并记录每一种FNFT的metadata。例如fnftId=1的FNFT背后质押的资产类型。
因为此次攻击,黑客攻击的入口是mintAddressLock函数,那么我们以该函数为例,讲述FNFT的生命周期。
UserA调用Revest的mintAddressLock函数
?unlocker:UserX->只有UserX可以解锁这笔资产?recipients:?quantities:->mint数量为100(sum(quantities)),UserA,UserB,UserC各拥有50,25,25枚。?asset:WETH->mint出的FNFT以WETH为抵押品。?depositAmount:1e18->每一枚FNFT背后的抵押品数量为1枚WETH(WETHdecimal为18)
美国IRS正在调查涉嫌从波多黎各税收优惠中非法获益的加密交易人员:7月13日消息,美国联邦税务局(IRS)正在调查涉嫌从波多黎各税收优惠中非法获益的加密交易人员。据此前彭博社报道,这些人可能谎报了自己的居住性质和收入等关键因素,不公平地利用税收优惠。
据悉,自波多黎各在2012年推出新税收政策以来,超过5000名美国人移居该国,以节省联邦所得税。波多黎各税收政策给予个人100%股息免税,60%市政税免税,而该地区获得来源收入联邦税为零。为获得减税资格,新居民必须能够证明他们每年至少在岛上居住183天。[2023/7/13 10:51:40]
假设当前系统中没有其他FNFT,UserA通过mintAddressLock与系统进行交互,FNFTHandler返回的fnftId=1
LockManger为其添加相应的记录
?fnftId:1?unlocker:UserX
TokenVault为其添加相应的记录
?fnftId:1?asset:WETH?depoistAmount:1e18
接着TokenValut要从UserA这里转走100*1e18数量的WETH。
最后系统分别给UserA,UserB,UserCmint50,25,25枚01-FNFT。
通过mintAddressLock函数铸造FNFT就完成了。
当UserX解锁01-FNFT后,用户B便可以通过withdrawFNFT提走underlyingasset。如图二所示,UserB想要提取自己手中持有的25个01-FNFT质押的数字资产。
协议首先检查01-FNTF是否已经unlock,如果已经unlock,那么协议会burn掉UserB的25个01-FNFT,并给他转25*1e18数量的WETH。此时01-FNFT的totalSupply为75。
客户关系管理平台Salesforce扩展其客户服务:金色财经报道,客户关系管理 (CRM) 平台 Salesforce 周三表示,它正在扩展其客户服务,并包括对NFT 忠诚度计划的管理。根据其网站,其构成Salesforce Web3的产品套件将帮助公司构建、管理 NFT 并将其集成到他们的业务中。新平台还将通过其客户服务产品 Customer360 支持 Web3 技术。
此外,Salesforce Web3 正在推出 Web3 Connect,这是一种 API 集成,可以让客户在利用这些新技术时深入了解 Web2 和 Web3 的客户体验。Salesforce 还发布了 NFT Management,该平台允许公司通过 Salesforce 界面创建和监控其 NFT 集合和区块链数据。Salesforce 表示,它去年开始测试 Web3 技术,并在测试阶段成功执行了 275,000 笔交易。威士忌制造商 Crown Royal、玩具经销商 Mattel 和时装公司 Scotch and Soda 等公司都使用自己的 Web3 技术测试了 Salesforce 的技术。[2023/3/16 13:06:51]
Revest合约还提供了另外一个接口,叫做depositAdditionalToFNFT,以便让用户为一个已经存在的FNFT添加更多的underlyingasset。下面我们用2张图描述它的“正常”用法。
这里有三种情况
一.quantity==01-FNFT.totalSupply()如图三所示
以图二中的场景为上下文,UserA要为01-FNFT添加更多的抵押物。
?quantity=75->为75个01-FNFT追加质押。
?amount=0.5*1e18->每一枚01-FNFT追加0.5*1e18数量的WETH。
Gemini总裁:退还资金是我们的首要任务:金色财经报道,加密交易所Gemini总裁兼首席执行官Cameron Winklevoss在社交媒体上称,2022 年 12 月 3 日,Gemini公司与其他债权人组成了一个债权人委员会,以协调努力,共同倡导解决问题。Kirkland & Ellis已被债权人委员会聘为顾问,代表其进行宣传。归还您的资金是我们的首要任务,我们正以最紧迫的方式运作。为了安抚律师,我必须澄清,每当 Gemini 被提及与Earn用户相关时,它都是代表他们行事的代理人。
金色财经报道,知情人士称,Genesis已披露的债务总额达18亿美元,或将继续增长。[2022/12/6 21:24:23]
于是UserA需要向TokenVault转入37.5*1e18WETHTokenVault修改系统记账,将depositAmount修改为1.5*1e18。现在每一枚01-FNFT承载的资产为1.5*1e18WETH。
此时UserC调用withdrawFNFT,burn掉他持有的25枚01-FNFT,他可以拿走25*(1.5*1e18)=37.5*1e18WETH。
于是,此时01-FNFT的totalSupply为50。
二.quantity<01-FNFT.totalSupply()如图四所示
以图三中的场景为上下文,UserA继续为01-FNFT添加更多的抵押物。
?quantity=10->为10枚01-FNFT追加质押。?amount=0.5*1e18->为10枚01-FNFT每一枚追加0.5*1e18WETH
由于quantity<01-FNFT.totalSupply()于是,UserA向协议支付5*1e18WETH系统将会burn掉10枚01-FNFT,mint出10枚02-FNFT,并将burn掉的10枚01-FNFT承载的资产和UserA新转入的资产,注入到02-FNFT中。于是就有
外媒披露NBA球星凯德·坎宁安曾于去年与BlockFi签署合作协议:11月16日消息,据外媒报道,去年,NBA顶级选秀明星、底特律活塞队的凯德·坎宁安(Cade Cunningham)与BlockFi签署了一项协议,签约奖金的100%都是比特币。
据此前媒体报道,作为协议的一部分,坎宁安将与BlockFi合作制作教育视频,同时参与促销赠品和独家采访。坎宁安的年薪约为1000万美元,但不清楚他会通过与BlockFi的合作获得多少加密货币收入。
此前11月11日消息,BlockFi宣布因FTX事件导致公司无法照常营业,暂停提款服务。今日早些时候消息,华尔街日报报道称BlockFi计划申请破产保护。(Front Office Sports)[2022/11/16 13:12:04]
?fnftId:2?asset:WETH?depositAmount:2.0*1e18(1.5*1e18+0.5*1e18)
此时
?01-FNFT.totalSupply:4001-FNFT.depositAmount:1.5*1e18?02-FNFT.totalSupply:1002-FNFT.depositAmount:2.0*1e18
三.quantity>01-FNFT.totalSupply()
这种情况,交易会revert。
1.What'ttheRe-entrancyvulnerability
在理解了mintAddressLock函数和depositAdditionalToFNFT函数的基本工作流程后,来看一下攻击者使用的重入手法。假定thelastestfnftId=1
如图五所示第一步:攻击者调用mintAddressLock函数
?depositAmount=0
?quantities=
mint出了2枚01-FNFT,由于攻击者将depositAmount设置为0,因此他没有转入任何数字资产。相当于01-FNFT背后承载的underlyingasset为0。
第二步:攻击者再次调用mintAddressLock函数
?depositAmount=0
?quantities=准备mint36w枚02-FNFTdepositAmount为0。
在mint的最后一步,攻击者利用ERC-1155的call-back机制重入了depositAdditionalToFNFT函数。
在depositAdditionalToFNFT中,攻击者传入
?quantity=1
?amount=1*1e18
?fnftId=1
因为quantity<fntfId.totalSupply(),因此协议会burn掉攻击者1枚01-FNFT,铸造1枚02-FNFT。(02-FNFT在协议中已经存在,但是fnftId更新延迟)然后修改fnftId=2的depositAmount为amount。相信你已经发现,这一步,攻击者通过重入将fnftId=2的depositAmount从0修改为1.0*1e18,仅仅花费1*1e18RENA就获得了(360000+1)*1*1e18RENA的系统记账。
最后攻击者调用withdrawNFNFT函数,burn掉360,001枚02-FNFT,取走了360,001*1e18RENA。
建议修复方法
2.theNewZero-dayVulnerability
在blockSecTeam团队分析RevestFinance的代码时,handleMultipleDeposits函数引起了我们的注意。
当用户调用depositAdditionToNFT函数追加抵押物时,该函数会改变FNFT的depositAmount。从代码中我们可以发现,当newFNFTId!=0时,该函数既改变了fnftId对应的FNFT的depositAmount也改变了newFNFTId对应的depositAmount。
按照常理,当newFNFTId!=0时,系统应该只记录newNFTId对应的depositAmount。不应该改变fnftId对应的depositAmount。
我们认为这是一个非常严重的逻辑bug,利用该漏洞,攻击者可以很轻松提走系统中的数字资产。下面用3张图描述模拟攻击的原理。假定thelatestfnftId=1
首先攻击者调用mintAddressLock函数,mint出360000个01-FNFT。攻击者将amount设置为0因此他不必转入任何资产到RevestFinance协议中。mint结束后,攻击者拥有360000枚depositAmount=0的01-FNFT。
然后攻击者调用depositAdditionalToFNFT函数,参数如下
?fnftId=1
?amount=1*1e18
?quantity=1
协议转走攻击者amount*quantity数量的代币,即1*1e18RENA协议会burn掉攻击者1枚01-FNFT,并为其铸造一枚02-FNFT按照handleMultipleDeposits函数中的逻辑,fnftId=2的资产,其depositAmount会被设置为1.0*1e18。但是fnftId=1的资产,其depositAmount也会被设置为1.0*1e18,而这个值本应该为0!
第三步,攻击者直接提款,将手中所有的01-FNFT提现。不考虑gas费,他将净赚359,999*1e18数量的REAN代币。
很显然,使用这种方式进行攻击,比真实的重入攻击更加简单直接。
建议修复方法
针对该漏洞,blockSecTeam团队给出了相应的patch方法。
3.项目方的修复方式
由于TokenVaultandFNFTHandler两个漏洞合约存储了许多关键的状态,无法在短时间内重新部署它们,为了快速恢复使用,RevestFinance官方重新部署了Revest合约(https://etherscan.io/address/0x36c2732f1b2ed69cf17133ab01f2876b614a2f27#code)的精简版本。该版本关闭了大部分复杂的功能,以避免被进一步攻击。项目方将在未来迁移状态并重新部署修复过的合约。
4.总结
提升DeFi项目的安全性不是一件容易的事情。除了代码审计,我们认为社区应该采取更加主动的方式,例如项目监控预警、甚至是攻击阻断使得DeFi社区更加安全。(https://mp.weixin.qq.com/s/o41Da2PJtu7LEcam9eyCeQ).
参考文献
*:https://blocksecteam.medium.com/revest-finance-vulnerabilities-more-than-re-entrancy-1609957b742f
MantaNetwork与Axelar近期宣布了跨链合作,MantaNetwork将通过Axelar跨链桥为其Layer1隐私网络引入更多生态资产.
1900/1/1 0:00:00据区块链浏览器TRONSCAN数据,过去二十三周,TRX连续处于通缩状态,通缩量达3.09亿枚TRX.
1900/1/1 0:00:00SupraOracles与Hypersign合作,这是一种去中心化数字身份协议,可将Web2.0客户的用例扩展到Web3.0时代.
1900/1/1 0:00:00Polkadot生态研究院出品,必属精品背景或许我们很难想象随着元宇宙、区块链和Web3的火热,越来越多的投资机构和创业者开始加入到了这场浪潮中.
1900/1/1 0:00:00一、上周行业动态上周加密市场继续呈回撤态势,地缘局势持续紧张,欧美股市遭遇大跌,并且由于俄罗斯宣布接收比特币作为能源支付手段,伴随而来的便是美国加紧对加密市场进行监管.
1900/1/1 0:00:00据官方消息,为保护整个区块链行业和加密市场,波场联合储备继续大力度增持储备金。5月12日,波联储官方宣布,已先后买入1000枚BTC、1,467,612,695枚TRX及100,000,000枚.
1900/1/1 0:00:00