你的錢包還安全嗎?黑客是如何利用Permit、Uniswap Permit2、授權簽名進行釣魚的

話李話外
2024-09-02 14:53:36
收藏

記得之前群裡有夥伴分享過一句話:如果你不清楚誰在提供收益,那麼你就是提供收益的那個人。我感覺這句話說的很有道理。在加密錢包使用的安全方面也一樣,如果你不確定自己正在做的操作意味著什麼,那麼你進行的每一個鏈上交互或簽名都有可能失去錢包內的資產。

前段時間,Scam Sniffer 發布了一份 2024 年中網絡釣魚報告:在今年的上半年,僅 EVM 鏈(即以太系鏈)上就有 26 萬名受害者被釣魚,累計損失了 3.14 億美元。與去年(2023年)被釣魚攻擊盜走的 2.95 億美元相比,今年僅用了 6 個月就達到了這一數字。如下圖所示。

根據該報告顯示,目前多數 ERC20 代幣的盜竊源於簽署釣魚簽名,如 Permit(離線授權簽名方式)、Increase Allowance(增加授權額度方式)和 Uniswap Permit2,釣魚攻擊無疑仍是鏈上安全問題的重災區。

前幾天有個夥伴反映了一個問題,這位夥伴兩個月前(6月14日)從 Coinbase Wallet 轉了 3 筆錢到 Binance 裡面(基於以太鏈的轉帳),第一筆轉帳是成功的,但後繼兩筆轉帳一直沒有收到,時間已經過去兩個月了,不知道出了什麼問題?

於是,我通過 Etherscan 看了下鏈上的 Token 交易記錄,但只看到了一筆對應的轉帳(Transfer),並沒有看到另外兩筆的記錄。如下圖所示。

我又進一步看了下 6 月 14 日當天所有的鏈上交易記錄,發現確實有 3 筆轉帳(Transfer)記錄,不過後面兩筆顯示是交易失敗的。如下圖所示。

接著,我點開其中一條失敗(Fail狀態)的交易記錄看了一下,顯示的錯誤提示是"合約執行時遇到錯誤",而此類錯誤理論上講,並不會導致錢包內的資產丟失,因為按照 Etherscan 官方文檔的說明,此類錯誤下發送者發送的資產(代幣)並不会離開發送者錢包地址,只會扣除 Gas 費。如下圖所示。

所以,解決這樣的問題需要確認的是:

  • 確定錢包內的資金當天是否真的轉出或丟失(即交易失敗後沒有退回到錢包)

  • 如果確認資產已被轉出或丟失,那麼可能需要聯繫對應網站的客服人員支持一下了(這種情況主要是聯繫發送方或提幣平台,也就是發起這筆轉帳的來源方進一步確認,接收方或到賬地址的平台無法處理)

基於這個問題,我的常規建議是:大家在日常的交易過程中,最好是做一個交易記錄表,比如可以使用 Excel 等工具做好日常的交易(買/賣)記錄、錢款開銷(入賬/出賬)記錄等。然後如果遇到一些問題,這個表還可以配合鏈上的交易記錄進行比較檢查。其實我自己也是有這樣的一個表格的,每做一筆交易,我都會進行詳細的記錄(有些記錄後面也會備註一些交易心得什麼的)。

到此,上面這個問題似乎基本整明白了。但在通過鏈上查詢交易記錄的過程中,我發現這位夥伴的錢包還有一個更嚴重的問題:被黑客盯上了!

怎麼回事呢?我們接著往下看(如下圖所示):

先看上圖紅色框(真實的交易):

錢包持有人剛進行了一筆 1 萬美元的 Swap 操作,並將兌換好的 USDT 轉到了 0x8F 開頭(f103結尾)的錢包中。

再看上圖綠色框(釣魚的交易)

緊接著,黑客就創建了數條虛假交易,而且要注意,黑客創建的地址錢包也是 0x8F 開頭(f103結尾)的。

我們進一步對比下這些錢包地址看看:

下面是錢包持有人的真實地址:

0x8F773C2E1bF81cbA8ee71CBb8d33249Be6e5f103

下面是黑客的錢包地址:

0x8F7cCF79d497feDa14eD09F55d2c511001E5f103

0x8F776d5623F778Ea061efcA240912f9643fdf103

此時大家應該看出問題了吧。這些錢包開頭的 4 位和結尾的 4 位都是相同的,如果不仔細看,可能都不會發現。如果此時直接通過交易記錄複製錢包地址進行轉帳,那麼基本就意味著錢會直接轉給黑客。

因此可以肯定的是,這位夥伴的錢包確實是被黑客盯上了,黑客希望通過釣魚的方式來騙走這位夥伴的資產。而且,通過交易哈希頁面的數據顯示,我們還能夠發現,對應的 Transaction Action 也被標記了 Fake_Phishing,這 100% 就是一個黑客地址。如下圖所示。

補充小知識:為什麼使用 Etherscan 的時候看不到那些無效交易或零轉帳記錄?如何將以太坊瀏覽器設置為簡體中文界面?

這是因為以太坊官方瀏覽器默認是會隱藏掉無效交易和零轉帳記錄,如果你需要查看此類數據,那麼可以通過 Etherscan 的設置頁面,開啟其中的高級功能即可。同樣,如果你喜歡使用簡體中文界面,那麼也可以在設置頁面進行選擇。如下圖所示。或者,你也可以考慮使用諸如 Oklink 這樣的第三方多鏈瀏覽器(也支持簡體中文顯示)。

錢包使用安全問題確實是一個需要特別注意的事情,尤其是針對大額(100萬美元以上)資產的錢包。建議可以把資產根據使用情況分配到不同的錢包,以此來提升安全性,比如我自己的錢包就分了下面的幾級:

一級是用蘋果手機做的冷錢包,就是囤幣用的,斷網狀態且不會做任何的交易/轉帳操作,這部分資產至少 10 年內我是不會考慮動的。當然,如果你希望通過冷錢包進行交易,那麼可以考慮去通過正規渠道購買那些知名的硬件錢包(比如Trezor、Ledger等)

二級是比較大額資金的熱錢包,我使用的是 Trust Wallet,且不會做任何的 dApp 授權,只是與其他自己的錢包進行轉帳,包括與 Binance 的提幣或轉帳操作。

三級是幾十個小錢包,有些是測試用的(比如參與各種新項目的交互去體驗產品或順便撸一下空投),有些是之前買山寨或土狗幣用的(只是這幾年我很少再做這方面的交易了),且每個錢包都是小額資金、幾百-幾千美金不等。這種錢包的日常授權/簽名我就比較隨意了,即便被盜也無所謂。雖然,這些錢包使用和管理上似乎有些麻煩,但主要是為了安全~

總之,不同的人在錢包的使用上可能會有不同的偏好,這個就看自己的個人情況了。老韭菜可能更喜歡將資產存放到鏈上,但對於大部分剛進入這個領域的新人而言,其實直接使用 Binance、OKX 這樣的大所存放資產(不超過 10 萬美元)反而是更安全的。

接下來,我們繼續給大家梳理幾個目前比較常見的釣魚方式:

1.Permit 釣魚攻擊

首先我們需要進行一個基礎知識的科普:當我們在以太坊上進行 Token 轉帳的時候,通常是調用該 Token 智能合約的 Transfer 函數、或 Transfer From 函數來執行的。其中,Transfer 指的是資產擁有者本人進行授權操作並把 Token 轉移給其他地址,而 Transfer From 指的是第三方直接將地址內的 Token 轉移給其他地址。

Permit 釣魚攻擊的攻擊過程如下:

首先,攻擊者通過偽造釣魚鏈接或釣魚網站,誘導用戶通過錢包進行簽名(不上鏈)。

其次,攻擊者調用 Permit 函數完成授權。

然後,攻擊者通過調用 Transfer From 函數,將受害者資產轉出,完成釣魚攻擊。

這種釣魚方式有一個特點,即攻擊者拿到簽名授權後執行 Permit 和 Transfer From 操作,而受害人地址的鏈上交易記錄中默認是看不到授權記錄的,但在攻擊者地址中可以看到。

一般來說,這種簽名授權攻擊是一次性的,不會重複或持續產生釣魚風險。大白話解釋就是:簽名釣魚無法盜走你錢包的助記詞(或私鑰),一次簽名釣魚只能使用一次,且只針對該帳戶對應鏈的對應幣種(比如你授權了USDT、那麼黑客只能盜走你的USDT)。簡單而言就是被釣魚一次簽名,黑客只能用一次,除非你後面繼續進行誤簽被黑客利用。 (上圖來自於bocaibocai@wzxznl)

2.Uniswap Permit2 釣魚攻擊

這種釣魚方式和上面提到的 Permit 類似,都屬於鏈下簽名釣魚。所謂 Uniswap Permit2 是 Uniswap 在 2022 年推出的一種智能合約,根據官方的說法,這是一個代幣審批合約,允許代幣授權在不同的應用程序中共享和管理,創造一個更統一、更具成本效益、更安全的用戶體驗。目前,很多項目都與 Permit2 進行了集成。

最近也看了 bocaibocai(X@wzxznl)寫的幾篇文章,進一步了解了 Uniswap Permit2 這種釣魚攻擊的方式。這裡我簡單給大家做個概要:

當我們要在某 DEX 上進行 Swap 操作時,傳統的交互方式是我們需要先 Approve 給這個 DEX 進行授權,然後再進行 Swap 交易,這通常需要花費我們兩筆 Gas 費,對於用戶來說摩擦成本太大了,而 Permit2 可以把這個步驟給省去,這樣可以非常有效的降低用戶的交互成本,帶來更好的用戶體驗。

也就是說,Permit2 作為用戶和 dApp 之間的中間人,用戶只需要把 Token 的權限授權給 Permit2 合約,所有集成 Permit2 合約的 Dapp 都可以共享這個授權額度,對於用戶來說,減少了交互成本和提高了用戶體驗,對於 dApp 來說,用戶體驗的提升帶來更多的用戶和資金。

這本是一個雙贏的局面,但同時這也可以是一個雙刃劍。在傳統的交互方式中,不管是授權還是進行資金的轉移對於操作的用戶來說都是鏈上的交互。而 Permit2 則將用戶的操作變為了鏈下簽名,所有鏈上的操作都由中間角色(如 Permit2 合約和集成了 Permit2 的項目方等)來完成,這種方案帶來的好處是由於鏈上交互的角色從用戶轉移為了中間角色,但對於用戶來說,鏈下簽名是最容易放下防備的環節,比如當我們用錢包登入某些 dApp 的時候會需要簽名進行連接,而絕大多數人並不會仔細檢查簽名的內容也並不理解簽名的內容(對應普通用戶而言,簽名界面看起來就是一堆代碼),而這就是最可怕的地方。

另外一個很可怕的點是,不管你要 Swap 的金額是多少,Uniswap 的 Permit2 合約都會默認讓你授權該 Token 全部餘額的額度,雖然 MetaMask 等錢包會讓你自定義輸入金額,但估計大部分人都會直接點擊最大或默認值,而 Permit2 的默認值是無限的額度。如下圖所示。

而這也就意味著,只要你與 Uniswap 有過交互並授權額度給 Permit2 合約,你就會暴露在這個釣魚詭計的風險之下。

舉個例子,小李之前使用 Uniswap 的過程中授權給了 Uniswap Permit2 無限的 USDT 額度,而小李在日常進行錢包操作的時候又不小心掉入了黑客設計的 Permit2 簽名釣魚陷阱,黑客拿到了小李的簽名後就可以利用小李的簽名在 Permit2 合約中進行了 Permit 和 Transfer From 兩個操作把小李的資產轉移走。

這種釣魚攻擊方式的具體步驟大致是:

首先,用戶的錢包在被釣魚之前已使用過 Uniswap 並將代幣額度授權給了 Uniswap Permit2 合約(上文已經提到過,Permit2 的默認值是無限的額度授權)。

其次,攻擊者偽造釣魚鏈接或釣魚網站頁面,誘導用戶通過釣魚鏈接或網站進行錢包簽名,然後攻擊者就可以獲取所需的簽名信息(這個步驟和 Permit 釣魚類似)。

然後,攻擊者調用 Permit2 合約的 Permit 函數,完成授權。

最後,攻擊者調用 Permit2 合約的 Transfer From 函數,將受害者資產轉出,完成釣魚攻擊。

一般情況下,這種攻擊方式接收資產的地址會比較多,有些是專門用於實施釣魚的地址(甚至會偽造與被害者錢包地址收尾相同的地址),有些則是專門提供釣魚服務的黑產地址(比如一些DaaS供應商地址、目前針對加密錢包的釣魚似乎也已經形成了一條完整的黑色產業鏈)。如下圖所示。

那麼,該怎麼防範 Permit、Permit2 這種問題呢?

首先可以考慮使用比如 Scamsniffer 這樣的瀏覽器安全插件(我自己的谷歌瀏覽器一直在使用該插件)防範釣魚鏈接,其次就是可以考慮使用 Revoke Cash 這樣的工具來定期檢查並取消那些陌生或不必要的授權或簽名。如下圖所示。

或者也可以考慮直接使用 Scamsniffer 推出的專門針對 Uniswap Permit2 的授權管理工具進行定期檢查,若有異常授權,建議及時取消授權。如下圖所示。

當然,最重要的還是自己的安全意識,不要隨便訪問那些來歷不明的鏈接或網站,平時進行 dApp 交互授權的時候要多進行必要檢查。 (上圖來自於bocaibocai@wzxznl)

補充小知識:如何識別錢包簽名是屬於 Permit、還是 Permit2?

日常進行各種簽名的時候,我們會看到授權確認界面上面會出現一些代碼,我們需要通過這些代碼來進行識別,如下圖所示。

上圖中的 Owner(授權方地址)、Spender(被授權方地址)、Value(授權數量)、Nonce(隨機數)、Deadline(過期時間)。

3.Claim 釣魚攻擊

這種釣魚方式也是非常常見的,比如我們經常刷 X 平台的話,就會發現有很多所謂免費領取空投的信息,甚至有時候我們的錢包裡面也會莫名收到一些空投的 NFT 小圖片(圖片上面可能有個域名地址)。

而如果你點擊進入了指定的釣魚網站,並進行了 Claim 操作,那麼你錢包中的資產可能就會直接被黑客轉走了。

那麼,該怎麼防範這種問題呢?

首先是不要相信那種天上掉餡餅的事情(即不要亂點那些來路不明的免費領域 NFT、空投等鏈接),其次在進行任何 Claim 操作的時候,一定要核實自己訪問的地址是不是真實的官網地址,不要掉以輕心。

4.相似地址轉帳釣魚

今年的 5 月 3 日就發生了這樣一起案例,一個巨鯨遭遇了相同首尾號地址釣魚攻擊,被釣走 1155 枚 WBTC(當時價值約 7000 萬美元)。

慢霧之前針對該事件有過具體的分析,我就不再贅述了,感興趣的小夥伴可以去搜索回顧一下。

這種釣魚方式其實看起來比較簡單:

首先,黑客會提前批量生成大量釣魚地址,這種地址都具有一定的迷惑性,比如首 4 位及尾 6 位與受害者目標轉帳地址一致的地址。

其次,進行分佈式部署批量程序後,根據鏈上用戶動態,向目標轉帳地址發起相同首尾號地址釣魚攻擊。

然後,等目標用戶(受害者)進行轉帳後,黑客立即使用碰撞出來的釣魚地址尾隨一筆交易,這樣釣魚地址就出現在了用戶的交易記錄裡。如下圖所示。

接著,由於用戶習慣從錢包歷史記錄裡複製最近轉帳信息,看到了這筆尾隨的釣魚交易後沒有仔細檢查自己複製的地址是否正確,結果將 1155 枚 WBTC 誤轉給了釣魚地址。

那麼,該怎麼防範這種問題呢?

首先,是可以將常用的地址保存到錢包的地址簿當中(或加入白名單),下次轉帳可以從錢包的地址簿中找到目標地址。其次,要仔細核對地址是否正確,不要只簡單地核對前幾位或者後幾位就進行轉帳,進行大額轉帳之前建議先進行小額轉帳測試。

5.授權簽名釣魚

其實我們上文提到的 Permit、Uniswap Permit2、Claim 也都屬於授權釣魚範疇。而提到授權,還有不少的方式可以被黑客利用,比如另外比較常見的 Approve(即授權,相當於告訴 USDT 的合約,Uniswap可以挪用我錢包中的USDT)、Increase Allowance(增加授權額度)、等等。

而攻擊的方式也基本是:攻擊者通過釣魚鏈接或釣魚網站,或者直接黑了項方的官網掛上木馬,然後誘導用戶點擊並授權錢包。

當然,我們上面也僅是列舉了 5 種目前比較普遍的釣魚攻擊方式,而目前黑客的攻擊手段也是五花八門、層出不窮的。所謂道高一尺魔高一丈,只有你想不到的,沒有黑客想不到的。錢包使用安全問題,不容忽視。

本期內容我們就分享到這裡,更多文章可以通過話李話外首頁進行查看。

聲明:以上內容只是個人角度觀點及分析,僅作為學習記錄和交流之用,不構成任何投資建議。加密領域為極高風險市場,很多項目有隨時歸零的風險,請理性看待,自我負責。

鏈捕手ChainCatcher提醒,請廣大讀者理性看待區塊鏈,切實提高風險意識,警惕各類虛擬代幣發行與炒作,站內所有內容僅係市場信息或相關方觀點,不構成任何形式投資建議。如發現站內內容含敏感信息,可點擊“舉報”,我們會及時處理。
ChainCatcher 與創新者共建Web3世界