来♥源അ:金色财经
背☎景信息é
2022 年 7 月 10 号,一个火热的 NFT 项目 The Sauρdis 开启了 ੧freemint 活动(白名单用户可以免费铸造其 NFT)。而就在 mint 活动结束后,一位名叫 RIGHTBLOCK 的用户在市场上大量地抛售该 NFT,项目方发现后迅速锁定到了该用户并对合约进行改动以此来将该用户手里的大⊥量 NFT 转移回来,他们之后承诺会将这些 NFT 回馈给社区用户。
那么为什么项目方可以将该用户手里的 NFT 转移呢?经过我们的分析发现该 NFT 项目的合约采用了 EIP-ી2535 协议也叫做钻石协议,项目方利用该协议重写了合约的功能,以此来实现这些 NFT 的转ਲ਼移。接下来慢雾安全团队将会为大家介绍下这个钻石协议◈(EIP-2535)的细节。
EIP-2535 是以太坊上一个将合约进行代码模块化组合的提案,其目的是为了让大型的智能合约突破 2²4kb 大小的最大限制,并且让合约更方便地♦更新功能。
要–理∇解▧钻石协议,首先有几个相关的概念定义需要知道:
⊃ 整个钻⊥石模型≈类似下图:
通过使用钻石标准规范去创建钻石合约,这个合约可以像使用当前♨合约的代码一样使用任何数ਊ量的其他切面μ合约的代码。
在该钻石合约中不同的函数功能需要调用对应的不同的切面合约à的代码来实现,并且可以利用钻石切割的功能来对钻石合约中的函数功能进行Ψ修€改(添加、替换或删除)。
这与市面上Β大多数使用一个代ૣ理合约和一个实现合约来实现交互与升级的方式有所∑区别。
事件分ધ析
ⓣ 接下来回头分析下 The Saudis 这次事件↓中的一些细节,在该项目的 DiamondCutFacet.solઞ 合约中,可以看到实现了 diamondCut 功能的函数。
该函数首先会调用 Āe;LibDiamond 库的 enforceIsContractOwner 函数来判断调用者是否是合约的 owner,如果是 owner ૄ调用的话会调用 LibDiaømond 库的 diamondCut 函数来实现钻石合约的功能更新。
☎
跟进到该函数我们发现钻石切割会根据传入的不ⓜ同的 action 来判Ċa;断进行添加、替换或删除功能,故接下来跟进看看项目方调用该函数的交易。
我们૯发现传入了新的切面合约 0x70d8∂ccaf6b50b051ab1e8fa238626163e45a8ળb03(未开源),传入的 action 设置为 1 则应该是调用了 replaceFunctions 来实现替换功能。
从 repl♣ⓨaceFunctions 函数中可以分析出该函数首先会为传入的地址新增一个切面,接着从存储中循环读取传入的每个函数选择器对应的旧的切面进行删除,并્为这些函数的切面添加为传入的新的切面地址。
至此可得知 The SaudiΔs 项目方就是利用了钻石切割函数来重写了转账功能,以此来将用户 RIGHTࢮBLਨOCK 手中的 NFT 转移回自己的账户。
24小时滚动播报最新的财经资›讯和视频,更多粉丝福利扫描二维码关注(s·inafinancδe)
新浪财ધ经意—见反É馈留言板
All Rights Reserved 新浪公司 版权∋所有