复盘OpenSea用户NFT被盗事件

还是写一篇文章来复盘一下近来OpenSea用户被盗事件,算是对更多用户的提醒吧。

首先OpenSea官方发过这样一封邮件通知用户,大意是说2月18号开始到2月25日,你要迁移你的Listing Order,如果你不迁移的话届时卖单会过期。

OpenSea通知迁移卖单的邮件
OpenSea通知迁移卖单的邮件

OpenSea然后到了开始迁移卖单的日期,很多用户报道了自己NFT被盗事件,看到的消息被盗用户都称进行过卖单迁移操作。同时OpenSea官方定义此次为“phishing attack”(钓鱼攻击)。

21号 @kop_17173推特里让我看看这次黑客是如何进行攻击的,并提供了发起本次攻击的合约地址,本人根据该合约的行为推断了这次attack的过程。

如何攻击

  1. 黑客首先知道了OpenSea需要用户对其卖单进行迁移,并且知道OpenSea官方提前发出了迁移日期和操作步骤的邮件。
  2. 黑客提前做好了钓鱼网站,并且通过伪造的邮件通知用户进行迁移操作,引导受害用户在该钓鱼网站上进行卖单迁移操作。这个迁移操作就是让用户对其销售的卖单进行签名,然而签名的卖单价格是0。
  3. 黑客拿到用户签了名的卖单信息,通过调用OpenSea的交易合约就能以0的价格完成交易,顺利拿到受害者的NFT。

我们以黑客的这笔Transaction交易为例,这笔交易总共盗走了7个NFT:

黑客转走的NFT
黑客转走的NFT

通过这笔交易的EventLog来看,这笔交易中有一个事件(OrdersMatched)就是OpenSea的交易合约Wyvem发出来的,下面截图底部的红框可以看到这笔订单成交的金额是0。

OpenSea交易合约发出的事件日志
OpenSea交易合约发出的事件日志

OpenSea上述这个OrdersMatched的Event是OpenSea交易合约成交之后才会发出的,所以断定黑客是通过该攻击合约去调用OpenSea的交易合约完成了price为0的交易。

下图是OpenSea交易合约的部分代码,实际上在OpenSea完成一个交易,如果是买家发起操作的话,则会做以下几步判断:

  1. 验证提交的买单参数是否正确
  2. 验证提交的卖单的参数是否正确,以及是否有卖家的正确签名
  3. 验证买单的参数是否匹配卖单的条件(例如价格,有效期等)
OpenSea交易合约代码
OpenSea交易合约代码

如果这几项都校验通过,则OpenSea的交易合约则会调用NFT转移之类的操作完成交易,并在最后发送“OrdersMatched”事件来记录这次交易。

所以这次攻击事件中,黑客能够盗取到NFT就是通过钓鱼拿到用户报价为0的卖单信息(“sell”)以及签名(“sellSig”)。

之前我在推特中分析过一些BAYC以很低的价格被黑客买走,也是因为黑客拿到了BAYC拥有者曾经在OpenSea挂出过的带有签名的低价卖单信息,然而用户又忘记了取消挂单导致的。

所以这两次攻击的本质都一样,就是黑客手上有低价、且带有owner签名的卖单信息。不过这次攻击黑客获取卖单信息的方式是通过邮件钓鱼而已。

一点猜想

以上攻击过程和手段是通过推友告知的黑客攻击合约信息,以及看见被盗用户都是进行了卖单迁移操作这些信息推断出来的。虽然目前我还没有看到被盗用户发出的卖单迁移的钓鱼邮件及钓鱼网站,但个人觉得八九不离十。

但是对于这个攻击合约地址的部署时间,差不多是一个月以前了,而第一次发起攻击交易是在2月19号,也就是OpenSea开始迁移卖单没多久,相当于这个黑客提前部署了攻击合约并潜伏了一个月左右。

我这里猜测一下,怀疑可能是OpenSea内部有信息泄漏(内鬼或者内网被攻破),所以黑客才能精准地发起一系列攻击行为:

首先黑客可能在一个月以前就得知了OpenSea要升级合约,OpenSea会要求用户迁移卖单,所以黑客提前部署了一个攻击合约

接着黑客做了个钓鱼网站,专门用来骗取用户进行订单迁移,但实际上是让用户对售价为0的卖单进行签名。正因为OpenSea提前通知了所有用户官方会在那个时间段要求用户进行迁移,所以这个时候黑客发出的钓鱼邮件以及迁移订单的钓鱼操作都会让用户放松警惕。

另外我看黑客盗取的NFT大多都是BAYC,Doodles,CloneX,Azuki这类蓝筹,而黑客又能精准定位到钓鱼邮件的发送对象是蓝筹NFT的owner用户,而我这个无蓝筹NFT的Jpeg收藏者并没有收到钓鱼邮件,所以推测黑客算是精确打击。

因为迁移卖单而导致NFT被盗的用户,可以联系我将钓鱼邮件发给我,我也判断一下我的猜测是否准确。不过最终的调查结果以OpenSea官方公布的为准!

一点提醒

这里提醒下大家,所有邮件中的发件人是可以伪造的,而且是很方便伪造,所以不能以邮件发送人来判断是否是官方发来的邮件!

另外点击邮件中的链接之后,一定要注意:

  1. 浏览器显示的地址是不是你要访问网站的地址(注意不要有拼写错误)
  2. 浏览器显示的链接是不是HTTPS的链接,如果不是HTTPS的链接,浏览器地址栏那里会显示“不安全的链接”,这个时候不要访问了。

只要保证以上两点,就能够识别到绝大多数的钓鱼网站。

另外千万别在电脑上乱装应用,因为该应用有可能在你电脑上偷偷装了个根证书,这样就能让你访问钓鱼网站的时候,浏览器地址栏可以显示与官方网站一模一样的网址,同时还能显示该链接是安全的!所以千万别乱装未知应用,特别是未知网友给你发的应用!

最后如我之前这篇关于OpenSea交易及NFT的技术分析文章所说,大家在MetaMask上进行Approve和SetApprovalForAll这类的交易授权时需要特别小心,看看当前网站和授权的对象是否有问题。因为一旦授权,该地址就有权利转走你的NFT。

授权NFT转移调用方法,右上角是授权的地址
授权NFT转移调用方法,右上角是授权的地址

最后在OpenSea上对卖单进行签名时,也注意一下MetaMask弹出要求你签名的内容,看看价格是不是你希望的售出价格。

OpenSea挂出卖单签名信息
OpenSea挂出卖单签名信息

如上面这个截图,MetaMask中签名信息往下滑,basePrice显示的就是卖单信息中的售价,减去18个0看看是不是你希望售出的价格。如果钓鱼网站要你签名的话,这个价格会是0或者特别低,你对这个卖单签名之后,黑客就能以0或者低价买走你的NFT。

最后

安全是一个系统性工程,三言两语绝对不会让大家明白。求个关注,我推特上也已经不定期的分享过很多即时的安全问题了。希望大家也能从一些信息碎片中慢慢学会在区块链这个狂野且不受监管的世界中保护好自己资产。

愿crypto天下无贼!

Subscribe to Xing
Receive the latest updates directly to your inbox.
Verification
This entry has been permanently stored onchain and signed by its creator.