分类
适合初学者和专业人士

NFT 平台安全指南

去中心化金融社区 |2022-04-17 1:59

Web3 安全连载(2) | 避坑指南,一文看懂典型的 NFT 合约漏洞有哪些?

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

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

- NFT 平台安全指南 将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团队预先发现了该问题,并进行了及时的修复,尚无相关攻击产生。

Ronin

Ronin 是一条 “侧链” —— 一条具有自己的节点和共识机制的区块链,但是在其和以太坊之间维护着一条官方 “桥接”。Ronin 采用授权证明 (proof-of-authority, POA) 机制,具有 10 个节点,这些节点质押他们的声誉,以保证他们不会滥用自己的权利。这与以太坊的测试网如 Goerli (具有 20 个节点的 POA 链) 相当。如果这些节点中的任意 5 个节点 (50%) 作恶或者被攻击,他们就能够发起 51% 攻击并通过双花或其他攻击手段盗窃用户的资产。一般来说,这种规模可以说是尤其少的节点数量了 (比特币拥有 15000 个节点,以太坊拥有将近 6000 个节点)。他们构建了一个比较中心化的网络,以换取更快、更便宜的交易。此外,用户不能运行自己的节点,并且 Ronin 节点的源代码未公开,因此用户无法对其进行审计。

桥接安全

Ronin 的官方以太坊桥接由 NFT 平台安全指南 5/9 的 “多签”(multisig) 控制。“多签” 要求总共 n 个私钥持有者中的 m 个签名者进行签名以授权每一笔交易。在 Ronin 网络中,每一笔桥接交易都需要获得 “多签” 的授权。然而,没有设置任何机制来检查存款或者提款是否真的有效 —— 任何能够访问 5/9 个私钥的人都可以将 Ronin 桥接中任意数量的任意代币提出至任意以太坊地址中。也就是说,该桥接上的任意用户直接将他们的所有资产托付给这个 “多签” 系统。

2022 年 3 月,这种信任设置被黑客利用,6.25 亿美元被盗。黑客得以访问由 Axie 团队持有的 4 个私钥以及 Axie DAO 验证者租借给 Axie 团队的 1 个私钥 (共 5/9 个私钥)。就我们目前所知的情况,可以表明这是一个典型的网络安全漏洞:由于这些验证者私钥的中心化,造成了严重的后果。Sky Mavis 已经承诺会对损失资金的用户进行补偿,并在未来三个月内增加到 21 个验证者,以确保 Ronin 对未来的攻击具有更强的弹性。尽管他们这样做需要在更具有鲁棒性的共识/桥接机制和可扩展性之间做一定的取舍。

Polygon

Polygon 目前提供了一种以太坊的 PoS 侧链 (Polygon PoS),以及一个专门的 NFT 服务业务 (Polygon Studios),为 Skyweaver 和 ZED RUN 等主要项目提供支持。Polygon 正朝着提供不同的扩容解决方案的方向发展,其中大部分基于 zk-rollup 技术 (稍后讨论),但目前只有 Polygon PoS 作为 NFT 平台上线主网。

Polygon PoS 是一条侧链,其基本模式与 Ronin 相似,只不过 Polygon 是一种 “commit sidechain” (提交链):它定期将链上状态的检查点提交给以太坊。Polygon PoS 共识由两个主要部分组成。第一个是 Bor 链 (Block Producer chain, 区块生产链),这是 Polygon 交易实际发生的地方:从更大的验证者池中挑选出生产区块的轮流子集,让这个子集运行一个调整过的 PoA 网络,这个网络决定交易的打包和排序。然而,这个子集中只有一个区块生产者 (见 PolygonScan 浏览器的区块验证者) 被选中来提议 64 个连续的区块 (一个 sprint)。

接下来是 Heimdall 检查点系统,更多数量的验证者 (目前上限为 100) 会就 Bor 区块最后 30 分钟的摘要快照达成 ⅔ “PoS” 共识,并将该快照作为检查点发布在以太坊上。然而,尽管这个系统现在有 100 名验证者,但前 4 名验证者的质押占比为 53%,前 7 名验证者的质押占比为 67% (见此处,点击“显示全部”并按质押权重排序)。并且,⅔ 多数达成共识这一要求指的是质押的权重,而不是验证者的数量。这意味着,只需攻击并控制 7 个私钥,链上的所有资产 (而不仅仅是桥接上的资产) 都能通过恶意检查点被盗走 —— 且质押者必须一直保持他们的私钥为联网的状态。此外,由于 ⅔ 的质押占比为达成共识的要求,而 43% 的质押权重由 3 名验证者控制,只需攻击 3 个热钱包就足以完全冻结提款和检查点。

质押总量为 2,307,879,127 MATIC,前七名验证者质押了 1,540,761,159 MATIC (~67%)

合约升级可以用来抵御作恶检查点 (假设能够快速检测到作恶行为的话) —— 但这有其自身的安全风险,我们接下来会讨论这个问题。

Polygon 桥接与 Ronin 桥接的不同之处在于,检查点系统免除了独立验证者集对每笔存款和提款签名的需要。然而,这意味着该桥接的安全性完全依赖于 Heimdall 系统和 Bor 共识,这很容易受到上述攻击。

此外,Polygon 使用一个 5/8 的多签系统来治理他们的桥接智能合约,并且合约升级可以在没有时间锁的情况下立即进行。这可以抵御智能合约出现漏洞或者上述讨论的对质押权重高验证者攻击的情况。4 个私钥由 Polygon 创始人持有,这种架构已经被社区的安全研究人员强烈批评,因为只需再多另一个私钥就有可能通过恶意升级将 Polygon 合约的所有资产 (50 亿美元以上) 盗走。然而,由于 Polygon 的签名者不需要对每一笔存款和提款交易签名,这些管理员私钥可以保持离线,使得他们被攻击的机会更小。

NFT平台和参与者如何确保安全(转载 NFT交易平台开发)


Notice: The content above (including NFT 平台安全指南 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.

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。