背景:NFT 市场 OpenSea 首席执行官 Devin Finzer 周六表示,OpenSea 正在调查一起黑客攻击事件,部分用户价值 170 万美元的 NFT 被盗。
作者:Xing 丨 Web3Caff 经授权发布
还是写一篇文章来复盘一下近来 OpenSea 用户被盗事件,算是对更多用户的提醒吧。
首先 OpenSea 官方发过这样一封邮件通知用户,大意是说 2 月 18 号开始到 2 月 25 日,你要迁移你的 Listing Order,如果你不迁移的话届时卖单会过期。
OpenSea 然后到了开始迁移卖单的日期,很多用户报道了自己 NFT 被盗事件,看到的消息被盗用户都称进行过卖单迁移操作。同时 OpenSea 官方定义此次为 “phishing attack”(钓鱼攻击)。
21 号 @kop_17173 在推特里让我看看这次黑客是如何进行攻击的,并提供了发起本次攻击的合约地址,本人根据该合约的行为推断了这次 attack 的过程。
如何攻击
- 黑客首先知道了 OpenSea 需要用户对其卖单进行迁移,并且知道 OpenSea 官方提前发出了迁移日期和操作步骤的邮件。
- 黑客提前做好了钓鱼网站,并且通过伪造的邮件通知用户进行迁移操作,引导受害用户在该钓鱼网站上进行卖单迁移操作。这个迁移操作就是让用户对其销售的卖单进行签名,然而签名的卖单价格是 0。
- 黑客拿到用户签了名的卖单信息,通过调用 OpenSea 的交易合约就能以 0 的价格完成交易,顺利拿到受害者的 NFT。
我们以黑客的这笔 Transaction 交易为例,这笔交易总共盗走了 7 个 NFT:
通过这笔交易的 EventLog 来看,这笔交易中有一个事件(OrdersMatched)就是 OpenSea 的交易合约 Wyvem 发出来的,下面截图底部的红框可以看到这笔订单成交的金额是 0。
OpenSea 上述这个 OrdersMatched 的 Event 是 OpenSea 交易合约成交之后才会发出的,所以断定黑客是通过该攻击合约去调用 OpenSea 的交易合约完成了 price 为 0 的交易。
下图是 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 官方公布的为准!
一点提醒
这里提醒下大家,所有邮件中的发件人是可以伪造的,而且是很方便伪造,所以不能以邮件发送人来判断是否是官方发来的邮件!
另外点击邮件中的链接之后,一定要注意:
- 浏览器显示的地址是不是你要访问网站的地址(注意不要有拼写错误)
- 浏览器显示的链接是不是 HTTPS 的链接,如果不是 HTTPS 的链接,浏览器地址栏那里会显示 “不安全的链接”,这个时候不要访问了。
只要保证以上两点,就能够识别到绝大多数的钓鱼网站。
另外千万别在电脑上乱装应用,因为该应用有可能在你电脑上偷偷装了个根证书,这样就能让你访问钓鱼网站的时候,浏览器地址栏可以显示与官方网站一模一样的网址,同时还能显示该链接是安全的!所以千万别乱装未知应用,特别是未知网友给你发的应用!
最后如我之前这篇关于 OpenSea 交易及 NFT 的技术分析文章所说,大家在 MetaMask 上进行 Approve 和 SetApprovalForAll 这类的交易授权时需要特别小心,看看当前网站和授权的对象是否有问题。因为一旦授权,该地址就有权利转走你的 NFT。
最后在 OpenSea 上对卖单进行签名时,也注意一下 MetaMask 弹出要求你签名的内容,看看价格是不是你希望的售出价格。
如上面这个截图,MetaMask 中签名信息往下滑,basePrice 显示的就是卖单信息中的售价,减去 18 个 0 看看是不是你希望售出的价格。如果钓鱼网站要你签名的话,这个价格会是 0 或者特别低,你对这个卖单签名之后,黑客就能以 0 或者低价买走你的 NFT。
最后
安全是一个系统性工程,三言两语绝对不会让大家明白。求个关注,我推特上也已经不定期的分享过很多即时的安全问题了。希望大家也能从一些信息碎片中慢慢学会在区块链这个狂野且不受监管的世界中保护好自己资产。
愿 Crypto 天下无贼!
免责声明:作为区块链信息平台,本站所发布文章仅代表作者及嘉宾个人观点,与 Web3Caff 立场无关。文章内的信息仅供参考,均不构成任何投资建议及要约,并请您遵守所在国家或地区的相关法律法规。