相关报道:黑客利用OpenSea平台漏洞窃取用户价值百万美元的NFT

1月24日,OpenSea多名用户的NFT被人以过期的低价买入,并被快速高价转卖,受影响的NFT资产包括Bore Ape Yacht Club、CoolCats、CyberKongz等。其中一个Bore Ape Yacht Club 以0.77 ETH的旧价格被购买,并在一小时内以84.2 ETH转售。该NFT的持有者在推特上表示,他近期并未以0.77 ETH的价格出售该NFT。

交易页面显示,名为jpegdegenlove的 OpenSea 账号操作了这些低买高卖的NFT,截至1月25日凌晨,其以太坊钱包已经拥有价值超74万美元的ETH。

攻击者能够成功「狙击」别人的NFT,源于OpenSea的NFT「销售列表」取消功能被忽略。在这个全球最大的NFT交易平台上,NFT挂单者真正撤单必须支付Gas取消销售列表,否则挂单即便在前端UI不显示,链上也依然有效,仍能被人以原先的挂单价格在其他平台上购买。

DeFi开发者yakirrotem解释,攻击者可能保存了用户在早先挂售时的链上签名列表,该列表公开可见,能被API抓取,以过期低价购买用户的NFT。这个Bug一旦被攻击者利用,他人的NFT便会被收入囊中,进而转卖。

截至发稿前,OpenSea未就用户损失和「销售列表」的前端问题公开发表回应。

用户NFT以过期价遭攻击者低买高卖

「OpenSea上的一个错误允许人们以旧价格购买Ape。这只Ape以0.77 ETH的价格被购买,40分钟后以 84.2 ETH 的价格转售。」1月24日,多条类似推文提示OpenSea用户,尽快将自己的NFT资产转移至从未在OpenSea上签名过NFT销售的钱包中。

一枚Ape NFT以0.77 ETH被低吸后高卖

被低价买入又转手高价卖出的NFT不仅涉及Bore Ape Yacht Club项目,还包括Mutant Ape Yacht Club、CyberKongz 和 Cool Cats 等NFT项目。

「伙计们,为什么我的 Ape 只卖0.77 (ETH)?」推特用户T_BALLER6正是受害者之一,他发布推文称,他近期并没有将这枚Ape 以0.77 ETH的价格出售。

另一名维特名为ToastVirtual的NFT收藏家也称,周一醒来发现他的Ape以旧的挂单价格 6.66 ETH 被售出,「这只Ape 没有在钱包之间转移。」

从OpenSea交易记录页面可见,低吸高卖的账户名为jpegdegenlove,该账户在几个小时内不断以旧价格买入多个知名的NFT,然后又转手高价卖出。区块链安全机构 Peckshield 的相关推特公布了攻击者地址并提醒,OpenSea有一个前端问题,攻击者获得了大约332 ETH。按照事发当时ETH的报价2256美元,这些332 ETH折合约74万美元左右。

这些收藏家的NFT为何会被人以过期的低价买走?

有推特用户附图答疑称,OpenSea和另一个NFT交易平台Rarible之间存在一个问题,「如果你没有在OpenSea上正确地删除NFT挂单,这个问题就会被利用。」

答疑图片显示,如果卖家挂售一件NFT商品,后来决定删除挂单,那么正确的方式是支付一笔Gas费用来取消它,如果用户为了节省Gas费,只是简单地将NFT转移到一个不同的以太坊地址,尽管OpenSea的前端挂单不显示了,但当该NFT被发送回原始地址后,它仍然可以在Rarible上被购买。

OpenSea的这个「前端问题」事实上早已以答用户问的方式出现在其帮助中心的页面上。在「我如何取消或调低NFT清单的价格」一问中,OpenSea答复,「请注意,转移NFT不会自动取消清单。在将NFT转移到新的钱包之前,您要取消列表。这确保了该列表不能通过OpenSea实现……取消列表需要支付Gas费,这样才能使其他用户无法使用该NFT。」

如此看来,被人低价买走的NFT很可能是一些用户没有执行挂单取消操作,导致被攻击者利用。

如何在 OpenSea 避免「未撤单」疏漏?

OpenSea「销售列表」取消功能留下的「空子」曾在去年12月底就有披露,此次规模性爆发后导致用户资产受损。

推特名为「yakirrotem」的DeFi开发者、NFT收藏家因此将OpenSea评价为NFT世界的「过时产品」,「它缓慢,用户体验糟糕,用的是旧的智能合约代码,这让你支付了更多的Gas费,对交易者没有好处,他们还有危险的Bug。」

yakirrotem罗列OpenSea的运行方式称,该平台为了节省Gas费,采用了链下呈现价格、链上操作签名交易的方式运行整个系统,「当你列出一个待售(或出价)的项目时,你签名的数据证明你愿意以这个价格出售你的NFT,而签名保存在OpenSea的链下数据库里。当有人想购买你的NFT时,他会发送给他的智能合约,但这一步的签名和销售信息是在链上进行验证的,然后才发生转让。」

yakirrotem强调,当用户取消一个列表时,会被要求执行一个交易,「你可能会问『为什么』,原因是(不这么做的话)有人可能保存你此前的签名清单,因为它是公共的,例如Rarible平台甚至OS API(都能抓取),并在以后使用它。即使你的挂单从UI页面上删除了,但其实上只有链上交易才会保存你取消该交易的事实,即便有人试图使用你之前签署的数据,链上验证也将拒绝该交易。」

此外,将先前挂单的NFT转移回列出它的钱包,也不会阻止这个错误的发生,「重新列出也帮不了你,除非你确保取消了所有之前的清单。」

NFT收藏家图解OpenSea前端问题

「Rarible这样的网站会保存旧的列表,现在攻击者可以使用这些信息来执行销售,因为OpenSea的智能合约相信这个销售是有效的。」yakirrotem指出,OpenSea的另一个大问题是他们没有一次性的订单簿,「所以假如你6个月前创建了一个订单,然后在4个月前又创建了另一个订单,即便你在1天后取消了它,第一个订单仍然有效,尽管它在UI页面上不可见。」

此次「漏洞」造成用户NFT被攻击者「狙击」后,也有一些声音认为是用户自身保管NFT不当所致。而在yakirrotem看来,OpenSea的这些问题并非不可解决,因为另一家最近兴起的NFT交易平台LooksRare就支持用户一次性取消所有订单,「即使你不知何故忘记取列表,这也可以确保你(的资产)更安全。」

如何复查自己的NFT旧挂单是否执行了取消操作?

yakirrotem介绍,用户可以登录Rarible平台查看之前的列表是否还在,「然而,如果你想要100%的安全,那么就把你的NFT转移到另一个从未在OpenSea上架过的钱包里。」

你是否注意到OpenSea有关取消订单的提示?