返回论坛

钻石协议下的安全隐患:The Saudis NFT 事件深度剖析

查找币 漏洞披露 安全研究 Web3安全 区块链安全

查找币安全研究院

钱包恢复评估 | 链上取证分析 | Web3 事件响应
以合法授权、证据保全、隐私保护和可复核流程为前提,不要求用户在线提交完整私钥或助记词。

查看研究院 研究报告中心
## 事件回顾:一场引发争议的NFT回收行动 2022年7月10日,备受关注的NFT项目The Saudis启动了其白名单免费铸造(freemint)活动。活动结束后不久,一个名为RIGHTBLOCK的地址在市场上大量抛售该项目的NFT。项目方迅速锁定该用户,并通过对合约的紧急修改,将用户持有的NFT全部转移回项目方账户。随后,项目方承诺将这些NFT重新分配给社区成员。 这一事件在社区中引发了激烈讨论:**项目方为何能够单方面转移用户持有的NFT?** 经过查找币安全团队的深入分析,发现该NFT合约采用了EIP-2535钻石协议(Diamond Protocol),项目方正是利用该协议的特性实现了对合约功能的动态重写,从而完成NFT的强制转移。 ## 钻石协议(EIP-2535)技术解析 EIP-2535是以太坊上一种实现智能合约模块化组合的提案,其核心目标包括: - 突破单个合约24KB的最大代码大小限制 - 实现合约功能的灵活升级与扩展 - 降低大型合约的部署和维护成本 要理解钻石协议,需要掌握以下几个核心概念: ### 核心术语定义 | 术语 | 英文 | 说明 | |------|------|------| | **钻石** | Diamond | 相当于代理合约,是与用户交互的主合约 | | **切面** | Facet | 钻石的不同功能模块,每个切面对应一个实现合约 | | **钻石切割** | diamondCut | 用于增加、替换或删除钻石中的切面功能,本质是合约升级 | | **放大镜** | The Loupe | 查询钻石中所有切面及其功能的接口,信息存储在DiamondStorage中 | ### 架构模型 钻石合约的运作模式如下: 1. **用户交易**:用户与钻石合约(代理合约)交互 2. **函数路由**:钻石合约根据函数选择器(function selector)将调用路由到对应的切面合约 3. **功能执行**:切面合约执行具体的业务逻辑 4. **存储共享**:所有切面共享钻石合约的存储空间 与传统的单代理-单实现合约升级模式不同,钻石协议允许一个代理合约同时关联多个实现合约,实现更细粒度的功能管理。 ## 事件技术分析:钻石切割如何被利用 ### 关键合约分析 在The Saudis项目的`DiamondCutFacet.sol`合约中,实现了`diamondCut`函数。该函数的执行逻辑如下: ```solidity function diamondCut( FacetCut[] calldata _diamondCut, address _init, bytes calldata _calldata ) external { // 1. 权限校验 LibDiamond.enforceIsContractOwner(); // 2. 执行钻石切割 LibDiamond.diamondCut(_diamondCut, _init, _calldata); } ``` ### 权限控制缺陷 该函数首先调用`LibDiamond`库的`enforceIsContractOwner`函数,仅验证调用者是否为合约的owner。**一旦通过验证,即可无限制地修改合约的所有功能**。 ### 切割操作流程 `diamondCut`函数根据传入的`action`参数执行不同操作: - `0`:添加新功能 - `1`:替换现有功能 - `2`:删除功能 ### 攻击交易分析 通过追踪项目方调用`diamondCut`的交易,我们发现了以下关键细节: 1. **新切面合约**:项目方传入了一个未开源的新切面合约地址`0x70d8ccaf6b50b051ab1e8fa238626163e45a8b03` 2. **操作类型**:`action`参数设置为`1`,执行功能替换 3. **替换逻辑**:`replaceFunctions`函数首先为新地址添加切面,然后循环读取并删除原有函数选择器对应的旧切面,最后将所有函数选择器指向新的切面 通过这一系列操作,项目方成功将NFT的转账功能重写,使得项目方能够绕过用户授权,直接转移用户钱包中的NFT。 ## 安全威胁分析 ### 核心风险点 1. **单点权限控制**:钻石合约的升级权限完全集中在owner地址,一旦owner私钥泄露或被滥用,整个合约的资产安全将面临威胁 2. **功能后门风险**:通过钻石切割,项目方可以随时添加、替换任何功能,包括转账、销毁等敏感操作 3. **用户资产主权丧失**:用户持有的NFT实际上并不完全属于用户,项目方可以通过合约升级随时转移或冻结资产 4. **代码不透明**:新添加的切面合约未开源,用户无法验证其行为是否符合预期 ### 影响范围 - **直接受害者**:RIGHTBLOCK用户持有的全部NFT被强制转移 - **潜在影响**:该项目所有NFT持有者的资产主权都受到威胁 - **行业影响**:揭示了钻石协议在NFT领域的滥用风险,引发对去中心化资产所有权的重新思考 ## 安全防护建议 ### 对项目方的建议 1. **实施多签治理**:钻石合约的owner权限应使用多签钱包(如Gnosis Safe),避免单点控制 2. **设置时间锁**:钻石切割操作应增加时间锁机制,给用户足够的反应时间 3. **公开升级计划**:任何合约升级都应提前披露,并经过社区投票 4. **限制敏感操作**:对转账、销毁等敏感功能应设置额外的权限验证 ### 对用户的建议 1. **审查合约权限**:在参与NFT项目前,仔细审查合约是否包含动态升级功能 2. **关注项目透明度**:选择开源、经过安全审计的项目 3. **使用监控工具**:利用链上监控工具实时跟踪合约变更 4. **理解资产风险**:认识到在可升级合约中,用户持有的资产可能不完全是自己的 ## 总结 The Saudis NFT事件揭示了EIP-2535钻石协议在权限控制不当时可能带来的严重安全风险。虽然钻石协议为智能合约的模块化和升级提供了强大支持,但**去中心化与可升级性之间的平衡**始终是一个需要谨慎处理的问题。 项目方应当意识到,过度中心化的控制权不仅违背了区块链技术的初衷,更可能损害用户信任和项目长期发展。而用户也需要提高安全意识,在选择参与项目时充分了解合约的权限结构和潜在风险。 --- *本文由查找币安全团队整理发布*
在论坛中查看和回复