在 Web3 生態中,「簽名釣魚」事件層出不窮,使用者除了保持警惕外,若了解其背後的原理,將能更有效預防受騙。本文源自「菠菜菠菜」所著文章,由 PANews 整理、編譯及撰稿。
(前情提要:注意!FTX、BlockFi債權人「電郵釣魚攻擊」猖獗,已竊700萬鎂加密貨幣、NFT)
(背景補充:知名外媒 Cointelegraph 的 X 驚傳遭駭!分享多檔花式假空投、釣魚地址)
明明只是簽了個名,我的錢怎麼沒了呢?「簽名釣魚」 目前正成為了 Web3 的駭客們最喜歡的釣魚方式,最近看餘弦大佬(慢霧創辦人)和各大錢包和安全公司都在不斷宣傳科普釣魚簽名的知識,但是每天還是有好多人被釣魚。
菠菜認為其中一個原因就是大部分人對錢包互動的底層邏輯並不瞭解,並且對於不懂技術的人來說學習門檻過高,所以菠菜決定出一個圖解版科普簽名釣魚的底層邏輯,並且嘗試用最大白話的形式,讓不懂技術的人也能看明白。
錢包的操作原理
首先我們要知道我們使用錢包一共只有兩種操作:「簽名」 和 「互動」。最簡單、直接的理解就是:簽名是發生在區塊鏈之外的(鏈下),不需要花 Gas 費的;互動則是發生在區塊鏈上面的(鏈上),是需要花 Gas 費的。
一般簽名的使用場景是為了驗證你是你,比如登入錢包,就像你如果要去 Uniswap 換 Token 的話,你需要先連結你的錢包,那麼這個時候你就需要籤一個名告訴網站 「我是這個錢包的擁有者」,然後你就可以使用 Uniswap 了,這個步驟對區塊鏈不會有任何資料或者狀態上的變化,所以不需要花錢。
而互動的話就是當你要真正在 Uniswap 上換 Token 的時候,你需要先花一筆錢告訴 Uniswap 的智慧合約:「我要用 100USDT 換一個菠菜幣,我批准你可以挪動我的 100USDT」,這個步驟就叫做授權(approve),然後你還要再花一筆錢告訴 Uniswap 的智慧合約:「我現在要用 100USDT 換一個菠菜幣了,你現在可以進行操作了」,然後你就完成了用 100USDT 換一個菠菜幣的操作。
釣魚的原理與方式
簡單理解簽名和互動的區別之後,我們就來介紹一下釣魚的原理,菠菜會列舉三個不同的方式:授權釣魚、Permit 簽名釣魚和 Permit2 簽名釣魚,這三個是非常常見的釣魚方式。
授權釣魚
咱們先講授權釣魚,這是以前 Web3 最經典的釣魚手法之一,顧名思義就是利用授權(approve)這個機制,之前 Uniswap 的例子告訴我們,授權就是告訴智慧合約 「我批准你挪動我多少 xxx 的 Token」,那麼駭客就可以做一個假的釣魚網站,有著精美的前端偽裝成一個 NFT 專案,網站中間是一個漂亮的大按鈕 「領取你的空投」,實際上你點了之後錢包彈出來的介面實際上是讓你授權你的 Token 給駭客的地址,那麼這時候如果你點了確認,那麼就恭喜駭客成功完成一個 KPI 了。
但是授權釣魚有一個問題:因為要花 Gas 費,現在很多人在涉及到花錢的操作上會有所警惕,在陌生網站點選之後稍微一看就會發現不對勁,還是比較好防範的。
Permit 簽名釣魚和 Permit2 簽名釣魚
那麼接下來就來到了今天的主角:Permit 和 Permit2 簽名釣魚啦,是 Web3 資產安全領域的重災區,為什麼這麼難防呢?
因為每次你要使用一個 DApp 之前一定要簽名登入你的錢包,在許多人腦子裡可能已經形成了一種慣性思維:「這個操作是安全的」,再加上不需要花錢和大多數人不知道每個簽名背後意味著什麼。
我們先來看 Permit 機制,Permit 是針對 ERC-20 標準下授權的一個擴展套件功能,像我們平常用的 USDT 就是 ERC-20,簡單來說就是你可以簽名批准其他人來挪動你的 Token,我們知道授權(Approve)是你花錢告訴智慧合約:「你可以挪動我 xxx 數量的 Token」,那麼 Permit 就是你在一張「條子」上籤了個名給某一個人,這個紙上寫著:「我允許某某某可以挪動我 xxx 數量的 Token」,
然後這個人拿著這個「條子」給智慧合約並花一筆 Gas 費告訴智慧合約:「他允許我挪動他 xxx 數量的 Token」,然後你的錢就可以被其他人挪走了,在這個過程中你只是簽了一個名,而背後卻意味著你允許其他人去呼叫授權(Approve)並轉走你的 Token,駭客可以做一個釣魚網站,把登入錢包的按鈕替換成 Permit 釣魚,那麼就可以輕輕鬆鬆把你的資產釣走啦。
那麼 Permit2 又是什麼呢?Permit2 其實並不是 ERC-20 的一個功能,而是 Uniswap 為了方便使用者推出的一個功能,之前的例子講了你要在 Uniswap 上用 USDT 換菠菜幣你需要先授權(Approve)一次,然後再進行兌換,這需要花兩筆 Gas 費,所以 Uniswap 就想了個辦法:「你一次性把額度全部授權給我好了,每次兌換你簽個名我就給你處理了」,這個功能幫助 Uniswap 使用者使用的時候只需要支付一次 Gas 費即可,並且這個步驟是簽名,所以 Gas 費其實不是你付的,而是 Permit2 合約代付了,但是會從你最終兌換的 Token 里扣除掉。
但是中 Permit2 釣魚的條件是你曾經使用過 Uniswap,並且你還授權了無限額度給 Permit2 智慧合約,由於目前 Uniswap 預設的操作就是無限額度授權,所以其實滿足該條件的使用者數量還是蠻大的,同樣駭客只要騙你把名簽了就可以把你的 Token 轉走(僅限給過授權的)。
結論
總結一下,授權釣魚的本質是你花一筆錢告訴智慧合約:「我批准你挪用我的 Token 給駭客」,簽名釣魚的本質是你簽了一張允許別人去挪動你資產的「條子」給到駭客,駭客花錢告訴智慧合約:「我要挪用他的 Token 轉給我」。Permit 和 Permit2 是目前釣魚簽名的重災區,Permit 是 ERC-20 的一個授權擴展套件功能,Permit2 則是 Uniswap 推出的一個新功能。
那麼理解了原理,怎麼防範呢?
- 首先最最重要的就是培養你的安全意識,每一次錢包的操作都要去檢查一下你在做的操作到底是什麼?
- 大資金和玩鏈上的錢包分離,一旦被釣魚了可以把損失降到最低。
- 學會識別 Permit 和 Permit2 的簽名格式,只要你看到以下簽名格式,那你就要警惕起來了:Interactive(互動網址)、Owner(授權方地址)、Spender(被授權方地址)、Value(授權數量)、Nonce(隨機數)、Deadline(過期時間)
📍相關報導📍
慢霧》反向釣魚,揭露利用「代幣Decimals精度」的詐騙手法