前有周杰倫無聊猿NFT被釣魚攻擊,損失超300萬人民幣。
後有全球最大的NFT交易平台之一OpenSea大批用戶遭遇釣魚攻擊,多人資產受損。
可見Web3世界黑客依然猖狂作祟,為了打擊黑客囂張的氣焰,我們將為大家持續輸出乾貨系列文章,教導大家NFT防騙技巧。
本文研究了兩類典型的NFT的釣魚攻擊,一類是盜取用戶簽名的釣魚攻擊,如:Opensea釣魚郵件事件;一類是高仿域名和內容的NFT釣魚網站。跟我們一起看看
「盜取用戶簽名的釣魚」
2022年2月21日,全球最大的加密數字藏品市場Opensea遭遇黑客攻擊。根據Opensea官方回复,有部分用戶由於簽署了給黑客的授權而導致用戶NFT被盜。
我們將本次事件再次復現一下,在本次事件攻擊事件中,攻擊者信息如下:
攻擊者地址(Fake_Phishing5169):
0x3e0defb880cd8e163bad68abe66437f99a7a8a74
攻擊者合約(Fake_Phishing5176):
0xa2c0946ad444dccf990394c5cbe019a858a945bd
攻擊者獲得相關NFT的交易具體如下圖所示:
針對其中一筆交易進行分析,
0xee038a31ab6e3f06bd747ab9dd0c3abafa48a51e969bcb666ecd3f22ff989589,具體內容如下:
由上圖可知,攻擊者是獲得了用戶的授權,之後直接調用transferfrom方法將用戶的NFT盜走。
根據Opensea的CEO Devin Finzer發布的twitter,攻擊者是通過釣魚的方式獲取到用戶在Opensea上的掛單授權。
通過分析攻擊交易,黑客攻擊主要分為以下三個步驟。
1.構造正確的待簽名交易;
2.誘騙用戶點擊授權;
3.獲取用戶簽名後構造攻擊合約盜取用戶NFT。
步驟一
首先對攻擊者構建的交易簽名內容進行分析,跟踪函數調用棧發現具體的簽名信息如下:
由上圖可知,簽名的計算方式為:keccak256(“\x19 Ethereum Signed Message:\n32”, hashOrder(order));這種簽名方式會在order前再加一個消息前綴:’\x19 Ethereum Signed Message:\n32’,以確保改簽名不能在以太坊之外使用。之後將加上消息前綴的完整數據再計算keccak256值,最後用私鑰進行簽名。
但是該方式僅能聲明所有權,無法防止重放攻擊。如:用戶A簽署了消息發送給合約M,另一用戶B可以將這個簽名重放給合約N。下圖為訂單簽名中具體涉及到的信息。
其中涉及到的簽名主要參數為:
-
Side:買入或賣出
-
paymentToken:用於支付訂單的代幣類型
-
basePrice:訂單中NFT的價格
-
maker:訂單發出地址
-
taker:接收訂單的目標地址
上述簽名信息中包含訂單金額、目標地址等敏感信息,但是經過keccak256計算Hash後的值只是一串二進製字符串,用戶無法識別。
攻擊者根據上述Order信息構造簽名,可以隨意將上述簽名中涉及到的basePrice參數金額設置為0,接收地址設置為自己等。
步驟二
攻擊者構造好待簽名數據後就可以誘騙用戶點擊授權。由於簽名的元數據是經過Keccak256計算後得到的包含0x的66個十六進製字符,用戶無法得知其代表的具體含義,因此可能直接點擊簽名,使得攻擊者獲得了用戶的掛單授權。
上圖中的簽名對於用戶來說類似盲簽,即所籤的消息內容對簽名人來說是盲的,簽名人不能看見消息的具體內容。
步驟三
在步驟二中攻擊者獲取到ECDSA簽名消息中的R、S、V值,即可利用其構造攻擊合約盜取用戶NFT。下圖為OpenSea: Wyvern Exchange v1合約中驗證order的函數validateOrder(),具體源碼如下:
由源碼可知,訂單驗證首先會校驗order的有效性和是否包含有效參數,接著校驗訂單是否曾經通過鏈上校驗。其中approvedOrders是一個mapping變量,該變量保存了所有已經通過鏈上批准驗證的訂單。如果訂單曾經校驗過則直接返回true,無需再使用ecrecover()校驗ECDSA 簽名,以便智能合約可以直接下訂單。
以下是其中一筆NFT盜取交易,可以發現攻擊者利用用戶簽名通過調用攻擊者合約(Fake_Phishing5176):
0xa2c0946ad444dccf990394c5cbe019a858a945bd,以0 ether的價格盜取了用戶的NFT。
綜上,該類事件主要是因為用戶在簽署交易簽名時,由於簽署的交易內容是加密後的字符串,導致用戶無法直觀的看到簽署交易的具體內容,習慣性的點擊確認,從而造成攻擊者獲取到用戶的賣單權授權,盜走用戶的NFT。
「高仿域名的NFT釣魚」
這一類的釣魚網站主要是對NFT項目官網的域名和內容等進行幾乎一致的模仿,一般會先連接用戶錢包查詢用戶餘額之後,再進行其他誘騙操作。這種釣魚網站是最常見的,主要分為以下幾種類型:
1 僅更換原官網的頂級域名
案例一
官網:https://invisiblefriends.io/
釣魚網站:https://invisiblefriends.ch/
查看釣魚網站的網頁源碼,可以發現如下攻擊地址:
查看
0xEcAcDb9FA4Ed4ACD8977821737da7bCe688be1e0的相關交易:
可以發現上述兩筆交易是攻擊者獲取到的收益。
案例二
官網:https://cyberbrokers.io/
釣魚網站:https://cyberbrokers.live/
查看釣魚網站源碼,發現如下攻擊地址:
2 主域名添加單詞或符號進行混淆
有的釣魚網站會在主域名添加單詞或符號進行混淆,比如othersidemeta-airdrop、otherside-refunds.xyz等。
官網:https://otherside.xyz/
釣魚網站:http://othersidemeta-airdrop.com/
查看釣魚網站源碼,發現頁面存在setApprovalForAll()函數,該函數會授權_operator具有所有代幣的控制權。如果用戶授權了攻擊者,則用戶賬號中所有的NFT將會被盜走。
3 添加二級域名進行混淆
有的釣魚網站會添加二級域名進行混淆,進行釣魚欺騙。
官網:https://www.okaybears.com/
釣魚網站:https://okaybears.co.uk/
查看網頁源碼,根據solana web3的官方文檔API,確認如下地址為攻擊地址:
在如今釣魚事件頻發的情況下,用戶需提高安全意識,保護自己。以下是我們的安全建議:
1 簽名時應當明確簽署的交易內容,包括交易價格、交易地址等信息,如下圖紅框處內容所示:
如果存在簽署內容僅為二進製字符串內容等無法明確的內容,請勿簽署。
2 切勿點擊任何郵件中的鏈接、附件,或輸入任何個人信息。
3訪問NFT官網時,一般在官網右上角等處會顯示官方twitter、discord等社交帳號,需在官方賬號上確認官網地址。
4安裝釣魚插件,可輔助識別部分釣魚網站。比如下面這一款(複製鏈接谷歌瀏覽器直接安裝)
https://chrome.google.com/webstore/detail/beosin-alert/lgbhcpagiobjacpmcgckfgodjeogceji?hl=zh-CN