“你” 的點擊,“我” 的 NFT

作者: Lisa & Kong

近期,我們發現多起關於 eth_sign 簽名的釣魚事件。

釣魚網站 1:https://moonbirds-exclusive.com/

圖片

當我們連接錢包後並點擊 Claim 後,彈出一個簽名申請框,同時 MetaMask 顯示了一個紅色提醒警告,而光從這個彈窗上無法辨別要求籤名的到底是什麼內容。

其實這是一種非常危險的簽名類型,基本上就是以太坊的 “空白支票”。通過這個釣魚,騙子可以使用您的私鑰簽署任何交易。

除此之外,還有一種釣魚:在你拒絕上述的 sign 後,它會在你的 MetaMask 自動顯示另一個簽名框,趁你沒注意就騙到你的簽名。而看看簽名內容,使用了 SetApprovalForAll 方法,同時 Approved asset 的目標顯示為 All of your NFT,也就是說,一旦你簽名,騙子就可以毫無節制地盜走你的所有 NFT。如下:

釣魚網站 2:https://dooooodles.org/

我們使用 MistTrack 來分析下騙子地址:

0xa594f48e80ffc8240f2f28d375fe4ca5379babc7

圖片

通過分析,騙子多次調用 SetApprovalForAll 盜取用戶資產,騙子地址目前已收到 33 個 NFT,售出部分後獲得超 4 ETH。

回到正題,我們來研究下這種釣魚方法。首先,我們看看 MetaMask 官方是如何說明的:

圖片

也就是說,MetaMask 目前有六種簽名方法(例如 personal_sign),只有一種方式會出現 MetaMask 警告,發生在 eth_sign 的簽名情況下,原因是 eth_sign 方法是一種開放式簽名方法,它允許對任意 Hash 進行簽名,這意味著它可用於對交易或任何其他數據進行簽名,從而構成危險的網絡釣魚風險。

根據 MetaMask 官方文檔說明,eth_sign 方法是可以對任意哈希進行簽名的,而我們在簽署一筆交易時本質上也是對一串哈希進行簽名,只不過這中間的編碼過程都由 MetaMask 替我們處理了。我們可以再簡單回顧下從編碼到交易廣播的過程:

在進行交易廣播前,MetaMask 會獲取我們轉賬的對象(to)、轉賬的金額(value)、附帶的數據(data),以及 MetaMask 自動幫我們獲取併計算的 nonce、gasPrice、gasLimit 參數進行 RLP 編碼得到原始交易內容(rawTransaction)。如果是合約調用,那麼 to 即為合約地址,data 即為調用數據。

rlp = require('rlp');
// Use non-EIP115 standardconst transaction = { nonce: '', gasPrice: '', gasLimit: '', to: '0x', value: '', data: '0x'};

// RLP encodeconst rawTransaction = rlp.encode([transaction.nonce, transaction.gasPrice, transaction.gasLimit, transaction.to, transaction.value, transaction.data]);

隨後再對此內容進行 keccak256 哈希後得到一串 bytes32 的數據就是所需要我們簽名的數據了。

// keccak256 encodeconst msgHex = rawTransaction.toString('hex');const msgHash = Web3.utils.keccak256('0x'+ msgHex);

我們使用 MetaMask 對這串數據簽名後就會得到 r, s, v 值,用這三個值再與 nonce/gasPrice/gasLimit/to/value/data 進行一次 RLP 編碼即可得到簽名後的原始交易內容了,這時候就可以廣播發出交易了。

rlp = require('rlp');
const transaction = { nonce: '', gasPrice: '', gasLimit: '', to: '', value: '', data: '', v: '', r: '', s: ''};

// RLP encodeconst signedRawTransaction = rlp.encode([transaction.nonce, transaction.gasPrice, transaction.gasLimit, transaction.to, transaction.value, transaction.data, transaction.v, transaction.r, transaction.s]);

而如上所述,eth_sign 方法可以對任意哈希進行簽名,那麼自然可以對我們簽名後的 bytes32 數據進行簽名。因此攻擊者只需要在我們連接 DApp 後獲取我們的地址對我們賬戶進行分析查詢,即可構造出任意數據(如:native 代幣轉賬,合約調用)讓我們通過 eth_sign 進行簽名。

這種釣魚方式對用戶會有很強的迷惑性,以往我們碰到的授權類釣魚在 MetaMask 會給我直觀的展示出攻擊者所要我們簽名的數據。如下所示,MetaMask 展示出了此釣魚網站誘導用戶將 NFT 授權給惡意地址。

圖片

而當攻擊者使用 eth_sign 方法讓用戶簽名時,如下所示,MetaMask 展示的只是一串 bytes32 的哈希。

圖片

總結

本文主要介紹 eth_sign 簽名方式的釣魚手法。雖然在簽名時 MetaMask 會有風險提示,但若結合釣魚話術干擾,沒有技術背景的普通用戶很難防範此類釣魚。建議用戶在遇到此類釣魚時提高警惕, 認准域名,仔細檢查簽名數據,必要時可以安裝安全插件,如:RevokeCash、ScamSniffer 等,同時注意插件提醒。

免責聲明:作為區塊鏈信息平台,本站所發布文章僅代表作者及嘉賓個人觀點,與 Web3Caff 立場無關。文章內的信息僅供參考,均不構成任何投資建議及要約,並請您遵守所在國家或地區的相關法律法規。