Go-Ethereum

如何減少你的乙太坊錢包被黑客入侵的機會?

  • December 27, 2017

概括

2016 年 5 月 12 日發生的從帕特里克那裡竊取 7,218 個乙太幣的黑客攻擊僅影響以下礦工:

  • 來自 Internet 的 TCP 埠 8545 上的傳入 RPC 連接被轉發到執行乙太坊節點軟體的機器geth
  • geth在啟用參數的情況下執行--rpc;和
  • 乙太坊錢包(Mist)在同一geth台機器上使用,用於發送交易,要求geth賬戶解鎖 2 秒。

黑客在埠 8545 上向 Patrick 的 IP 地址發送了連續的請求流(每 2 秒)sendTransaction(...),該請求被轉發到geth實例。當 Patrick 使用乙太坊錢包發送交易時,乙太坊錢包解鎖了 Patrick 的賬戶 2 秒,黑客的交易成功將 Patrick 的乙太幣轉移到了黑客的賬戶中。


細節

DAOHub 論壇上的使用者Patrick昨天發布了帶有主題的消息$$ Urgent $$使用 Mist 購買 DAO 已被黑

Patrick 使用乙太坊錢包轉移 1 個乙太幣來測試在他的採礦電腦上購買TheDAO代幣。當(到目前為止似乎)乙太坊錢包解鎖他的錢包 2 秒(通過 IPC API,未暴露在網際網路上)時,一個正在監視他的錢包活動的機器人突然進入以發送轉移指令到(通過 JSON-RPC ,暴露在網際網路上)並將他剩餘的 7218 乙太幣轉移到黑客的賬戶中。geth``geth``geth

這是 Patrick 的賬戶,顯示了 17 秒後( 0x95a3ba0aabc6296cbbe3862a889ecb37979da493 ) 移除剩餘餘額之前的 1 次乙太幣轉移: 在此處輸入圖像描述

這是黑客的賬戶,顯示 7,218 個乙太幣被分成 97.54489533580829 個乙太幣交易的許多片段(0xc5d431ee2470484b94ce5660aa6ae835346abb19): 在此處輸入圖像描述

下面是來自 Ethereum Wallet mist/interface/client/templates/popupWindows/sendTransactionConfirmation.js #228的一段程式碼,用於解鎖geth賬戶 2 秒:

   web3.personal.unlockAccount(Session.get('data').from, pw || '', 2, function(e, res){

1 ETH 交易發生在 2016-05-12 03:12:57。7218.368874849814 ETH 交易發生在 2016-05-12 03:29:03,在 1 ETH 交易後約 17 秒,即 2 秒視窗 + 平均約 15 秒乙太坊區塊時間。

黑客入侵後,Patrick 在他的電腦上執行了一些分析,發現每隔幾秒就會通過gethRPC 埠 8545 執行以下命令進行網路通信:

  • eth_accounts- 列出geth實例上的帳戶
  • eth_mining- 找出節點上的挖礦活動
  • miner_setEtherBase- 嘗試設置gethetherbase 帳戶,但失敗了
  • eth_getBalance- 找到帕特里克賬戶的餘額

有一個問題是為什麼啟用 RPC 埠 8545 以便將來自 Internet 的 RPC 通信轉發到geth電腦。

Patrick 在他的網路外執行 GPU 礦工,並為他的網路外的 GPU 礦工啟用埠 8545 的埠轉發,他知道他的帳戶將在 99.99% 的時間內保持鎖定狀態。只需要一個 2 秒的視窗。


正如@tayvano 在下面列出的那樣,我的 eth 帳戶被黑了,通過 RPC 協議記錄了另一個漏洞。

另請注意,有權訪問本地電腦的黑客也將能夠geth在這 2 秒解鎖期間訪問 IPC 通信以發送流氓交易。

可以採取哪些措施來減少這種情況發生的機會?

(請編輯我。我是社區維基)

概括

  1. 不允許將來自 Internet 的埠 8545 上的 TCP 請求轉發到您的geth電腦
  2. 不要在--rpc沒有檢查只有geth你的 GPU 挖礦電腦可以訪問你的乙太坊節點電腦上的 TCP 埠 8545 的情況下啟用
  3. 不要在與您的geth電腦相同的機器上執行乙太坊錢包。
  4. 如果您需要一個“單獨的礦池”,請考慮使用礦池後端軟體,該軟體將限制將轉發到您的geth實例的指令。

編輯 31/05/2016 - 安全警報!

來自blog.ethereum.org - 安全警報 - cpp-ethereum 保持帳戶解鎖

受影響的配置:cpp-ethereum (eth, AlethZero, …) 版本 1.2.0 到 1.2.5(在 1.2.6 中修復) 注意:“geth”、“Mist”和“Ethereum Wallet”都不是(除非明確一起使用使用 cpp-ethereum)受此影響,他們再次正確鎖定帳戶。

嚴重性:高

可能的攻擊:如果攻擊者可以訪問本地機器或暴露的 json-rpc 介面,他們可以從以前使用的帳戶中花費資金。

詳細資訊:由於 cpp-ethereum 中的錯誤,一旦輸入密碼,帳戶就會保持解鎖狀態,直到 cpp-ethereum 關閉。這包括使用啟動時輸入的“主密碼”或通過 Mist 輸入的任何密碼加密的帳戶。這意味著攻擊者可以在訪問 RPC 介面後立即從賬戶中花費資金。為此,他們需要訪問本地文件系統或公開的 http-json-rpc 介面(不是預設設置)。在“Mist 模式”(不是預設設置)下使用 Mist 並導航到惡意網站也可以讓該網站訪問 RPC 介面。

建議的臨時解決方法:每次事務後重新啟動 eth,不要通過 http 公開 json-rpc 介面,並在二進製文件發布後立即升級到版本 1.2.6。已將修復程序合併到開發分支。


細節

這裡有一些步驟可以減少你的乙太坊錢包被黑客入侵的機會。

  1. 限制你的挖礦電腦上的 RPC 訪問

對於大多數乙太坊礦工,您將geth用於執行區塊鏈節點並ethminer執行探勘計算。

如果您僅在一台電腦上執行一個geth實例並且ethminers,請將您的 RPC 埠限制為僅在本地電腦上提供服務。該選項--rpcaddr 127.0.0.1(這是預設設置)會將您的 RPC 通信限制在該電腦上。

如果您在一台電腦上只執行一個geth實例,並且ethminer在同一台電腦以及ethminer需要與該geth實例通信的其他電腦上執行,您將必須使用電腦的本地網路 IP,例如--rpcaddr 192.168.1.123. 在這種情況下,最好設置防火牆,將通過 RPC 的通信限制為geth僅與您的採礦設備通信。

  1. 不要在你的挖礦geth節點電腦上執行乙太坊錢包(Mist)

如果您在您的挖礦節點上執行 Mist,當您使用 Mist 發送交易時,它將通過 IPC 套接字進行通信,以指示geth解鎖您的帳戶 2 秒。

如果您打開了 RPC 並且可以從 Internet 訪問此埠,那麼腳本和機器人將能夠在您的geth節點上發送交易以在 Mist 解鎖您的帳戶的短時間內搶走您的硬幣,就像帕特里克發生的那樣。

如果您關閉了 RPC 並且您的採礦電腦已被入侵,則任何本地安裝的惡意軟體都將能夠使用 IPC 套接字搶奪您的硬幣。

不要在你的礦機上執行 Mist。而是在單獨的安全電腦上使用它。

3.檢查您$HOME/.ethereum/history的文件並在必要時刪除

您鍵入的命令的歷史記錄geth ... console儲存在$HOME/.ethereum/history. 下面顯示了我剛剛在控制台中輸入的內容:

> eth.mining
true
> personal.unlockAccount(eth.accounts[0], "invalidpassword", 2)
Decryption failed: MAC mismatch
   at InvalidResponse (<anonymous>:-81662:-62)
   at send (<anonymous>:-156322:-62)
   at unlockAccount (<anonymous>:-133322:-62)
   at <anonymous>:1:1

這是我$HOME/.ethereum/history文件的最後兩行:

eth.mining
personal.unlockAccount(eth.accounts[0], "invalidpassword", 2)

使用以下命令檢查歷史文件的內容:

user@Kumquat:~$ grep unlock $HOME/.ethereum/history
personal.unlockAccount(eth.accounts[0], "invalidpassword", 2)

如果您曾經使用過 command personal.unlockAccount(...),請擦除您的歷史文件:

rm $HOME/.ethereum/history

預設情況下,您的歷史文件所在的目錄只能由您自己的使用者讀取。但是,如果您的帳戶被盜用,您的密碼會在您的歷史文件中:

user@Kumquat:~$ ls -al | grep .ethereum
drwx------   9 user user       4096 May 14 00:28 .ethereum
  1. 如果損失太多,請轉移您的採礦獎勵

您的採礦電腦不斷與 Internet 上的其他程序通信,並且受到攻擊的風險比平時要高。

黑客可以很容易地在 Internet 上找到乙太坊節點,並且您的電腦可能會成為攻擊目標。將您的採礦獎勵轉移到更安全的乙太坊賬戶,以減少您被黑客入侵時的損失。

  1. 盡可能減少攻擊面

如果可能,執行伺服器版本的 Ubuntu Linux。安裝起來有點困難,尤其是 GPU 驅動程序,但是與桌面版本相比,此版本中執行的服務更少,因此您被黑客入侵的可能性更低。

  • Ubuntu Desktop有更多的軟體通過暴露的埠持續執行。如果您必須使用 Ubuntu 桌面,請關閉不必要的服務,不要安裝不受信任的軟體。您可能希望使用隱私設置來減少任何資訊洩露:

    • 設置 -> 安全和隱私 -> 文件和應用程序關閉
    • 設置 -> 安全和隱私 -> 搜尋關閉
    • 設置 -> 安全和隱私 -> 診斷全部關閉
    • /etc/default/appport. 放enabled=0
  • Mac 和 Windows 不斷地打電話回家,很可能分別為蘋果和微軟安裝了後門。即使 Apple 和 Microsoft 幾乎沒有動機利用後門暴露自己,但持續的喋喋不休使得很難檢測到您的伺服器與其他電腦之間的異常通信。

  1. 保護您的網路

  • 檢查您是否擁有相對安全的 ADSL 調製解調器/路由器或網路設備。製造商和您的 Internet 服務提供商有時會安裝後門(如果您從他們那裡獲得調製解調器作為服務的一部分)。雖然他們可能不想通過利用後門造成任何惡意破壞,但黑客已經利用了一些安全性較差的網路設備。例如,請參閱Cisco、Linksys、Netgear 後門
  • 在 DMZ(非軍事區)中執行您的採礦電腦,以將您暴露在網際網路上的採礦電腦與您的其他聯網設備分開。如果你使用它,你應該測試你的網路設備的 DMZ 功能,因為我遇到了一些沒有正確分區 DMZ 的網路設備。
  • 為您的採礦電腦設置防火牆,以便來自 Internet 的唯一傳入埠是 TCP 和 UDP 30303,如果您為您的geth實例打開了 RPC,則只允許來自您的採礦電腦的 RPC 埠上的通信。
  1. 不要使用使用者root(或具有管理員權限的使用者)來執行你的礦工

如果您面向 Internet 的程序 ( geth) 存在漏洞,如果程序以管理員權限執行,黑客可能會造成更大的破壞。

  1. 檢查路由器或防火牆上的埠轉發規則

只有 TCP 和 UDP 流量的埠 30303 應該由調製解調器或防火牆轉發到您的geth節點電腦。不應將埠 8545(或您為 RPC 埠配置的任何埠)轉發到您的geth節點電腦。

我的防火牆規則適用於我的 2 個採礦設備(.120 有geth實例,.121 只是一個 GPU 礦工,.111.* 是我的 DMZ):

* Allow Internet to DMZ geth machine TCP 30303
   Protocol TCP, Source Any, Destination 192.168.111.120:30303
* Allow Internet to DMZ geth machine UDP 30303
   Protocol UDP, Source Any, Destination 192.168.111.120:30303
* Allow Ethereum RPC 8545 traffic from GPU miner to geth machine
   Protocol TCP, Source 192.168.111.121, Destination 192.168.111.120:8545
* Allow SSH traffic to mining rigs
   Protocol TCP, Source 192.168.1.*, Destination 192.168.111.*:22
* Block everything else
   Protocol *, Source Any, Destination 192.168.111.*:*
  1. 測試您的 Internet 連接上的開放埠

使用 GRC 之類的服務來探測 Internet 連接上的開放埠。點擊grc.com,點擊Shields UP!!,然後點擊**ShieldsUP!**再次。閱讀文本並點擊繼續。

在下面顯示的網頁上,我輸入了埠8545, 30303並點擊了User Specified Custom Port Probe

在此處輸入圖像描述

探測結果如下圖 - 埠 8545(gethRPC)未向 Internet 開放,而埠 30303(乙太坊 P2P 埠)為: 在此處輸入圖像描述

同時測試所有服務埠(埠 0 到 1055)以確認您打開了哪些埠可能是個好主意。以下結果表明我只打開了 443 埠(HTTPS): 在此處輸入圖像描述

  1. 為網路外的礦工開放 RPC 埠(你自己的獨立礦池和你自己的分佈式礦工)

如果您的網路外有 GPU 礦工,請不要打開您的 RPC 埠 8545。

如果您的geth實例在網路之外有 GPU 礦工,您的替代方案:

  1. geth如有必要,在指向同一個 coinbase 帳戶的每個 GPU 礦工網路中本地執行;或者
  2. 考慮執行open-ethereum-poolether-pool的組件。您不必執行 Web 前端、模組或模組。只有來自/來自 GPU 礦工的安全指令通過礦池軟體傳遞。執行此軟體的一個優點是您可以從地層探勘代理協議中獲得更好的性能。使用特定 coinbase(支付地址)進行挖礦的能力並不取決於能夠訪問 coinbase 私鑰的挖礦節點;您可以在另一台機器上生成地址和私鑰,並將挖礦節點的coinbase設置為生成的地址。這減少了來自受損節點的損害:過去的支出不能僅通過破壞節點來竊取。unlocking``payout``geth

引用自:https://ethereum.stackexchange.com/questions/3887