用戶在Web3的黑暗森林中,必須時刻謹惕詐騙,就連知名交易所 Uniswap 都暗藏釣魚詐騙,本文將介紹Uniswap Permit2 釣魚詐騙的詳細解析。
(前情提要:Revoke打詐騙》新功能「錢包簽名儀表板」,20秒取消惡意授權 )
(背景補充:冷錢包新詐騙》購入新Trezor遭植入「微型晶片」,用戶丟失百萬加密貨幣 )
駭客,這是一個讓 Web3 生態中每個人都聞風喪膽的存在,對於專案方來說,在全世界駭客都可能盯著你的情況下,程式碼開源的特性使得專案方開發的時候生怕寫錯一行程式碼留下漏洞,一旦出現安全事故後果難以承擔。
對於個人來說,如果你不懂得你正在做的操作意味著什麼,那麼你進行的每一個鏈上互動或簽名都有可能使你的資產被盜。因此安全問題一直是加密世界中最頭疼的問題之一,並且由於區塊鏈的特性,一旦資產被盜幾乎是沒有辦法可以追回的,所以在加密世界中具備安全知識尤其重要。
就在最近,Beosin 的好朋友菠菜發現了一個近兩個月開始活躍的新釣魚手法,只要簽名就會被盜,手法極其隱蔽且難以防範,並且用過 Uniswap 互動的地址都有可能暴露在風險之下,本文 Beosin 聯合獨立研究員菠菜對這種簽名釣魚手法進行科普,儘量避免大家更多的資產損失。
以下為菠菜的親身經歷複述:
事件經過
最近,一位朋友(暫稱小 A)錢包裡的資產被盜後找到菠菜,與常見被盜方式不同的是,小 A 並沒有洩漏私鑰也沒有和釣魚網站的合約進行互動,於是菠菜開始調查起了這個資產被盜事件。
在區塊鏈瀏覽器中可以看到小 A 錢包被盜的這筆 USDT 是通過 Transfer From 函式進行轉移的,在這進行科普一下,當我們在以太坊上進行 Token 轉帳的時候,其實是呼叫了該 Token 智慧合約的 Transfer 函式,這兩者的區別簡單來說 Transfer 是資產擁有者本人進行操作把 Token 轉移給其他地址,而 Transfer From 是第三方將地址內的 Token 轉移給其他地址。這也就意味著這筆被盜的資產是另外一個地址進行操作把 Token 轉移走的,而非錢包私鑰洩漏。
通過查詢交易細節,我們可以發現一些關鍵線索:
- 尾號 fd51 的地址將小 A 的資產轉移到了尾號 a0c8 的地址中
- 這個操作是與 Uniswap 的 Permit2 合約進行互動的
那麼疑點來了,尾號 fd51 的地址是如何拿到這筆資產的許可權的?為什麼會和 Uniswap 有關係?
首先我們需要知道,要想成功呼叫 Transfer From 這個函式的前提是呼叫方需要擁有這個 Token 的額度許可權,也就是 approve,相信大家有過鏈上操作的一定熟悉不過了,當我們去使用一些 Dapp 的時候,一旦涉及到資產的轉移就需要我們先進行一個授權(approve)操作,這樣 Dapp 的合約才有許可權對我們的資產進行轉移。
要解開這個謎題,我們需要繼續挖掘, 而答案就在尾號 fd51 的地址的互動記錄中 ,在該地址進行 Transfer From 轉走小 A 的資產之前,可以看到該地址還進行了一個 Permit 的操作,並且這兩個操作的互動物件都是 Uniswap 的 Permit2 合約,那麼這個 Permit 函式和 Uniswap Permit2 又是什麼情況?
Uniswap Permit2 合約是 Uniswap 在 2022 年年底推出的新的智慧合約,根據官方的說法,這是一個代幣審批合約,允許代幣授權在不同的應用程式中共享和管理,創造一個更統一、更具成本效益、更安全的使用者體驗。
並且未來隨著越來越多的專案與 Permit2 整合,Permit2 可以在所有應用程式中實現標準化 Token 批准。Permit2 將通過降低交易成本來改善使用者體驗,同時提高智慧合約的安全性。
我們先要了解一下為什麼 Uniswap 要推出 Permit2,我們來假設一個場景,當我們要在某 Dex 上進行 Swap 時,傳統的互動方式是我們需要先授權 (approve) 給這個 Dex,然後再進行 Swap,這通常需要花費我們兩筆 Gas 費,對於使用者來說摩擦成本太大了,相信大家都有過這樣的體驗。
而 Permit2 的推出將有可能改變整個 Dapp 生態的遊戲規則,簡單來說就是傳統的方法是你每跟一個 Dapp 進行資產轉移的互動你都需要進行一次授權,而 Permit2 可以把這個步驟給省去,這樣可以非常有效的降低使用者的互動成本,帶來更好的使用者體驗。
解決方案是 Permit2 作為使用者和 Dapp 之間的中間人,使用者只需要把 Token 的許可權授權給 Permit2 合約,所有整合 Permit2 合約的 Dapp 都可以共享這個授權額度,對於使用者來說,減少了互動成本和提高了使用者體驗,對於 Dapp 來說,使用者體驗的提升帶來更多的使用者和資金,這本是一個雙贏的局面,但同時這也可以是一個雙刃劍,而問題就出在和 Permit2 互動方式上。
在傳統的互動方式中,不管是授權還是進行資金的轉移對於操作的使用者來說都是鏈上的互動。而 Permit2 則將使用者的操作變為了鏈下簽名,而所有鏈上的操作都由中間角色(如 Permit2 合約和集成了 Permit2 的專案方等)來完成,這種方案帶來的好處是由於鏈上互動的角色從使用者轉移為了中間角色,使用者即使錢包裡沒有 ETH 也可以使用其他 Token 來支付 Gas 費或完全由中間角色報銷,這取決於中間角色的選擇。
雖然 Permit2 的出現有可能改變未來 Dapp 的遊戲規則,但是可以看出的是這是一把很強的雙刃劍,對於使用者來說,鏈下簽名是最容易放下防備的環節,比如當我們用錢包登入某些 Dapp 的時候會需要簽名進行連線,而絕大多數人並不會仔細檢查簽名的內容也並不理解簽名的內容,而這就是最可怕的地方。
明白了 Permit2 合約,回到小 A 的事件中我們就明白了為什麼資產被盜都是與 Permit2 合約進行互動了,那麼就讓菠菜來重現這個 Permit2 簽名釣魚手法,首先一個至關重要的前提條件是被釣魚的錢包需要有 Token 授權給 Uniswap 的 Permit2 合約,菠菜發現目前只要在與 Permit2 整合的 Dapp 或 Uniswap 上進行 Swap 的話,都是需要授權給 Permit2 合約的(下圖菠菜使用了安全外掛)。
另外一個很可怕的點是,不管你要 Swap 的金額是多少,Uniswap 的 Permit2 合約都會預設讓你授權該 Token 全部餘額的額度,雖然 MetaMask 會讓你自定義輸入金額,但我相信大部分人都會直接點選最大或預設值,而 Permit2 的預設值是無限的額度…….
這也就意味著,只要你在 2023 年之後與 Uniswap 有過互動並授權額度給 Permit2 合約,你就會暴露在這個釣魚騙局的風險之下。
因為重點就在於之前在尾號 fd51 的地址中與 Permit2 合約互動的 Permit 函式上,這個函式簡單來說就是利用你的錢包將你授權給 Permit2 合約的 Token 額度轉移給別的地址,也就是說只要拿到了你的簽名,駭客就可以拿到你錢包中 Token 的許可權並把你的資產轉移走。
事件詳細分析
permit 函式:
你可以把 Permit 函式看作是一種線上簽署合約的方式。這個函式讓你 (PermitSingle) 可以提前簽署一個 “合約”,允許其他人(spender)在未來的某個時間花費你的一些代幣。
同時,你還需要提供一個簽名(signature),就像在紙質合約上簽名一樣,用來證明這個 “合約” 真的是你簽署的。
那麼這個函式是怎麼工作的呢?
- 首先,它會檢查現在的時間是否超過了你的簽名的有效期 (sigDeadline)。就像你簽署的合約有個有效期一樣,如果現在的時間超過了有效期,那麼這個 “合約” 就不能再用了,程式會直接停止。
- 接著,它會檢查你的簽名是否真的是你簽的。程式會用一個特殊的方法(signature.verify)來檢查這個簽名,確保這個簽名真的是你籤的,沒有被別人偽造。
- 最後,如果檢查都通過了,那麼程式就會更新一下記錄,記下你已經允許其他人使用你的一些代幣。
重點則主要在於 verify 函式和_updateApproval 函式。
verify 函式:
可以看到,verify 函式會從簽名資訊引數中獲取出 v、r、s 三個資料,v、r、s 是交易簽名的值,它們可以用來恢復交易簽名的地址,上圖程式碼中可以看到,合約恢復了交易簽名的地址後,與傳入的代幣擁有者地址進行比較,如果相同,則驗證通過,繼續_updateApproval 函式的呼叫,如果不同,則回滾交易。
_updateApproval 函式:
當通過了簽名校驗後,會呼叫_updateApproval 函式更新授權值,這也就意味著你的許可權發生了轉移。此時,被授權方便可以呼叫 transferfrom 函式將代幣轉移到制定地址,如下圖程式碼。
好了,解釋完 permit 函式,我們來看看鏈上真實交易,我們檢視這個互動的細節可以發現:
- owner 就是小 A 的錢包地址 (尾號 308a)
- Details 中可以看到授權的 Token 合約地址 (USDT) 和金額等資訊
- Spender 就是尾號 fd51 的駭客地址
- sigDeadline 是簽名的有效時間,而 signature 就是小 A 的簽名資訊
而往回翻小 A 的互動記錄我們會發現,小 A 之前使用 Uniswap 的時候點選了預設的授權額度,也就是幾乎無限的額度。
簡單覆盤一下就是,小 A 在之前使用 Uniswap 的過程中授權給了 Uniswap Permit2 無限的 USDT 額度,而小 A 在進行錢包操作的時候不小心掉入了駭客設計的 Permit2 簽名釣魚陷阱,駭客拿到了小 A 的簽名後利用小 A 的簽名在 Permit2 合約中進行了 Permit 和 Transfer From 兩個操作把小 A 的資產轉移走了,而目前菠菜觀察到的是 Uniswap 的 Permit2 合約已經淪為了釣魚天堂,這個 Permit2 簽名釣魚似乎在兩個月前才開始活躍。
並且在互動記錄中可以發現幾乎大部分都是被標記的釣魚地址 (Fake_Phishing),不斷有人上當。
如何防範?
考慮到 Uniswap Permit2 合約可能會在未來更加普及,會有更多專案整合 Permit2 合約進行授權共享,菠菜能想到有效的防範手段有:
1 理解並識別簽名內容:
Permit 的簽名格式通常包含 Owner、Spender、value、nonce 和 deadline 這幾個關鍵格式,如果你想享受 Permit2 帶來的便利和低成本的話一定要學會識別這種簽名格式。(下載安全外掛是一個很好的選擇)
我們向各位讀者朋友推薦下面這款 Beosin Alert 反釣魚外掛,可以識別 Web3 領域的大部分釣魚網站,守護大家的錢包和資產安全。
反釣魚外掛下載:
https://chrome.google.com/webstore/detail/beosin-alert/lgbhcpagiobjacpmcgckfgodjeogceji?hl=en
2 放資產的錢包和互動的錢包分離使用:
如果你有大量資產的話,建議資產都放在一個冷錢包中,鏈上互動的錢包放少量資金,可以大幅減少遇到釣魚騙局時的損失。
3 不要授權過多額度給 Permit2 合約或取消授權:
當你在 Uniswap 上進行 Swap 的時候,只授權你要互動的金額數量,這樣雖然每次互動都需要重新授權會多出一些互動成本,但是可以免於遭受 Permit2 的簽名釣魚。如果你已經授權了額度,可以找相應的安全外掛進行取消授權。
4 識別代幣性質,是否支援 permit 功能:
後續可能越來越多的 ERC20 代幣使用該擴充套件協議實現 permit 功能,對於你來說需要關注自己所持有的代幣是否支援該功能,如果支援,那麼對於該代幣的交易或操縱一定要格外小心,對於每條未知簽名也要嚴格檢查是否是對 permit 函式的簽名。
5 若被騙後還有代幣存在其他平臺,需制定完善的拯救計劃:
當你發現自己被詐騙,代幣被駭客轉移出去後,但自己還有代幣通過例如質押等方式存在其他平臺上,需要提取出來轉移到安全地址上,這時需要知道駭客可能時刻監控著你的地址代幣餘額,因為他擁有你的簽名,只要你的被盜地址上出現了代幣,那麼駭客可以直接轉移出去。這時需要制定完善的代幣拯救過程,在提取代幣和轉移代幣兩個過程需要一起執行,不能讓駭客交易插入其中,可以使用 MEV 轉移,這需要一些區塊鏈知識以及程式碼功底,也可以尋找專業的安全公司比如 Beosin 團隊利用交易搶跑指令碼來實現。
案例閱讀:加密大 V 遭遇 「清道夫」 攻擊,Beosin 安全團隊如何幫其追回資金?
相信在未來基於 Permit2 的釣魚可能會越來越多,這種簽名釣魚方式極其隱蔽且難防,並且隨著 Permit2 的應用範圍越來越廣,暴露在風險下的地址也會越來越多,希望螢幕前的你看到本文後可以傳播給更多人,避免更多人被盜。
📍相關報導📍
Metamask宣布與Opensea「合作防詐騙」,交互釣魚合約將自動跳警告