盲签——以太坊社区的安全黑洞

隨著2020年 DeFi 項目的蓬勃發展,以太坊已經成為區塊鏈中最活躍的公鏈之一。當提及到 DeFi 的安全性,大多數人都是從智能合約的角度來討論,卻很少有人從另一個潛在的角度深入考慮DeFi 的安全性——

我們的交易簽名過程是否安全?

事情發生在2020年12月,Nexus Mutual 的創始人 Hugh Karp 遭到了有針對性的遠程攻擊。據報道,攻擊者獲得了對 Hugh 計算機的遠程訪問權限然後針對他的 MetaMask 軟件錢包進行一些修改,從而篡改他某一筆交易,並將資金轉移到了攻擊者自己的地址。最終導致了價值800萬美元的數字貨幣被盜。

Hugh 的博客中還可以推斷,攻擊者不僅成功的攻擊了 Hugh,還有證據表明同樣成功的攻擊了以太坊社區的其他 DeFi 高級用戶。

硬件錢包無法面面俱到

Hugh 當時使用了硬件錢包,很明顯,僅僅知道如何使用硬件錢包並不是可以完全阻止攻擊的靈丹妙藥。

硬件錢包最基礎的安全假設之一,就是原則上不應該相信配套的軟件錢包,並且用戶應該有能力手動檢查硬件錢包上的交易,來確保沒有任何東西被暗地裏更換。

如果不能確保對交易進行簽署是安全的,我們就稱它為盲簽。

如果我們經過仔細研究就會發現,盲簽意味著你不得不相信你的軟件錢包在簽名時提供的消息和命令都是真實的,無惡意的。那麼我們現在反過來思考,如果我們被迫相信軟件提供的所有東西都是沒有問題的,那麼我們選擇使用硬件錢包去作為簽名設備還有什麼意義呢?

實際上,Hugh 也承認在硬件錢包上去檢查智能合約交互這件事情,說起來容易做起來難

在 Keystone 硬件錢包上,我們已經提出了一個解決方案,它可能無法100%解決問題,但它絕對是目前市場上最好的解決方案。

在這裏需要再次強調一下,並沒有真正意義上的100%安全,我們所能做的就是盡可能的減少受到攻擊能可能性。

Keystone 的解決方案

4 寸大屏

下面這張圖片是 Keystone 的屏幕截圖,顯示了在 Uniswap 上進行交易互換的交易細節。您可以清楚的感受大屏幕帶來的視覺衝擊。它使更多的信息具有可讀性,這樣用戶就可以更加方便的去檢查未簽名的數據。

智能合約地址驗證

第一件事情我們需要做的是確認您調用了正確的智能合約。

如果攻擊者創建了一個和 Uniswap 一樣的釣魚網站,那麼它就可以複製 Uniswap 當前的 UI,並且調用惡意的智能合約,將用戶的資金轉移到黑客的地址上。

所以我們會提前加載一些著名的智能合約地址,比如 Uniswap 的智能合約地址,我們將 Uniswap 進行標記,這樣用戶就更容易識別它。如果地址並未進行提前加載,則有可能此合約是新合約或者是惡意合約,我們同樣會用紅色的字樣突出顯示為未知地址來提醒用戶。

智能合約功能驗證

如果軟件錢包(例如:MetaMask)被入侵,就算用戶正在與原生 Dapp 進行交互,也仍然有可能被黑客成功攻擊。

如果用戶的軟件錢包被盜取資金,那麼有幾種方法可以實現(以 Uniswap 為例)。

第一個風險就暴漏在授權智能合約使用用戶的代幣時,惡意軟件錢包可以將原始的合約地址替換為黑客的地址,那麼它就可以直接訪問用戶的資金且不受限制。

為了防止這種情況發生,我們特別標註了您授權的智能合約地址,並在解析為未知地址時突出顯示來提示用戶。

第二種攻擊更加有趣味性。

再深入研究 Uniswap 的代碼庫後,我們發現了以下代碼可能存在風險:

function swapExactTokensForTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external override ensure(deadline) returns (uint[] memory amounts) {
        amounts = UniswapV2Library.getAmountsOut(factory, amountIn, path);
        require(amounts[amounts.length - 1] >= amountOutMin, 'UniswapV2Router: INSUFFICIENT_OUTPUT_AMOUNT');
        TransferHelper.safeTransferFrom(path[0], msg.sender, UniswapV2Library.pairFor(factory, path[0], path[1]), amounts[0]);
        _swap(amounts, path, to);
    }

函數定義中有一個地址參數叫做 “to”。通常它應該與用戶自己的 “From” 地址一致,以便交換的代幣可以轉到用戶的原始地址。但是 Uniswap 是允許更改這個參數的,以便用戶可以將代幣交換到另外一個地址(我們不認為這個是一個缺陷,而是 Uniswap 本來就這麼設計的)。 但是如果這種設計被黑客利用,它就可以通過攻破軟件錢包來將這個值修改為黑客自己的地址,然後用戶在交換代幣的過程中,將代幣交換到了黑客的地址上。

因此為了應對這種攻擊策略,我們會用 “From” 的地址驗證這個地址,若發現兩個地址不一致,則我們會將它清晰的標註到 Keystone 上(詳見下圖)。

從截圖中可以看出,我們同樣也標註了路徑,以便用戶驗證它是否與 Uniswap 的 UI 保持一致。

下面是另一款錢包在簽署 Uniswap 交易的實例(將0.1 ETH 交換為 DAI)。在下面的截圖中可以看到,整個簽署過程都沒有顯示 “to” 的地址。如果黑客通過攻破 MetaMask 錢包將你的收款地址改成黑客的地址並且發送了一筆交易,無論你多麼仔細檢查,也無法發現這筆交易存在問題。

一筆 Uniswap 交易在 Ledger 上面的簽名全過程
一筆 Uniswap 交易在 Ledger 上面的簽名全過程

當前狀態

目前 Keystone 硬件錢包已經可以和 MetaMask Extension(瀏覽器插件) 和 MetaMask Mobile(手機 APP 端) 實現交互。

以下是相關鏈接:

寫在最後

在 Keystone,我們認為用戶體驗在數字貨幣安全領域是及其重要的,因為往往人為因素才是導致數字貨幣資產丟失的最大原因。這也是 Keystone 最重要的設計原則之一。

對於所有的硬件錢包產品來說,不僅要保護好私鑰,同樣也要儘可能避免人為因素導致的失誤。

總結來講,如何保證數字貨幣資產安全絕對不是一件容易的事。

如果我們以智能合約驗證功能為例,硬件錢包廠商需要對 Dapp 的邏輯非常熟悉,並且還要找出潛在的威脅。如果 Dapp 項目方可以與硬件錢包團隊共同合作,一起解決掉這些潛在的安全層面的問題,那麼對於每個人來講都是有好處的。

保護用戶資產的安全是整個社區共同的責任,我們 Keystone 團隊歡迎任何形式的合作。

特別感謝 PhilippRyan 對本文的審查。

Subscribe to Keystone 硬件錢包
Receive the latest updates directly to your inbox.
Verification
This entry has been permanently stored onchain and signed by its creator.