Opensea 这个漏洞真的是坑惨一些大户了。
今天研究了一下 Opensea 的交易流程:
出售 NFT 时先调用一次此 NTF 合约的 setApprovalForAll 方法,将此 NFT 合约的所有 Token 质押给 OpenSea 的 Proxy 合约。(为什么不是质押单个,OpenSea 可能是为了节约大家的 Gas 费以便无 Gas list 此合约下的其他 Token)

将出售金额、售卖时间等数据进行一次签名保存在 OpenSea 的链下数据库中(用户修改售价时只需要重新进行一次链下签名只能降价不许涨价原因后面说)
购买 NFT 时会获取此 NFT 保存在 OpenSea 上的链下交易签名数据,作为一个参数传入 atomicMatch_,如果符合条件将调用 NFT 合约进行转移(NFT 已经质押过)。

此次问题在于 OpenSea 链下签名数据是公开可获取的,可使用之前的签名数据进行交易,这也是 OpenSea list 之后只允许降价,涨价需要调用 Proxy 合约 cancel 的原因。
这次被攻击的几个大户都是 NFT 之前已经 list ,后来某种原因不想卖了,NFT 转给了自己其他账号。等价格大涨,这时又想高价卖了,重新转入。此时攻击者使用之前 list 的签名以当初的价格买入。
这是OpenSea 的锅呢?还是客户的锅?🐶

