原文来源:老雅痞
作为一个NFT收藏家,你应该关心链上的合约出处,NFT最真实的出处是直接从创造者的钱包或创造者拥有的智能合约中铸造出来的。然而,通过一些小技巧,有人可以使用一种被称为 Sleep Minting的技术来操纵NFT的创作者来源。
Sleep Minting是指诈骗者直接将NFT铸造到一个著名的创作者的钱包,并从创作者的钱包中回收NFT。
这就造成了这样的假象:
(1)创作者自己真实地铸造了一个NFT;
(2)将该NFT发送给了一个骗子;
基于 链上 的出处,骗子可以声称他们拥有一个著名创作者铸造的NFT,并以更高的价值出售。
这在技术上是如何运作的?
首先,了解智能合约如何存储NFT的出处和所有权是至关重要的。任何人都可以使用ERC-721标准中的ownerOf(tokenId)函数查询NFT智能合约,以确定NFT的当前所有者是谁。你甚至可以通过改变eth_call RPC方法参数来查询特定区块编号的NFT所有者。然而,查看所有权变化的最简单方法是查看ERC-721传输事件日志。
我的a16z Crypto同事Daren Matsuoka在Twitter上写了一篇关于事件日志和它们如何工作的精彩文章。转移事件日志是由智能合约向外界发送的消息,包含关于NFT转移的细节(NFT从谁转移,NFT向谁转移,以及转移的TOKEN ID)。转移事件日志提供了一种有效的方式来检查NFT的来源。
Sleep Minting 的骗局
大众认为,如果你发送交易来转移NFT,那么你的地址应该在event中作为 from 字段。然而,当一个骗子从一个著名的创造者那里取回一个sleepingNFT时,情况就不是这样了。骗子可以人为地将著名创作者的地址加上 from 字段。
Sleep minting
这是beeple的数百万美元的作品 First 5000 Days 在rarible上出售。看看截图,上面清楚地写着 创造者:
但这是个骗局。它的创造者Monsieur Personne,也自称是NFTs的Banksy,故意用beeple的名字铸造了这幅作品,他使用了一种叫做sleep minting的技术。那么他是如何做到的呢?
基础知识
NFTs是使用ERC-721智能合约创建的,他们把NFTs的所有权记录作为一个列表。一个地址和一个作品的序列号组成一个对。像这样(我把 Bob 换成 Booble)。
Alice: 1
Booble: 2
Malory: 3
成交后,Alice可以通过以下方式将她的NFT转让给Booble。
转让1:Alice ==> Booble
现在列表更新如下:
Alice:
Booble: 2, 1
Malory: 3
在以太坊,我们用地址名字来识别,而且我们需要签署转账来授权。但是在这篇文章提供的例子中,我将使用明确的名字来简化解释。
现在,通常开发者以合理的方式实现ERC-721合约。Alice只有在她拥有一个NFT并能提供有效签名的情况下才可以转让。
ERC-721标准只是一个社会契约,它定义了一个允许艺术平台互操作的接口。只要合同的接口与ERC-721合同的接口相匹配,任何机器都会认为它是有效的。
但是,正如我们现在所看到的,这可能会导致以太坊上的NFTs出处出现安全问题,它是可以被篡改的。
正如我所说,任何合理的ERC-721合约都会允许矿工只为自己造币,并且只转让他们拥有的碎片。
但是,假设我们定制了我们的ERC-721合约,使我们可以向其他账户铸造。假设我们调整了转让功能,使我们的账户在某些情况下,也可以转让另一个人的NFT。那么,我们就可以建立一个允许我们sleepmint的合约。
举例:作为攻击者Malory,我们给Booble铸造一个序列号为1的作品。
mint 1: address(0) => Booble (由Malory执行)
现在我们的配对看起来如下:
Alice:
Booble: 1
Malory:
然后,由于Malory已经调整了合同,将序列号为1的作品从Booble的账户转移到任何其他账户,她可以在像rarible这样的NFT平台上提供出售。
由于她从地址(0)到Booble的铸币为 创造者--Booble 被显示出来。
一旦Malory 成功诈骗了一个买家,她就会收到她的 Ethers,并将假冒作品卖给买家。
转让1:Booble => 买方(由Malory执行)。
更新后的所有权记录现在是这样的。
Alice:
Booble:
Malory:
Buyer: 1
就这样,Malory成功地篡改了NFT的创作出处记录,以高于其价值的价格出售了她的作品。
具体细节:
仔细查看rarible和Etherscan的信息,我们会发现这更像是一个接口问题,而不是一个安全漏洞。没有人能够进入beeple的账户。
另外,当仔细看一下交易记录时,可以发现骗子的手法:
伪造的mint交易
伪造的转账交易
对于mint交易,我们可以看到Etherscan显示两个 From 字段。一个是msg.sender发送的交易,另一个是说明NFT的发件人。
对于交易的发件人字段,即msg.sender,它不能被人为操纵,因为它需要发件人的私钥的有效签名。然而,对“Tokens Transferred”的字段的授权受制于智能合约的漏洞,因此,可能会人为操纵。
简单地说,骗子可以对“Tokens Transferred”字段进行任意修改。
因此,我们必须检查From和Tokens Transferred是否都与beeple的正确地址相符。如果不是,那就是假的。
这种攻击它与 rugpull 类似,有人认为区块链使web2问题都消失了,因为每一个数据都是经过认证和检查授权的。但事实是,这些问题并没有消失。它们只是转移到了别的地方。