**本文由;Beosin;特邀獨立研究員菠菜菠菜! (twitter@wzxznl)與;Beosin;安全研究員;Sivan;共同創作發布。 *
黑客,這是一個讓Web3生態中每個人都聞風喪膽的存在,對於項目方來說,在全世界黑客都可能盯著你的情況下,代碼開源的特性使得項目方開發的時候生怕寫錯一行代碼留下漏洞,一旦出現安全事故後果難以承擔。
**對於個人來說,如果你不懂得你正在做的操作意味著什麼,那麼你進行的每一個鏈上交互或簽名都有可能使你的資產被盜。 **因此安全問題一直是加密世界中最頭疼的問題之一,並且由於區塊鏈的特性,一旦資產被盜幾乎是沒有辦法可以追回的,所以在加密世界中具備安全知識尤其重要。
就在最近,**Beosin;的好朋友菠菜發現了一個近兩個月開始活躍的新釣魚手法,**只要簽名就會被盜,手法極其隱蔽且難以防範,**並且用過;Uniswap;交互的地址都有可能暴露在風險之下,本文;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;年年底推出的新的智能合約,根據官方的說法,這是一個代幣審批合約,允許代幣授權在不同的應用程序中共享和管理,創造一個更統一、更具成本效益、更安全的用戶體驗。
並且未來隨著越來越多的項目與Permit;2 集成,Permit;2;可以在所有應用程序中實現標準化;Token;批准。 Permit;2 將通過降低交易成本來改善用戶體驗,同時提高智能合約的安全性。
我們先要了解一下為什麼;Uniswap;要推出;Permit;2;,我們來假設一個場景,當我們要在某;Dex;上進行;Swap;時,傳統的交互方式是我們需要先授權(approve)給這個;Dex,然後再進行;Swap,這通常需要花費我們兩筆;Gas;費,對於用戶來說摩擦成本太大了,相信大家都有過這樣的體驗。
圖片來源:
而;Permit;2;的推出將有可能改變整個;Dapp;生態的遊戲規則,簡單來說就是傳統的方法是你每跟一個;Dapp;進行資產轉移的交互你都需要進行一次授權,而;Permit;2;可以把這個步驟給省去,這樣可以非常有效的降低用戶的交互成本,帶來更好的用戶體驗。
解決方案是;Permit;2;作為用戶和;Dapp;之間的中間人,用戶只需要把;Token;的權限授權給;Permit;2;合約,所有集成;Permit;2;合約的;Dapp;都可以共享這個授權額度,對於用戶來說,減少了交互成本和提高了用戶體驗,對於;Dapp;來說,用戶體驗的提升帶來更多的用戶和資金,這本是一個雙贏的局面,但同時這也可以是一個雙刃劍,而問題就出在和;Permit;2;交互方式上。
在傳統的交互方式中,不管是授權還是進行資金的轉移對於操作的用戶來說都是鏈上的交互。而;Permit;2;則將用戶的操作變為了鏈下簽名,而所有鏈上的操作都由中間角色(如;Permit;2;合約和集成了;Permit;2;的項目方等)來完成,這種方案帶來的好處是由於鏈上交互的角色從用戶轉移為了中間角色,用戶即使錢包裡沒有;ETH;也可以使用其他;Token;來支付;Gas;費或完全由中間角色報銷,這取決於中間角色的選擇。
雖然;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;的默認值是無限的額度…….
這也就意味著,只要你在;2023;年之後與;Uniswap;有過交互並授權額度給;Permit;2;合約,你就會暴露在這個釣魚騙局的風險之下。
因為重點就在於之前在尾號;f;d5;1;的地址中與;Permit;2;合約交互的;Permit;函數上,這個函數簡單來說就是利用你的錢包將你授權給;Permit;2;合約的;Token;額度轉移給別的地址,也就是說只要拿到了你的簽名,黑客就可以拿到你錢包中;Token;的權限並把你的資產轉移走。
你可以把;Permit;函數看作是一種在線簽署合同的方式。這個函數讓你(PermitSingle)可以提前簽署一個"合同",允許其他人(spender)在未來的某個時間花費你的一些代幣。
同時,你還需要提供一個簽名(signature),就像在紙質合同上簽名一樣,用來證明這個"合同"真的是你簽署的。
那麼這個函數是怎麼工作的呢?
重點則主要在於;verify;函數和_updateApproval;函數。
可以看到,verify;函數會從簽名信息參數中獲取出;v、r、s;三個數據,v、r、s;是交易簽名的值,它們可以用來恢復交易簽名的地址,上圖代碼中可以看到,合約恢復了交易簽名的地址後,與傳入的代幣擁有者地址進行比較,如果相同,則驗證通過,繼續_updateApproval;函數的調用,如果不同,則回滾交易。
當通過了簽名校驗後,會調用_updateApproval;函數更新授權值,這也就意味著你的權限發生了轉移。此時,被授權方便可以調用;transferfrom;函數將代幣轉移到製定地址,如下圖代碼。
好了,解釋完;permit;函數,我們來看看鏈上真實交易,我們查看這個交互的細節可以發現:
owner;就是小;A;的錢包地址(尾號;308;a)
Details;中可以看到授權的;Token;合約地址(USDT)和金額等信息
Spender;就是尾號;f;d5;1;的黑客地址
sigDeadline;是簽名的有效時間,而;signature;就是小;A;的簽名信息
而往回翻小;A;的交互記錄我們會發現,**小;A;之前使用;Uniswap;的時候點擊了默認的授權額度,也就是幾乎無限的額度。 **
簡單複盤一下就是,**小;A;在之前使用;Uniswap;的過程中授權給了;Uniswap Permit;2;無限的;USDT;額度,而小;A;在進行錢包操作的時候不小心掉入了黑客設計的;Permit;2;簽名釣魚陷阱,黑客拿到了小;A;的簽名後利用小;A;的簽名在;Permit;2;合約中進行了;Permit;和;Transfer From;兩個操作把小;A;的資產轉移走了,**而目前菠菜觀察到的是;Uniswap;的;Permit;2;合約已經淪為了釣魚天堂,這個;Permit;2;簽名釣魚似乎在兩個月前才開始活躍。
來源:
並且在交互記錄中可以發現幾乎大部分都是被標記的釣魚地址(Fake_Phishing),不斷有人上當。
來源:;
考慮到;Uniswap Permit;2;合約可能會在未來更加普及,會有更多項目集成;Permit;2;合約進行授權共享,菠菜能想到有效的防範手段有:
1 理解並識別簽名內容:
Permit;的簽名格式通常包含;Owner、Spender、value、nonce;和;deadline;這幾個關鍵格式,如果你想享受;Permit;2;帶來的便利和低成本的話一定要學會識別這種簽名格式。 (下載安全插件是一個很好的選擇)
我們向各位讀者朋友推薦下面這款;Beosin ;反釣魚插件,可以識別Web3領域的大部分釣魚網站,守護大家的錢包和資產安全。
反釣魚插件下載:
2 放資產的錢包和交互的錢包分離使用:
如果你有大量資產的話,建議資產都放在一個冷錢包中,鏈上交互的錢包放少量資金,可以大幅減少遇到釣魚騙局時的損失。
3 不要授權過多額度給;Permit;2;合約或取消授權:
當你在;Uniswap;上進行;Swap;的時候,只授權你要交互的金額數量,這樣雖然每次交互都需要重新授權會多出一些交互成本,但是可以免於遭受;Permit;2;的簽名釣魚。如果你已經授權了額度,可以找相應的安全插件進行取消授權。
4 識別代幣性質,是否支持;permit;功能:
後續可能越來越多的;ERC;20;代幣使用該擴展協議實現;permit;功能,對於你來說需要關注自己所持有的代幣是否支持該功能,如果支持,那麼對於該代幣的交易或操縱一定要格外小心,對於每條未知簽名也要嚴格檢查是否是對;permit;函數的簽名。
5 若被騙後還有代幣存在其他平台,需制定完善的拯救計劃:
當你發現自己被詐騙,代幣被黑客轉移出去後,但自己還有代幣通過例如質押等方式存在其他平台上,需要提取出來轉移到安全地址上,這時需要知道黑客可能時刻監控著你的地址代幣餘額,因為他擁有你的簽名,只要你的被盜地址上出現了代幣,那麼黑客可以直接轉移出去。這時需要製定完善的代幣拯救過程,在提取代幣和轉移代幣兩個過程需要一起執行,不能讓黑客交易插入其中,可以使用;MEV;轉移,這需要一些區塊鏈知識以及代碼功底,也可以尋找專業的安全公司比如;Beosin;團隊利用交易搶跑腳本來實現。
相信在未來基於;Permit;2;的釣魚可能會越來越多,**這種簽名釣魚方式極其隱蔽且難防,並且隨著;Permit;2;的應用範圍越來越廣,暴露在風險下的地址也會越來越多,希望屏幕前的你看到本文後可以傳播給更多人,避免更多人被盜。 **
### 參考:
237211 帖子
226025 帖子
151972 帖子
79584 帖子
66282 帖子
64577 帖子
60441 帖子
58780 帖子
52036 帖子
50449 帖子
簽名就被盜?警惕Uniswap Permit2簽名釣魚手法
**本文由;Beosin;特邀獨立研究員菠菜菠菜! (twitter@wzxznl)與;Beosin;安全研究員;Sivan;共同創作發布。 *
黑客,這是一個讓Web3生態中每個人都聞風喪膽的存在,對於項目方來說,在全世界黑客都可能盯著你的情況下,代碼開源的特性使得項目方開發的時候生怕寫錯一行代碼留下漏洞,一旦出現安全事故後果難以承擔。
**對於個人來說,如果你不懂得你正在做的操作意味著什麼,那麼你進行的每一個鏈上交互或簽名都有可能使你的資產被盜。 **因此安全問題一直是加密世界中最頭疼的問題之一,並且由於區塊鏈的特性,一旦資產被盜幾乎是沒有辦法可以追回的,所以在加密世界中具備安全知識尤其重要。
就在最近,**Beosin;的好朋友菠菜發現了一個近兩個月開始活躍的新釣魚手法,**只要簽名就會被盜,手法極其隱蔽且難以防範,**並且用過;Uniswap;交互的地址都有可能暴露在風險之下,本文;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;年年底推出的新的智能合約,根據官方的說法,這是一個代幣審批合約,允許代幣授權在不同的應用程序中共享和管理,創造一個更統一、更具成本效益、更安全的用戶體驗。
並且未來隨著越來越多的項目與Permit;2 集成,Permit;2;可以在所有應用程序中實現標準化;Token;批准。 Permit;2 將通過降低交易成本來改善用戶體驗,同時提高智能合約的安全性。
我們先要了解一下為什麼;Uniswap;要推出;Permit;2;,我們來假設一個場景,當我們要在某;Dex;上進行;Swap;時,傳統的交互方式是我們需要先授權(approve)給這個;Dex,然後再進行;Swap,這通常需要花費我們兩筆;Gas;費,對於用戶來說摩擦成本太大了,相信大家都有過這樣的體驗。
圖片來源:
而;Permit;2;的推出將有可能改變整個;Dapp;生態的遊戲規則,簡單來說就是傳統的方法是你每跟一個;Dapp;進行資產轉移的交互你都需要進行一次授權,而;Permit;2;可以把這個步驟給省去,這樣可以非常有效的降低用戶的交互成本,帶來更好的用戶體驗。
解決方案是;Permit;2;作為用戶和;Dapp;之間的中間人,用戶只需要把;Token;的權限授權給;Permit;2;合約,所有集成;Permit;2;合約的;Dapp;都可以共享這個授權額度,對於用戶來說,減少了交互成本和提高了用戶體驗,對於;Dapp;來說,用戶體驗的提升帶來更多的用戶和資金,這本是一個雙贏的局面,但同時這也可以是一個雙刃劍,而問題就出在和;Permit;2;交互方式上。
在傳統的交互方式中,不管是授權還是進行資金的轉移對於操作的用戶來說都是鏈上的交互。而;Permit;2;則將用戶的操作變為了鏈下簽名,而所有鏈上的操作都由中間角色(如;Permit;2;合約和集成了;Permit;2;的項目方等)來完成,這種方案帶來的好處是由於鏈上交互的角色從用戶轉移為了中間角色,用戶即使錢包裡沒有;ETH;也可以使用其他;Token;來支付;Gas;費或完全由中間角色報銷,這取決於中間角色的選擇。
圖片來源:
雖然;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;的默認值是無限的額度…….
這也就意味著,只要你在;2023;年之後與;Uniswap;有過交互並授權額度給;Permit;2;合約,你就會暴露在這個釣魚騙局的風險之下。
因為重點就在於之前在尾號;f;d5;1;的地址中與;Permit;2;合約交互的;Permit;函數上,這個函數簡單來說就是利用你的錢包將你授權給;Permit;2;合約的;Token;額度轉移給別的地址,也就是說只要拿到了你的簽名,黑客就可以拿到你錢包中;Token;的權限並把你的資產轉移走。
事件詳細分析
permit;函數:
同時,你還需要提供一個簽名(signature),就像在紙質合同上簽名一樣,用來證明這個"合同"真的是你簽署的。
那麼這個函數是怎麼工作的呢?
重點則主要在於;verify;函數和_updateApproval;函數。
verify;函數:
可以看到,verify;函數會從簽名信息參數中獲取出;v、r、s;三個數據,v、r、s;是交易簽名的值,它們可以用來恢復交易簽名的地址,上圖代碼中可以看到,合約恢復了交易簽名的地址後,與傳入的代幣擁有者地址進行比較,如果相同,則驗證通過,繼續_updateApproval;函數的調用,如果不同,則回滾交易。
_updateApproval;函數:
當通過了簽名校驗後,會調用_updateApproval;函數更新授權值,這也就意味著你的權限發生了轉移。此時,被授權方便可以調用;transferfrom;函數將代幣轉移到製定地址,如下圖代碼。
好了,解釋完;permit;函數,我們來看看鏈上真實交易,我們查看這個交互的細節可以發現:
owner;就是小;A;的錢包地址(尾號;308;a)
Details;中可以看到授權的;Token;合約地址(USDT)和金額等信息
Spender;就是尾號;f;d5;1;的黑客地址
sigDeadline;是簽名的有效時間,而;signature;就是小;A;的簽名信息
而往回翻小;A;的交互記錄我們會發現,**小;A;之前使用;Uniswap;的時候點擊了默認的授權額度,也就是幾乎無限的額度。 **
簡單複盤一下就是,**小;A;在之前使用;Uniswap;的過程中授權給了;Uniswap Permit;2;無限的;USDT;額度,而小;A;在進行錢包操作的時候不小心掉入了黑客設計的;Permit;2;簽名釣魚陷阱,黑客拿到了小;A;的簽名後利用小;A;的簽名在;Permit;2;合約中進行了;Permit;和;Transfer From;兩個操作把小;A;的資產轉移走了,**而目前菠菜觀察到的是;Uniswap;的;Permit;2;合約已經淪為了釣魚天堂,這個;Permit;2;簽名釣魚似乎在兩個月前才開始活躍。
來源:
並且在交互記錄中可以發現幾乎大部分都是被標記的釣魚地址(Fake_Phishing),不斷有人上當。
來源:;
如何防範?
考慮到;Uniswap Permit;2;合約可能會在未來更加普及,會有更多項目集成;Permit;2;合約進行授權共享,菠菜能想到有效的防範手段有:
1 理解並識別簽名內容:
Permit;的簽名格式通常包含;Owner、Spender、value、nonce;和;deadline;這幾個關鍵格式,如果你想享受;Permit;2;帶來的便利和低成本的話一定要學會識別這種簽名格式。 (下載安全插件是一個很好的選擇)
我們向各位讀者朋友推薦下面這款;Beosin ;反釣魚插件,可以識別Web3領域的大部分釣魚網站,守護大家的錢包和資產安全。
反釣魚插件下載:
2 放資產的錢包和交互的錢包分離使用:
如果你有大量資產的話,建議資產都放在一個冷錢包中,鏈上交互的錢包放少量資金,可以大幅減少遇到釣魚騙局時的損失。
3 不要授權過多額度給;Permit;2;合約或取消授權:
當你在;Uniswap;上進行;Swap;的時候,只授權你要交互的金額數量,這樣雖然每次交互都需要重新授權會多出一些交互成本,但是可以免於遭受;Permit;2;的簽名釣魚。如果你已經授權了額度,可以找相應的安全插件進行取消授權。
4 識別代幣性質,是否支持;permit;功能:
後續可能越來越多的;ERC;20;代幣使用該擴展協議實現;permit;功能,對於你來說需要關注自己所持有的代幣是否支持該功能,如果支持,那麼對於該代幣的交易或操縱一定要格外小心,對於每條未知簽名也要嚴格檢查是否是對;permit;函數的簽名。
5 若被騙後還有代幣存在其他平台,需制定完善的拯救計劃:
當你發現自己被詐騙,代幣被黑客轉移出去後,但自己還有代幣通過例如質押等方式存在其他平台上,需要提取出來轉移到安全地址上,這時需要知道黑客可能時刻監控著你的地址代幣餘額,因為他擁有你的簽名,只要你的被盜地址上出現了代幣,那麼黑客可以直接轉移出去。這時需要製定完善的代幣拯救過程,在提取代幣和轉移代幣兩個過程需要一起執行,不能讓黑客交易插入其中,可以使用;MEV;轉移,這需要一些區塊鏈知識以及代碼功底,也可以尋找專業的安全公司比如;Beosin;團隊利用交易搶跑腳本來實現。
相信在未來基於;Permit;2;的釣魚可能會越來越多,**這種簽名釣魚方式極其隱蔽且難防,並且隨著;Permit;2;的應用範圍越來越廣,暴露在風險下的地址也會越來越多,希望屏幕前的你看到本文後可以傳播給更多人,避免更多人被盜。 **
### 參考: