相關報導:黑客利用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有關取消訂單的提示?