Web3 安全连载(2) | 避坑指南,一文看懂典型的 NFT 合约漏洞有哪些?
如上图所示,该函数使用 alpha.balanceOf()和beta.balanceOf()判定调用者对BAYC/MAYC NFT的所有权。但是这种方式仅能获取到用户对该NFT所有权的瞬时状态,该瞬时状态可以通过闪电贷借入进行操控,更安全的方式是采用基于默克尔树的(Merkle tree)链下快照方式。该方式将白名单存储在链下项目方的中心服务器上,当用户在前端官网点击mint之后,服务器会根据钱包地址生成Merkle proof,用户再向智能合约发送一笔携带Merkle proof的交易,并在链上的智能合约中进行验证。
- 后台根据白名单地址生成Merkle tree;
- 将Merkle Root上传到区块链;
- 验证时前端根据当前用户生成Merkle Proof,并将其传入NFT合约校验;
具体可以参考NFT项目Invisible Friends (INVSBLE),合约地址:0x59468516a8259058baD1cA5F8f4BFF190d30E066。以下是INVSBLE项目中采取的白名单铸币方法mintListed():
- amount:铸造NFT的数量;
- maxAmount:该地址能铸造的NFT最大数量;
- merkleProof:判断某特定白名单地址节点是否属于Merkle tree上所需的数据,包含叶子节点、路径、根;
Merkle Proof验证计算使用library MerkleProof,计算过程可以参考SPV验证,具体源码如下:
使用该方式,NFT发行合约中不需要存储整个白名单列表,只需要存储Merkle root。当交易发送方是非白名单用户时,因为其无法提供合法的Merkle Proof,则无法通过校验。
链下数据快照验证白名单还有另一种使用签名的方式,此时如果合约开发者未设置足够的安全检查,也容易造成安全问题,如:NBA薅羊毛事件。
案例二:NBA薅羊毛事件
2022年4月21日,NBAxNFT项目方遭遇黑客攻击。根据官方回复,由于其白名单校验出现问题导致预售提前售罄。
上述代码存在两个安全问题:签名冒用和签名复用。签名复用指的是,同一个签名只能使用一次,一般项目方会在合约中设置一个mapping结构存储该签名是否已经被使用,具体源码如下:
mapping(bytes => bool) private usedClaimSignatures
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安全事件。
- trigger:只有该address可以解锁质押的资产;
- recipients:铸造的FNFT对应的接收者;
- quantities:各个接收者接收的FNFT数量;
- IRevest.FNFTConfig:描述FNFT对应的质押资产,包括:asset(抵押的资产类型,如WETH等)、depositAmount(每个FNFT代表的抵押资产数量,包含精度)等。
- fnftId:需要追加资产的FNFT;
- amount:每个FNFT需要追加的抵押资产数量,包含精度;
- quantity:为多少个FNFT追加抵押;
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。
NFT交易平台
此外,在与NFT交易平台相关的漏洞中,除了上述由于NFT本身造成的漏洞外,还有由于平台本身存在安全问题而危害NFT交易的情况。如:近期发现的Opensea Wyvern 2.2合约漏洞,攻击者可以利用该漏洞窃取Opensea市场中具有活跃报价的用户WETH。所幸Opensea团队预先发现了该问题,并进行了及时的修复,尚无相关攻击产生。
NFT平台安全指南
去中心化金融社区 |2022-04-17 1:59
Ronin是Sky Mavis Labs创造的区块链,目前只支持Axie Infinity及其生态系统。
2022年3月,一名黑客获取了由Axie团队持有的4个密钥,以及Axie DAO验证者借给Axie 团队的1个密钥(给他们5/9)之后,该信任损失了6.25亿美元。目前我们所知道的情况表明,这是一个典型的网络安全漏洞,由于这些验证者密钥的中心化,导致了这样严重的后果。Sky Mavis已经承诺赔偿那些损失资金的人,并在未来三个月内联系21家独立验证者,以确保Ronin在未来的攻击中更有弹性,尽管这可能要在更强大的共识/桥机制与网络的可扩展性之间需要一个折衷。
Polygon目前提供了一个权益证明的以太坊侧链(Polygon PoS),以及一个专门的NFT服务公司Polygon Studios,该公司支持Skyweaver和ZED RUN等主要项目。Polygon正在提供一系列不同的扩展解决方案,其中大部分基于zk-rollup技术,但目前只有Polygon PoS是作为NFT平台而存在的。
Polygon PoS是一个侧链,其基本模型与Ronin类似,除了Polygon是一个“提交侧链”,它定期将链状态的检查点提交到以太坊。Polygon PoS共识有两个主要组成部分。首先,Bor链,这是Polygon的交易实际发生的地方:从一个更大的验证者池中选择轮流的区块生产者子集来运行一个修改的权威网络证明,其决定交易的包含和排序。然而,这个子集只有一个区块生产者,然后被选择提议64个连续区块(一个sprint)。
Polygon的桥与Ronin的桥的不同之处在于,它的检查点系统不需要一个独立的验证者集合来签署每次的存款和取款。然而,这意味着桥的安全完全依赖于 Heimdall 和 Bor 共识,这很容易受到上述攻击。
Immutable是一个构建高质量、高规模NFT项目(如游戏)的平台。在Immutable平台上创建的著名项目包括Illuvium、Gods Unchained、Ember Sword和Guardians Guild。
NFT平台和参与者如何确保安全(转载 NFT交易平台开发)
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.
下载比推 APP
iPhone
Android
NFT 防盗指南:如何保护资产安全?
区块链安全和数据分析公司PeckShield编写的表格显示,在一次钓鱼攻击中,254个总价值约为170万美元的NFT遭到盗窃;愚人节当天周杰伦的NFT BAYC#3738被盗走,该事件是典型的由钓鱼网站诱导mint从而获得用户NFT操作权的案例;一个名为MoonManNFT的项目,该项目借由free mint的名头,盗走了近400个NFT……
NFT安全存储基本知识
请牢记:
- 你的NFT并非储存在电脑或移动设备上,而是在IPFS或Arweave这样的去中心化空间。
- 拥有私钥,就有了对区块链/你的资产的完全访问权限。
- Shamir 私钥分割方案能为助记词提供二级保护。
1. 你的NFT储存在哪里?
2. 你的图片、动图和音乐在哪里?
3. 钱包
你可以自由分享钱包的公共地址,此地址与 Web3的电子邮件地址没有区别,知道了你的地址,任何人都能向你发送NFT。 这也就催生了新的黑客攻击载体。黑客会向人们发送NFT,当人们与该NFT互动时(比如将其发送至另一钱包,或出售它),黑客就会窃取此人钱包中的资产。请谨记,不要点开陌生NFT!此外,人们也会利用流氓签名或批准来获取你的IP地址。
钓鱼邮件也是寻常的诈骗方式。邮件的目的是引诱你把钱包连接到虚假网站,以便黑客窃取资产。所以,千万不要点开陌生链接!务必时时检查网站名称。目前黑客攻击的方法比较单一,只能从公共地址和电子邮件下手,只要不理会它们就可以了。
- 助记词 + “NFTGo”
- 助记词 + 任意数字
- 助记词 + 任意字母
- 助记词 +任意短语
4. 添加第二层保护
购买冷钱包是提升安全性的有效途径。Trezor,Ledger和Keystone是几款最受欢迎的硬件钱包,但各自有优势和不足。每种冷钱包都有其特色。比如 Keystone 使用二维码进行数据传输,避免了木马病毒通过 USB 接口或者蓝牙被传输到硬件钱包的风险,同时也是首个支持 ENS (Ethereum Name Service) 的硬件钱包,免去了核对原始地址的麻烦。此外,用户可以用 NFT 自定义其4英寸的屏幕。
我们以 Keystone 为例进行设置。
(1)从官方网站购买 Keystone 钱包。
(2)安装 Keystone 套件。
(5)如果是企业使用的话,推荐使用Shamir私钥分割方案,把2组助记词分成3组,或把3组助记词分成5组, 你可以把这3组私钥保存在不同地方。如果你有 5 NFT 平台安全指南 个 Shamir 备份中的 3 个并且丢失了其 中 2 个,你仍然可以使用剩余的 3 个备份来恢复您的钱包。
我们以转移一个BAYC为例具体来看 NFT 硬件钱包的使用。在Keystone中,用户可以使用 microSD 卡中上传的 ABI 数据文件快速确认地址的真实性,地址旁边会出现蓝色字体的“Board Ape Yacht club”,还需要确认该交易是否涉及任何恶意行为,以免将您的 NFT 签署给诈骗者或黑客。
避免NFT诈骗的方法
1. 务必从官网下载Web3 NFT 平台安全指南 app或钱包
导致加密/NFT黑客攻击的主要原因是用户对非官方网站的访问。绝大多数此类网站是为了行骗而建立,看上去与官方网站极其相似。不要从Google Play下载Web3 app,它们可能不是从原始渠道获取的。你可以参考以下建议,来鉴别官方网站: