BTC
ETH
HTX
SOL
BNB
查看行情
简中
繁中
English
日本語
한국어
ภาษาไทย
Tiếng Việt

簽名就被盜?警惕Uniswap Permit2簽名釣魚手法

星球君的朋友们
Odaily资深作者
2023-06-10 08:30
本文約3999字,閱讀全文需要約6分鐘
用過Uniswap 交互的地址都有可能暴露在風險之下。
AI總結
展開
用過Uniswap 交互的地址都有可能暴露在風險之下。

*本文由Beosin 特邀獨立研究員菠菜菠菜! (twitter@wzxznl)與Beosin 安全研究員Sivan 共同創作發布。

黑客,這是一個讓Web3生態中每個人都聞風喪膽的存在,對於項目方來說,在全世界黑客都可能盯著你的情況下,代碼開源的特性使得項目方開發的時候生怕寫錯一行代碼留下漏洞,一旦出現安全事故後果難以承擔。

對於個人來說,如果你不懂得你正在做的操作意味著什麼,那麼你進行的每一個鏈上交互或簽名都有可能使你的資產被盜。就在最近,

就在最近,Beosin 的好朋友菠菜發現了一個近兩個月開始活躍的新釣魚手法,只要簽名就會被盜,手法極其隱蔽且難以防範,一級標題

一級標題

事件經過

最近,一位朋友(暫稱小A)錢包裡的資產被盜後找到菠菜,與常見被盜方式不同的是,小A 並沒有洩漏私鑰也沒有和釣魚網站的合約進行交互,於是菠菜開始調查起了這個資產被盜事件。

在區塊鏈瀏覽器中可以看到小A 錢包被盜的這筆USDT 是通過Transfer From 函數進行轉移的,在這進行科普一下,當我們在以太坊上進行Token 轉賬的時候,其實是調用了該Token 智能合約的Transfer 函數,這兩者的區別簡單來說Transfer 是資產擁有者本人進行操作把Token 轉移給其他地址,而Transfer From 是第三方將地址內的Token 轉移給其他地址。這也就意味著這筆被盜的資產是另外一個地址進行操作把Token 轉移走的,而非錢包私鑰洩漏。

通過查詢交易細節,我們可以發現一些關鍵線索:

尾號f d5 1 的地址將小A 的資產轉移到了尾號a 0 c 8 的地址中

這個操作是與Uniswap 的Permit 2 合約進行交互的

那麼疑點來了,尾號f d5 1 的地址是如何拿到這筆資產的權限的?為什麼會和Uniswap 有關係?

首先我們需要知道,要想成功調用Transfer From 這個函數的前提是調用方需要擁有這個Token 的額度權限,也就是approve,相信大家有過鏈上操作的一定熟悉不過了,當我們去使用一些Dapp 的時候,一旦涉及到資產的轉移就需要我們先進行一個授權(approve)操作,這樣Dapp 的合約才有權限對我們的資產進行轉移。

要解開這個謎題,我們需要繼續挖掘,而答案就在尾號f d5 1 的地址的交互記錄中,在該地址進行Transfer From 轉走小A 的資產之前,可以看到該地址還進行了一個Permit 的操作,並且這兩個操作的交互對像都是Uniswap 的Permit 2 合約,那麼這個Permit 函數和Uniswap Permit 2 又是什麼情況?

Uniswap Permit 2 合約是Uniswap 在2022 年年底推出的新的智能合約,根據官方的說法,這是一個代幣審批合約,允許代幣授權在不同的應用程序中共享和管理,創造一個更統一、更具成本效益、更安全的用戶體驗。

圖片描述

圖片描述

圖片來源:https://github.com/dragonfly-xyz/useful-solidity-patterns/tree/main/patterns/permit 2

而Permit 2 的推出將有可能改變整個Dapp 生態的遊戲規則,簡單來說就是傳統的方法是你每跟一個Dapp 進行資產轉移的交互你都需要進行一次授權,而Permit 2 可以把這個步驟給省去,這樣可以非常有效的降低用戶的交互成本,帶來更好的用戶體驗。

圖片描述

圖片描述

圖片來源:https://github.com/dragonfly-xyz/useful-solidity-patterns/tree/main/patterns/permit 2

雖然Permit 2 的出現有可能改變未來Dapp 的遊戲規則,但是可以看出的是這是一把很強的雙刃劍,對於用戶來說,鏈下簽名是最容易放下防備的環節,比如當我們用錢包登入某些Dapp 的時候會需要簽名進行連接,而絕大多數人並不會仔細檢查簽名的內容也並不理解簽名的內容,而這就是最可怕的地方。

明白了Permit 2 合約,回到小A 的事件中我們就明白了為什麼資產被盜都是與Permit 2 合約進行交互了,那麼就讓菠菜來重現這個Permit 2 簽名釣魚手法,首先一個至關重要的前提條件是被釣魚的錢包需要有Token 授權給Uniswap 的Permit 2 合約,菠菜發現目前只要在與Permit 2 集成的Dapp 或Uniswap 上進行Swap 的話,都是需要授權給Permit 2 合約的(下圖菠菜使用了安全插件)。

另外一個很可怕的點是,不管你要Swap 的金額是多少,Uniswap 的Permit 2 合約都會默認讓你授權該Token 全部餘額的額度,雖然MetaMask 會讓你自定義輸入金額,但我相信大部分人都會直接點擊最大或默認值,而Permit 2 的默認值是無限的額度…….

二級標題

一級標題

二級標題

permit 函數:

合同"合同",允許其他人(spender)在未來的某個時間花費你的一些代幣。

合同"合同"真的是你簽署的。

那麼這個函數是怎麼工作的呢?

  1. 合同"合同"就不能再用了,程序會直接停止。

  2. 接著,它會檢查你的簽名是否真的是你籤的。程序會用一個特殊的方法(signature.verify)來檢查這個簽名,確保這個簽名真的是你籤的,沒有被別人偽造。

  3. 二級標題

二級標題

二級標題

二級標題

_updateApproval 函數:

當通過了簽名校驗後,會調用_updateApproval 函數更新授權值,這也就意味著你的權限發生了轉移。此時,被授權方便可以調用transferfrom 函數將代幣轉移到製定地址,如下圖代碼。

好了,解釋完permit 函數,我們來看看鏈上真實交易,我們查看這個交互的細節可以發現:

owner 就是小A 的錢包地址(尾號308 a)

Details 中可以看到授權的Token 合約地址(USDT)和金額等信息

Spender 就是尾號f d5 1 的黑客地址

sigDeadline 是簽名的有效時間,而signature 就是小A 的簽名信息

而往回翻小A 的交互記錄我們會發現,小A 之前使用Uniswap 的時候點擊了默認的授權額度,也就是幾乎無限的額度。

簡單複盤一下就是,圖片描述圖片描述

正文

圖片描述

一級標題

正文

考慮到Uniswap Permit 2 合約可能會在未來更加普及,會有更多項目集成Permit 2 合約進行授權共享,菠菜能想到有效的防範手段有:

1 理解並識別簽名內容:

Permit 的簽名格式通常包含Owner、Spender、value、nonce 和deadline 這幾個關鍵格式,如果你想享受Permit 2 帶來的便利和低成本的話一定要學會識別這種簽名格式。 (下載安全插件是一個很好的選擇)

我們向各位讀者朋友推薦下面這款Beosin Alert 反釣魚插件,可以識別Web3領域的大部分釣魚網站,守護大家的錢包和資產安全。

反釣魚插件下載:

https://chrome.google.com/webstore/detail/beosin-alert/lgbhcpagiobjacpmcgckfgodjeogceji? hl=en

2 放資產的錢包和交互的錢包分離使用:

如果你有大量資產的話,建議資產都放在一個冷錢包中,鏈上交互的錢包放少量資金,可以大幅減少遇到釣魚騙局時的損失。

3 不要授權過多額度給Permit 2 合約或取消授權:

當你在Uniswap 上進行Swap 的時候,只授權你要交互的金額數量,這樣雖然每次交互都需要重新授權會多出一些交互成本,但是可以免於遭受Permit 2 的簽名釣魚。如果你已經授權了額度,可以找相應的安全插件進行取消授權。

4 識別代幣性質,是否支持permit 功能:

後續可能越來越多的ERC 20 代幣使用該擴展協議實現permit 功能,對於你來說需要關注自己所持有的代幣是否支持該功能,如果支持,那麼對於該代幣的交易或操縱一定要格外小心,對於每條未知簽名也要嚴格檢查是否是對permit 函數的簽名。

5 若被騙後還有代幣存在其他平台,需制定完善的拯救計劃:

當你發現自己被詐騙,代幣被黑客轉移出去後,但自己還有代幣通過例如質押等方式存在其他平台上,需要提取出來轉移到安全地址上,這時需要知道黑客可能時刻監控著你的地址代幣餘額,因為他擁有你的簽名,只要你的被盜地址上出現了代幣,那麼黑客可以直接轉移出去。這時需要製定完善的代幣拯救過程,在提取代幣和轉移代幣兩個過程需要一起執行,不能讓黑客交易插入其中,可以使用MEV 轉移,這需要一些區塊鏈知識以及代碼功底,也可以尋找專業的安全公司比如Beosin 團隊利用交易搶跑腳本來實現。

二級標題二級標題

Reference:

https://t.co/G9Mnq8eUle

https://github.com/dragonfly-xyz/useful-solidity-patterns/tree/main/patterns/permit2

安全
Uniswap
錢包