慢霧:空白支票eth_sign釣魚分析

文/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 等,同時注意插件提醒。

Total
0
Shares
Related Posts