火星链 火星链
Ctrl+D收藏火星链
首页 > 火必APP > 正文

NFT:一文看懂典型的NFT合约漏洞有哪些?

作者:

时间:1900/1/1 0:00:00

点击阅读:Web3安全连载(1)当硬核黑客开始研究“钓鱼”,你的NFT还安全吗?

欢迎来到Web3安全连载系列,上周,我们刚推送《Web3安全连载(1)当硬核黑客开始研究“钓鱼”,你的NFT还安全吗?》后,就有一位NFT收藏者被盗。

在上篇文章里,我们就说过Web3世界黑客依然猖狂,因此个人的安全防范非常重要,大家可以再次阅读下面这篇文章:

干货 | 钓鱼网站“入侵”Web3,这些防技巧必须学会!

此外,NFT智能合约层面上的漏洞同样值得我们警惕!随着今年一系列NFT智能合约相关安全事件的发生,如:APE Coin空投事件、TreasureDAO安全事件等,让我们必须再次关注NFT领域的智能合约安全。

典型的NFT合约漏洞主要包含两大类,一类是NFT自身的漏洞;一类是NFT平台业务相关漏洞问题。闲话少说,本文我们将对NFT中的这两类合约安全问题进行详细介绍,欢迎来围观。

??PART 01

「NFT自身漏洞问题」

NFT的生命周期通常分为发行、流转、销毁等阶段,其中在发行阶段存在的安全问题最多。NFT的购买通常分为预售、正式发售两种情况。而预售阶段项目方一般会设置能够参与的用户白名单。但是即使进行了设置,但仍然存在各类白名单绕过漏洞的问题。

案例一:APE Coin空投事件?

2022年3月17日,推特用户Will Sheehan发布推文称套利机器人通过闪电贷薅羊毛拿到了超过6万的APE Coin空投。

关于本次攻击事件中,相关信息如下:

攻击交易:

0xeb8c3bebed11e2e4fcd30cbfc2fb3c55c4ca166003c7f7d319e78eaab9747098

孙宇晨从JustLend赎回1.2亿枚USDT并将6000万枚转入币安:金色财经报道,据 Whale Alert 监测,孙宇晨在 10 分钟前从 JustLend 赎回 120,913,776 枚 USDT,并将 6000 万枚 USDT 转入币安。[2023/5/7 14:48:24]

获利者地址:

0x6703741e913a30D6604481472b6d81F3da45e6E8

漏洞合约地址:

0x025C6da5BD0e6A5dd1350fda9e3B6a614B205a1F

攻击者获得相关APE空投的交易具体如下图所示:

攻击者套利的主要步骤为:

1.首先从Opensea购买了ID为1060的BAYC NFT;

2.通过NFTX以闪电贷借出5个BAYC NFT;

3.利用空投合约(AirdropGrapesToken)漏洞,领取6个BAYC对应数量的APE Coin;

4.归还闪电贷,并转移获利的APE Coin;

其中涉及到的漏洞合约AirdropGrapesToken代码如下图所示:

如上图所示,该函数使用 alpha.balanceOf()和beta.balanceOf()判定调用者对BAYC/MAYC NFT的所有权。但是这种方式仅能获取到用户对该NFT所有权的瞬时状态,该瞬时状态可以通过闪电贷借入进行操控,更安全的方式是采用基于默克尔树的(Merkle tree)链下快照方式。该方式将白名单存储在链下项目方的中心服务器上,当用户在前端官网点击mint之后,服务器会根据钱包地址生成Merkle proof,用户再向智能合约发送一笔携带Merkle proof的交易,并在链上的智能合约中进行验证。

孙宇晨:FTX官方确认债权人实际债务后DebtDAO将向所有FUD持有者发放空投:金色财经报道,波场TRON创始人、火必Huobi全球顾问委员会成员孙宇晨在社交媒体发文表示,FUD 为FTX 债权人提供了新的流动性水平,使他们能够在公开市场上交易其 FTX 债务,更好地控制自己的资产,并开辟了新的投资机会。通过DebtDAO提供的合约确认,该债务规模约为数千万美元。FUD早鸟发行阶段将以折扣价出售 FTX 债券,1 FUD = 1 美元,FUD初始发行量和流动性为2000万,公平价格为 0

该方式一般包含以下三部分:

- 后台根据白名单地址生成Merkle tree;

- 将Merkle Root上传到区块链;

- 验证时前端根据当前用户生成Merkle Proof,并将其传入NFT合约校验;

具体可以参考NFT项目Invisible Friends (INVSBLE),合约地址:0x59468516a8259058baD1cA5F8f4BFF190d30E066。以下是INVSBLE项目中采取的白名单铸币方法mintListed():

- amount:铸造NFT的数量;

- maxAmount:该地址能铸造的NFT最大数量;

- merkleProof:判断某特定白名单地址节点是否属于Merkle tree上所需的数据,包含叶子节点、路径、根;

SBF:FTX存在管理失误,并未参与Alameda经营:12月1日消息,FTX创始人Sam Bankman-Fried在DealBook峰会上发表演讲,他表示,“我对AlamedaResearch的头寸规模感到惊讶,我没有故意尝试混合资金,我认为Alameda Research实际头寸和平台后台数据之间存在巨大差异,我不知道发生了什么。”

SBF还谈到了其他问题,表示FTX存在“管理失误”,但其捐款主要来自于利润而非客户资金,巴哈马父母的房产不是长期财产“但不知道是怎么付款的”,同时他还表示FTX不存在“狂欢派对”,同事之间只会玩棋盘游戏。SBF承认自己在担任FTX营销人员的时候撒过几次谎。[2022/12/1 21:14:15]

该函数首先校验预售是否开启、调用者是否还有额度铸造,接着进行白名单校验,并验证调用者出价是否正确,最后铸造NFT。以下为进行白名单验证的代码实现:

keccak256(abi.encodePacked(sender,maxAmount.toString()))用于计算默克尔树的叶子节点,此处用白名单用户地址和每个用户能够铸造的最大NFT数量作为叶子节点属性。同时还隐藏了一个校验,即msg.sender必须是白名单地址本身。

Merkle Proof验证计算使用library MerkleProof,计算过程可以参考SPV验证,具体源码如下:

使用该方式,NFT发行合约中不需要存储整个白名单列表,只需要存储Merkle root。当交易发送方是非白名单用户时,因为其无法提供合法的Merkle Proof,则无法通过校验。

链下数据快照验证白名单还有另一种使用签名的方式,此时如果合约开发者未设置足够的安全检查,也容易造成安全问题,如:NBA薅羊毛事件。

案例二:NBA薅羊毛事件?

知情人士:Crypto.com NFT部门重组,负责人Joe Conyers IIII离职:6月18日消息,据两位知情人士透露,刚刚经历一轮大规模裁员的加密货币交易所Crypto.com,已与其新兴NFT业务负责人分道扬镳。

据悉,Joe Conyers IIII于2021年3月加入Crypto.com,帮助其建立NFT平台。消息人士称,Conyers(工作地点为纽约)上周在该部门重组过程中离开这家总部位于新加坡的公司。一位消息人士表示,选择重组而非裁员,是为了提高效率。

Crypto.com发言人拒绝就Conyers和重组背后的理由置评,但表示NFT部门是公司“最优先考虑的部门之一”。

据此前报道,由于市场持续低迷,Crypto.com将裁员5%。(Blockworks)[2022/6/18 4:36:21]

2022年4月21日,NBAxNFT项目方遭遇黑客攻击。根据官方回复,由于其白名单校验出现问题导致预售提前售罄。

本次攻击事件中,漏洞合约地址:

0xdd5a649fc076886dfd4b9ad6acfc9b5eb882e83c

上述代码存在两个安全问题:签名冒用和签名复用。签名复用指的是,同一个签名只能使用一次,一般项目方会在合约中设置一个mapping结构存储该签名是否已经被使用,具体源码如下:

?mapping(bytes => bool) private usedClaimSignatures

其中bytes代表Hash签名数据,bool值代表该签名是否曾经被使用,但是mint_approved()函数中并未存储该值,所以存在签名复用问题。

本文主要研究白名单校验中的签名冒用问题,即由于vData memory参数info在传参时未进行msg.sender校验导致签名可冒用。具体白名单校验函数verify()如下:

上海天文馆首发数字藏品:金色财经报道,据上海天文馆官方公众号,在开馆一周年即将到来之际,上海天文馆(上海科技馆分馆)宣布首次推出并于6月9日正式发售两件数字藏品“璀璨橄榄陨铁·伊米拉克陨石”和“世界上最早的天文钟缩比模型·水运仪象台”,每件限量10000份。此次数字藏品由上海科技馆官方授权并监制。[2022/6/9 4:13:43]

上述代码采用签名校验的方式验证白名单,白名单存储在中心化服务器上,用户从前端NFT官网点击mint时,服务器会首先校验是否是白名单用户。如果是,则由服务器使用项目方私钥进行签名,再将签名数据返回。最后用户携带该签名的交易发送到链上进行验证。因此此处ecrecover()验证的仅仅是项目方的地址,仅能证明该签名数据是由项目方进行签发的,但是由于未对签名数据中的调用者,即info.from进行验证,所以导致签名可冒用。

PART 02

「NFT平台漏洞问题」

NFT平台主要有两类,一类是NFT交易平台,如:Opensea、TreasureDAO等;另一类是结合了DeFi业务的平台,如:Revest Finance等。根据平台类型不同,对应的业务类型也不同,造成的安全漏洞也不同。

NFT+DeFi?类型

目前NFT + DeFi主要分为三种类型:一种是将NFT当作流动性代币,如:Uniswap-V3等;一种是将NFT碎片化,即FNFT(Fractional Non-Fungible Token),如:Revest Finance等;另一种是将NFT作为借贷的抵押品,如:Position Exchange等。其中Revest Finance项目包含以上三种业务类型,因此本文从业务逻辑的角度研究了Revest Finance安全事件。

Revest Finance是针对DeFi领域的staking解决方案,用户通过该项目参与任何Defi的staking,都可以直接生成一个F-NFT,其代表了staking仓位当前和未来的价值,具体的业务模型如下:

该项目中用户可以通过mintAddressLock()铸造对应抵押资产的FNFT,具体代码如下所示:

其中涉及到的重要参数为:

- trigger:只有该address可以解锁质押的资产;

- recipients:铸造的FNFT对应的接收者;

- quantities:各个接收者接收的FNFT数量;

- IRevest.FNFTConfig:描述FNFT对应的质押资产,包括:asset(抵押的资产类型,如WETH等)、depositAmount(每个FNFT代表的抵押资产数量,包含精度)等。

用户也可以通过depositAdditionalToFNFT()追加FNFT的抵押资产,具体代码如下:

其中涉及到的重要的参数为:

- fnftId:需要追加资产的FNFT;

- amount:每个FNFT需要追加的抵押资产数量,包含精度;

- quantity:为多少个FNFT追加抵押;

用户追加质押资产时,根据quantity的不同存在三种情况,第一种情况是为所有FNFT追加抵押,第二种情况是为其中一部分FNFT追加抵押,第三种情况是追加抵押的FNFT数量大于FNFT总量,此时报错返回。该漏洞为第二种情况下造成的重入,具体逻辑如下:

由上述代码可知,追加抵押时需要先把之前的FNFT销毁,之后再铸造新的FNFT。但是在铸造时,由于min()函数中未判断需铸造的FNFT是否已经存在,并且状态变量fnftId自增在_mint()函数后。而_min()中存在ERC-1155中的隐藏外部调用_doSafeTransferAcceptanceCheck(),造成了重入漏洞。具体代码如下:

此处的mint()函数中_mint()包含一个隐藏的外部调用,具体如下:

攻击主要包括以下三个步骤:

1.调用mintAddressLock()铸造了2个fnftId为1027的FNFT,但是它们对应的资产为0;

2.调用mintAddressLock()铸造了360000个fnftId为1028的FNFT,它们对应的抵押资产仍然为0;

3.在步骤2中,利用ERC-1155中_mint()函数中的_doSafeTransferAcceptanceCheck()重入了depositAdditionalToFNFT(),将1个fnftId为1027的FNFT对应的抵押更新为1 WETH。

由于此时fnftId还未自增,仍然为1027,所以该函数会生成一个fnftid为1028且价值为1 WETH的FNFT,导致将id为1028的FNFT价值从0更新为了1 WETH。

综上,由于FNFT是一种证券化后的NFT,其价值会根据业务逻辑的不同产生波动,如该例中的staking仓位价值。所以FNFT存在价值变更的情况,一般会通过重写burn()和mint()等函数实现价值变更,如:本例中的FNFTHandler合约。如果实现时没有考虑检查-交互-生效机制,就可能存在严重安全问题。

NFT交易平台?

该类平台一般会实现简单的市场功能,包括:挂单、取消挂单、购买、出价、取消出价、接受出价、提现等。其中涉及到的NFT资产包括ERC721、ERC1155两种,开发过程中如果没有考虑到二者的区别,就可能造成安全问题,如TreasureDAO事件。

2022年3月3日,TreasureDAO生态的TreasureMarketplace交易平台遭到黑客攻击,造成NFT token被盗。传送门——《怪事?盗了又归还?TreasureDAO安全事件分析》

在本次事件攻击事件中,攻击者信息如下:

交易发起地址:

Arbitrum:0x9b1acd4336ebf7656f49224d14a892566fd48e68

漏洞合约:

Arbitrum:0x812cda2181ed7c45a35a691e0c85e231d218e273

Arbitrum:0x57dc8e6a28efa28ac4a3ef50105b73f45d56615d4a6c142463b6372741db2a2b

TreasureMarketplaceBuyer合约的buyItem函数在传入_quantity参数后,并没有做代币类型判断,直接将_quantity与_pricePerItem相乘计算出了totalPrice,因此safeTransferFrom函数可以在ERC-20代币支付数额只有0的情况下,调用TreasureMarketplace合约的buyItem函数来进行代币购买。

但是在调用TreasureMarketplace合约的buyItem函数时,函数只对购买代币类型进行了判断,并没有对代币数量进行非0判断,导致ERC-721类型的代币可以在无视_quantity数值的情况下直接购买,从而实现了漏洞攻击。

本次安全事件主要原因是ERC-1155代币和ERC-721代币混用导致的逻辑混乱,ERC-721代币并没有数量的概念,但是合约却使用了数量来计算代币购买价格,且最后在代币转账的实现中也未进行逻辑分离。

此外,在与NFT交易平台相关的漏洞中,除了上述由于NFT本身造成的漏洞外,还有由于平台本身存在安全问题而危害NFT交易的情况。如:近期发现的Opensea Wyvern 2.2合约漏洞,攻击者可以利用该漏洞窃取Opensea市场中具有活跃报价的用户WETH。所幸Opensea团队预先发现了该问题,并进行了及时的修复,尚无相关攻击产生。

标签:NFTFNFMINERKGalactic Arena: The NFTverseFNF价格gemini郭家毅学历Berkshire

火必APP热门资讯
STEP:朱啸虎买的“那双鞋” 已经跌了7成

Twitter的创始人Jack Dorsey公开称:“Web3的VC们可以洗洗睡了”。“有的投资人炒币都财富自由了。”李琼告诉融资中国。在币圈,有大批投资人信徒.

1900/1/1 0:00:00
元宇宙:元宇宙vs数字孪生:技术演化的视角

近几个月来元宇宙概念的爆火,与近几年来数字孪生的大热,两种现象之间有哪些异同?元宇宙究竟是概念炒作的科幻噱头、资本割韭菜的利器,还是代表了互联网的未来.

1900/1/1 0:00:00
BTC:金色观察|灰度现货比特币ETF被拒起诉SEC 业内人士声援

美国证券交易委员会(SEC)周三已拒绝灰度将其135亿美元的灰度比特币信托(GBTC)转换为现货比特币ETF的申请.

1900/1/1 0:00:00
比特币:宏观投资人Lyn Alden:把比特币和「加密」等同 是误解

中本聪结合了许多现有技术(互联网、哈希树、工作量证明、SHA-256),加入了自己的一些技术,并做出了一些创新的东西。可以说是会计和货币方面的突破性创新。比特币之后出现的大多都是局.

1900/1/1 0:00:00
NFT:金色早报 | 伊朗央行将在2个月内推出加密里亚尔的试点

头条▌过去24小时,BSC链上NFT交易额超过4000万,超越以太坊排名第一据BSCFA数据显示:过去24小时BSC链上NFT销售的超过4000万美元,本文撰写日为4987577美元.

1900/1/1 0:00:00
DEF:本轮压力测试下 DeFi协议们表现如何?

有的抵押借贷清算失能,有的信用贷兑付困难。近期,比特币、以太坊价格持续下跌,纷纷创下过去一年价格新低。整个加密市场受到波及,DeFi 也难以独善其身.

1900/1/1 0:00:00