Cobo 安全團隊:區塊鏈安全交易指南
作者:Cobo 安全團隊
前言
隨著比特幣 ETF 的通過,區塊鏈市場開始回暖。幣價的回升讓行業逐漸恢復了往日的繁榮。與此同時黑客活動也開始活躍起來。Cobo 安全團隊觀察到近一兩個月釣魚案件發生的頻率也有所增加。
近期 Restaking, BTC L2 等新的應用熱點開始湧現,鏈上交易逐漸成為 Web3 用戶日常不可或缺的一部分,越來越多的用戶資金也在往鏈上轉移。
而與交易所等中心化應用不同,鏈上應用的賬戶安全需要通過用戶自己保障。安全地進行區塊鏈交易是 Web3 原住民最基本的能力。儘管很多基礎設施如瀏覽器插件錢包,甚至瀏覽器本身都對針對釣魚有一定的風險提醒,但用戶因不安全交易導致資產損失的事件還是時有發生(如私鑰洩露,簽名釣魚等)。
Cobo 安全團隊通過整理鏈上交易過程中常見的風險點,編寫了交易安全的執行準則,旨在讓用戶在交易過程中規避風險,保障資金安全,防範釣魚攻擊。
在開始介紹之前,Cobo 安全團隊為大家總結了安全交易的核心準則,如下:
1、拒絕盲簽,不理解的交易、消息不簽名;
2、不厭其煩,反復驗證。
如何進行安全交易
一個完整的 DApp 交易流程包含多個環節:錢包安裝、訪問 DApp 、連接錢包、消息簽名、交易簽名、交易後處理。其中每個環節都存在一定的安全風險,下面將依次介紹實際操作中的注意事項。
注:本文主要介紹以太坊及各 EVM 兼容鏈上的安全交互流程,其他非 EVM 鏈使用的工具和具體的技術細節可能不同。
錢包安裝
目前 DApp 的主流使用方式是使用瀏覽器插件錢包進行交互。EVM 鏈使用的主流錢包有 Metamask 和 Rabby 等。
Cobo 安全團隊在深度體驗後,基於風險提示的角度,推薦使用 Rabby 插件錢包來作為主要的鏈上交互錢包。其原因在於:相較於 Metamask 錢包,Rabby 錢包提供交易數據解析、交易模擬執行、交易風險預警、授權查詢和歷史簽名數據查詢等功能,在針對釣魚防範上會比 Metamask 錢包具有更大的優勢。
安裝 Chrome 插件錢包,需要確認從 Chrome 應用商店中下載安裝,不要從第三方網站安裝錢包,避免安裝有後門的錢包軟件。
有條件的用戶建議聯合使用硬件錢包,在私鑰保管上可以更大程度地提高整體的安全性。
訪問 DApp
網頁釣魚是 Web3 攻擊中的常見攻擊手法,典型案例是以空投名義誘導用戶訪問釣魚 DApp 應用,在用戶連接錢包後誘導用戶簽署代幣授權、轉賬交易或代幣授權簽名,導致用戶資產遭受損失。
因此在訪問 DApp 時,用戶需要保持警惕,避免進入網頁釣魚的陷阱。
在訪問 DApp 前應該確認 DApp 網址的正確性。建議:
儘量不要從 Google 搜索關鍵字第一名直接進行訪問,釣魚攻擊者可通過購買廣告位使自己的釣魚網站搜索排名置頂,因此第一名不一定是官方網站。
避免直接點擊 x.com 及各類社交軟件中其他用戶的評論、消息中發布的網址,這類網址很可能是釣魚鏈接。
反復確認 DApp 網址正確性後進行訪問,可根據 DefiLlama 等 DApp 市場、項方官方 X 賬號、Google 搜索結果多方校對。
確認安全的網站添加過瀏覽器收藏夾中,後續直接從收藏夾中訪問。
在已經打開 DApp 網頁之後,也需要對地址欄進行安全檢查:
檢查域名、網址。通常 DApp 會使用比較簡潔的域名和網址。如 https://app.uniswap.org/;如果遇到特別長的域名,形如 https://zk-polyhedra.network-8jb.xyz/或與知名網站名稱類似的域名,如 https://pufffer.fi(注意多了個 f),則很可能是登入的釣魚網站,應立刻退出。識別域名時也要特別注意 1il, oO0 等各類形近字符的情況。
檢查瀏覽器 https 鏈接情況。目前主流 DApp 均使用 https 鏈接,瀏覽器應該顯示🔒狀標誌。如果不是 https 鏈接或瀏覽器提示證書異常的情況,則訪問的可能不是官方網站或遭遇了劫持攻擊,應該立刻停止訪問。
目前市面上主流瀏覽器插件錢包都已經集成了一定的風險提示功能,如 Metamask/Phantom 等。在訪問一些位於黑名單中的風險網址時,瀏覽器插件錢包甚至 Chrome 瀏覽器本身都可能會展示強安全提示(見下圖)。
連接錢包
進入 DApp 後,可能會自動或在主動點擊 Connect 後觸發連接錢包的操作。插件錢包會針對當前 DApp 的進行一些檢查、信息展示等。
以下是 Rabby 錢包給出的網頁審查信息,可用來輔助進行 DApp 真實性的判斷。
在連接錢包後,通常在用戶沒有其他操作時,DApp 不會主動喚起插件錢包。如果網站在登入後 DApp 頻繁喚起錢包要求簽名消息、簽署交易,甚至在拒絕簽名後仍會不斷彈出簽名的情況,那麼也很可能是釣魚網站的情況,需要謹慎處理。
消息簽名
在極端情況下,比方說攻擊者攻擊了協議的官方網站或通過前端劫持等攻擊,對頁面內容進行了替換。普通用戶很難在這種場景下對網站安全性進行甄別。
此時插件錢包的簽名是用戶保存自身資產的最終屏障。只要拒絕掉惡意簽名,就能保障自身資產不受損失。用戶在簽名任何消息和交易時都應該仔細審查簽名內容,拒絕盲簽。
從技術上講,目前以太坊中常見的簽名類型有三類:
哈希簽名 eth_sign :針對某個數據的原始 hash 進行簽名。hash 的原始數據可能是消息甚至以太坊交易。
消息簽名 personal_sign :針對數據明文進行簽名,在用戶登錄驗證或許可協議確認時最為常見。
結構化數據簽名 eth_signTypedData(EIP-712) :針對 DeFi 協議中使用的數據對象的簽名,常見的如 ERC20 Permit 授權簽名、NFT 掛單簽名等。
針對消息簽名的風險判別,用戶可遵循以下準則:
自然語言簽名通常可以放行。這類簽名通常 personal_sign,用於登錄確認或者確認產品須知,為大段的自然語言描述(而非數字、十六制等形式)。此類消息因為包括自然語言,字符串比較複雜,智能合約處理比較困難,因此通常不會用於鏈上鑑權,只是網站用於確認地址身份。因此相對風險較低。
禁止直接簽名 16 進制原始 hash。這類簽名通常是 ethsign 簽名,這類簽名最為危險,因為用戶無法判斷 hash 原本的數據內容是什麼。因此大部分錢包已經禁用了針對原始哈希(16 進制數據)簽名的功能。Metamask 錢包,可在 設置 -> 高級 -> Ethsign 請求選項卡中確認其配置為關閉狀態。Rabby 錢包,相關配置默認禁用的,無需額外配置。
結構化數據簽名仔細檢查簽名內容。如 ERC20 Permit 授權簽名則要檢查其中 spender 地址是否符合預期,如為 EOA 地址則很可能是點擊了釣魚簽名,應該立即拒絕。
針對消息簽名,這裡需要額外注意的是,儘管在瀏覽器插件錢包中 ethsign 操作是默認禁止的,但錢包仍可通過 personalsign 對 hash 類的數據進行簽名。這類簽名不會導致 permit 授權或發起交易。但個別協議(如一些 AA 錢包)仍可能使用 personal_sign 簽名進行鑑權。為避免損失原則上還是不對 16 進制數據進行簽名。這類簽名效果如下:
交易簽名
簽名交易要遵循不盲簽的原則。 目前許多插件錢包會針對待簽名消息進行解碼並展示相關內容,如下是 Rabby 錢包對一筆 DEX 交易的解析示例:
其中用戶可以查看交易的目標地址的一些相關信息,如是否為 EOA地址、地址餘額以及合約部署時間等。用戶可以根據這些信息對要簽署的交易進行風險判斷。例如如果交互的地址為 EOA 地址,或交互的合約部署時間小於 7 天,則可以認為該操作具有較大風險,應充分調查後再進行操作。
對於開源協議,主流的瀏覽器插件錢包已經支持對交易數據的解析,通過查看 ABI 解碼後的交易內容,可以更加清楚地了解當前在進行什麼操作。合約調用的函數名可以提供一些其功能的參考:如 approve、swap、transfer、deposit 和 withdraw 等。
Rabby,imToken 錢包還集成了模擬執行功能,用戶在交易確認前可以直接看到交易執行結果,通過交易模擬執行,用戶可以查看到當前交易會導致的各種資金轉移情況。用戶應該仔細檢查,對於不符合預期執行結果拒絕簽名。
對於有一定技術儲備的用戶,在自動化工具無法順利解析交易的情況,也可使用一些常見的人工檢查方法:
通過複製交互目標合約地址到區塊鏈瀏覽器如 etherscan 中進行審查,審查內容主要包括合約是否開源,近期是否存在大量交易和 Etherscan 是否為該地址打上官方標籤或惡意標籤。
在遇到插件錢包無法識別的交易,可以通過手動複製原始交易數據(raw_data,通過 16進制數據展示)中的前8位數字到 https://openchain.xyz/signatures 進行查詢,得到原始的函數名稱,以大概確定交易的行為。
使用 Phalcon, Tenderly 和 Dedaub 等交易模擬工具進行模擬執行,查看交易具體執行細節。
交易後處理
在躲過了釣魚網頁和惡意簽名後並不意味著萬事大吉,交易後也仍需進行風險管理。
交易後應及時查看交易的上鏈情況,確認其與簽名時預期的狀態是否一致。如果發現異常及時進行資產轉移、授權解除等止損操作。
ERC20 Approval 授權管理也十分重要。有些案例中用戶對某些合約進行了代幣授權後,多年後這些合約遭受攻擊,攻擊者利用了被攻擊合約的代幣授權額度來竊取用戶資金。
為避免此類情況 Cobo 安全團隊建議用戶遵循以下標準來進行風險防範:
最小化授權。當進行代幣授權時,應根據交易的需求有限量的授權相應的代幣數量。如某次交易需要授權 100 USDT,則本次授權數量即限制為 100 USDT,而不要使用默認的無限授權。
及時撤銷不需要的代幣授權。通過 Rabby 錢包的 Approval 功能或者登錄 revoke.cash 查詢對應的地址的授權情況,撤銷較長時間沒有交互的協議的授權,防止協議後續存在漏洞導致利用用戶的授權額度造成資產損失。
其他技巧
除了上述交易流程中的風險外,合理利用通過某些工具中集成的功能也可以規避一些風險。
某些錢包內置錢包導入功能(如 Rabby)。可以通過導入其他移動端錢包的地址,在進行交易時可以進行強制的二次確認(需要喚醒錢包、掃碼和輸入密碼確認)來減緩釣魚風險。同時享有移動端錢包的交易安全檢查(白名單、模擬執行和釣魚提示等)
某些錢包支持導入的觀察者錢包(如 Rabby,OneKey,TokenPocket,imToken 等),通過觀察者錢包進入一些陌生的網站。仍會正常喚起消息簽名或發起交易的頁面,此時可仔細查看待簽名內容。同時因為沒有私鑰,不必擔心誤操作確認的情況。
通過 Rabby 錢包的 Approvals 功能查詢地址的授權情況,及時撤銷高危授權。Tips: Rabby 在該功能中使用了多個維度(歷史授權鏈接總金額/24h 取消授權數量/授權時間/授權資產數量)來對授權風險進行評判,可以更有效幫助用戶識別授權風險。
誤操作簽名後,通過 Rabby 錢包的 Signature Record 功能及時檢查自己簽名過的交易和文本數據,及時排查授權風險。
在具備了風險意識和做了充足的風險防範的情況下,也仍要進行有效的資金隔離,在極端情況下降低資金的受損程度。Cobo 安全團隊推薦大家使用以下方案來進行資金存放:
使用 Gnosis Safe 多簽錢包或冷錢包存放大資金;
使用瀏覽器錢包生成的地址或者其他 EOA 錢包存放小資金用戶交互,並定期更換熱錢包地址。
如果不小心真的發生被釣魚的情況,可以立即執行以下操作來降低損失:
Revoke.cash 及時取消授權;
如果簽名了釣魚 permit 消息且資金未被轉走,則立刻簽名新的消息並發起 permit 調用使釣魚消息 nonce 失效;
必要時轉移賬號資金。
如何安全領取空投
發放空投是目前項方用於吸引用戶的常見方式,同時也是用戶被釣魚攻擊的重災區。為此,基於上文的安全交易準則,Cobo 安全團隊為大家整理了一套用於領取鏈上空投的安全交互流程:
先使用 Rabby 觀察者錢包測試一遍交互流程,確認無代幣授權、代幣轉賬類交易。
領取空投過程中不進行 Permit 類消息簽名。不進行 Approve 合約調用。
儘量使用「小號」領取空投。
領空投交易查看模擬執行結果,確認無代幣轉出。
插件工具選取
區塊鏈安全守則的內容很多,有可能不是每次交互都能做到細致的檢查,那麼是否存在一種好用的瀏覽器插件來輔助我們做出風險判斷呢?
Cobo 安全團隊體驗了市面上較為主流的交易風險檢查插件,並從「釣魚網頁攔截」 、「惡意授權地址檢查」 和「是否開源」三個維度整理成表格,大家可以根據自身情況選擇使用,如下: