原文標題:《引介 | 如何打敗以太坊清道夫,挽救你的資產》
撰文:Harry Denley
翻譯 & 校對:閔敏 & 阿劍
你沒有過這樣的經歷:將一筆資金發送到某個賬戶后,這筆資金卻不翼而飛?你可能是遭了「清道夫」的毒手。我們來幫你解除危機。
如果你的私鑰被盜,作惡者通常會安排一個 「清道夫」 程式來監控你的賬戶,然后伺機吃掉你的賬戶中的資產 —— 無論你在這個賬戶中存入 ETH 或其它代幣,還是收到了空投,或有任何類似情況,
本文概述了 「清道夫」 是如何吃掉用戶資產的,并提供了三種方法來挽救還沒有被吃掉的資金(如押金),
用戶私鑰是如何泄漏的?
我們最近看到有很多用戶冒充 Telegram 群組的管理員,然后在這些合法群組的主要頻道向用戶提供 「幫助」(雖然他們不是真正的管理員,他們復制了正牌管理員的簡介,只是略微改動了用戶名),冒牌管理員通常會利用專業話術來迷惑用戶,向用戶分享看似合法的網站(因為有品牌背書)的鏈接,這些網站會要求用戶提供私鑰或助記詞,
然后你的代幣就沒了,而且會有 「清道夫」 開始監控你的賬戶,
這里有一個釣魚網站的例子:
感謝研究員 @dubstard 發現了很多冒充 WalletConnect 的活動!
「清道夫」 是如何工作的?
「清道夫」 是一段用來監控區塊鏈(包括交易池,從技術層面上來說,交易池不在鏈上)的代碼,它有著比人類更快的反應速度,按照編好的程式為符合規則的特定交易簽名。
也就是說,「清道夫」是看不到你的,它不知道你正在區塊鏈瀏覽器上查看你的地址,或將你的地址 「連接」 到某個 dApp 的用戶界面,僅當你簽署某個交易并將其廣播到網路時,它才會看到你的活動。
隨著時間的推移,「清道夫」 連同利用 「清道夫」 的釣魚騙局也在不斷進化中,
「清道夫」 的演化
2017 年有一類騙局非常流行,利用了具備鎖定功能【即,無法成功調用 transfer()
】同時有喂價的代幣。Dave Appleton 發文揭露了這類騙局,
在這類騙局中,騙子會先獲取這類能夠被鎖定的代幣,但是區塊瀏覽器依然會提供這類代幣【其中最流行的是 Minerum (MNE)】的價格,然后,騙子會(裝作無意間)將存有這類代幣的地址的私鑰公布出去,引誘受害者來取走地址中的代幣。為了取走代幣,受害者會將 ETH 轉到該地址上作為 gas 費,然而,騙子早就安排了 「清道夫」,以迅雷不及掩耳之勢將受害者轉入的 ETH 轉移到自己的賬戶中。從理論上來說,被鎖定的代幣被認為是沒有價值的, 因此騙子試圖從沒有戒心的貪婪用戶那里收回一些鎖倉價值。
如今,被黑的地址已經被大范圍放置了基礎的 ETH 「清道夫」。還有一些詐騙集團采用邏輯上更高級的 「清道夫」 ,會基于喂價吃掉 ERC 20 代幣,
前段時間,我對一個被黑的地址進行了研究,發現這些 「清道夫」 還在繼續進化:
1)「清道夫」 喜食高價值資產,即使這意味著需要花更多交易費。
2)「清道夫」 會使用所有可用的 ETH 來竊取盡可能多的價值,而且其交易在同一 nonce 上獲勝的概率很高。
3)「清道夫」 有一個配對引擎,將其原生代幣與質押代幣進行配對(即,xKNCa = KNC),以便獲得質押代幣的喂價,
4)「清道夫」 有自己的內部 nonce 計數器,如果其最高 nonce 在一段時間內沒有得到確認(或是被丟棄 / 替換),就會定期將 nonce 重置為 eth.getTransactionCount()
的輸出,
5)我們可以透過一些鏈上活動看出,如果某個高價值資產成了 「清道夫」 眼中的獵物,「清道夫」 甚至會向相關賬戶轉入一些 ETH 作為 gas 費,以便迅速將該資產從賬戶中轉出。
6)一些 「清道夫」 會為資產價值設置一個最低閾值。「清道夫」 不會吃掉低于該閾值的資產。這就意味著,你可能察覺不到你的賬戶里有 「清道夫」,細思極恐,
鑒于我們第一次撰寫關于 「清道夫」 的文章是在 2017 年,如今的 「清道夫」 早已今非昔比,可以幫助運營者實現收益最大化,同時讓受害者的損失最大化,
住手吧!清道夫!
如何擊敗 「清道夫」?
首先,身為人類的你是快不過代碼的,因此我們的解決方案將涉及代碼。這里為你提供了幾個不同的方案,雖然不能保證 100% 有效,但是總有一款適合你。
你需要創建一個想要挽救的代幣列表(按優先級排序),以便輕松制定計劃。這張列表需要包含以下內容:
- 代幣合約地址
- 該代幣是否已用于質押(解鎖是否有時間限制)
- 代幣能否轉移
- 代幣價值(由用戶主觀判斷或美元價值決定,以便確定優先級)
最重要的是,你必須有條不紊,才能快速而有效的執行該方案。正如那句至理名言所說:「凡事預則立,不預則廢。」
使用太極網路(Taichi Network)
「清道夫」 的運作原理是監控交易池中向 「獵物」 地址轉賬的交易,這樣一來,「清道夫」 就可以搶在該交易確認之前簽署好另一個交易并廣播該交易,從而取走轉入資金。
太極網路可以讓你直接將已簽名的交易提交給礦工(即,星火礦池),無需將其廣播至公共交易池,這意味著,你的交易將進入 「清道夫」 的視覺盲區,也就不會被 「清道夫」 的機器人搶跑(至少以我的經驗來看是這樣),
圖源:TAICHI.NETWORK
具體方法是,將你的所有交易預先按照 nonce 順序簽好名,并以編程方式提交給太極網路。大多數 「清道夫」 只監控公共交易池中等待打包的以太坊交易,不會調用每個新區塊的 eth_getBalance
(這是為了節省 CPU 循環和 RPC 調用)。也就是說,「清道夫」 是看不到通過隱私交易池發送至 「獵物」 賬戶的 ETH 的,也就不會吃掉它,
你需要做一些計算,確保發送到賬戶中作為 gas 費的 ETH 可以充分利用到每筆已簽名交易上。如果你算得很準的話,「清道夫」 可能會搶跑失敗!(通常情況下,我會默認將 gas 費設得比 GasNow 上的 「極速(Rapid)」 參考值高幾個百分點,從而提高交易被打包進下個區塊的概率。)
你可以在離線狀態下使用 MyCrypto 生成交易簽名,并在準備就緒時將它們發送至太極網路,或使用 ethers.js (或其它代碼庫)編寫代碼來創建已簽名交易。
使用帶有自毀功能的智能合約
這個方法和使用太極網路差不多,我們可以使用智能合約將 ETH 轉入賬戶,同時不會在公共交易池中暴露這筆交易。為此,我們可以通過一個安全的地址部署智能合約,并通過其構造函數將 ETH 發送到被黑的地址上(這將是一筆內部交易)。
pragma solidity >=0.7.0 <0.9.0; contract MoveETH { constructor(address sendToAddress) payable { address payable addr = payable(address(sendToAddress)); selfdestruct(addr); }} ` 通過部署該合約,我們可以將 ETH 和被黑地址的字符串發送至構造函數的參數。該合約會在同一筆交易中創建并自毀。其中,`selfdestruct()` 意味著我們會在同一筆交易中清除該合約的區塊鏈狀態(因此這個合約是一次性的),并將 ETH 發送至被黑地址。 `
例子:
https://goerli.etherscan.io/tx/0x82ccb222eae55aaea73dd0efee1ea6ed7320f880889f280d4a343b8823f86692
請注意,這個方法雖然有效,但是會額外增加成本,因為我們要做的操作不只是將 ETH 從一個賬戶轉移到另一個賬戶。這個方法需要大約 7 萬 gas 的成本。當 gas 價格處于高位時,僅 gas 成本就高達 0.0112 ETH,
接下來,我們將通過太極網路廣播來自被黑地址的已預先簽署過的交易(這里也可以使用公共節點,請將賬戶中的全部 ETH 余額設為 gas 費,以免被 「清道夫」 搶跑(至少盡量降低這種可能性),因為在這種情況下, 「清道夫」 必須發送更多 ETH 到被黑賬戶才能在 gas 費競價中勝出),
使用 Flashbots
一般來說,我們需要支付 ETH 才能讓交易上鏈(因為交易費由交易發送方支付)。但是,有了 Flashbots,我們就可以在不支付 gas 費(即交易費)的情況下將來自外部賬戶的交易上鏈,只需使用另一個賬戶中的資金來 「賄賂」 礦工即可,也就是說,我們不需要向被黑地址轉入一筆 ETH 作為手續費,就可以取走這個地址上的代幣。沒錯,就是這樣!
這個方案需要用到兩個賬戶 —— 被黑賬戶和用來賄賂礦工的賬戶。
Flashbots 團隊已經發布了一個名為 Flashbots/searcher-sponsored-tx 的項目,其中介紹了如何通過這個方案將交易上鏈的基本原理。
我們將使用另一個賬戶中的資金來支付交易費,因此不需要被黑賬戶中有 ETH,事實上,我們巴不得被黑賬戶里沒有 ETH,畢竟我們最不想看到的,就是 騙子 /「清道夫」 察覺到我們想要取走資金,使用賬戶內原有的 ETH 來搶跑我們,
為了確保被黑賬戶中沒有 ETH,我們強烈推薦大家運行一個燃燒器機器人(burner bot)。
我們通常建議在一臺以上的機器上運行燃燒器機器人,并針對每個實例使用不同的 RPC 節點,例如,使用 Infura 在本地運行一個燃燒器,并使用其它提供商(如 Quiknode)在遠程服務器上運行一個燃燒器。這樣就可以實現冗余,以防高網路延遲或節點故障等問題(例如,速率限制、同步問題等),
Flashbots/searcher-sponsored-tx 中的代碼需要根據你的具體需求進行修改,不過這里有個引擎可以幫助你挽救被黑地址中的代幣。Flashbots 引擎具有很高的靈活性,可以支持單個 transfer()
調用,或 unstake()
和 transfer()
調用,
如果你不懂代碼,也可以試試 @kendricktan/flashbots.tools 網站提供的 Flashbots 功能 UI:https://flashbots.tools/。
打個廣告:如果上述方案對你來說太難,你也可以向我們尋求幫助,我們會收取找回資金的 5% 作為報酬。雖然我們也想免費提供該服務,但是由于收到的請求太多,我們的時間實在有限,我們會將這項服務的收入所得用來促進區塊鏈行業的安全發展!
感謝你的理解。
如果你想要獲取該服務,請向 [email protected] 發送主題為 「Account Sweeper – Requesting Assistance!」 的郵件,
上述信箱地址是尋求幫助的唯一渠道。我們不會在 Telegram、Discord 或其它地方宣傳該服務,以免帶來額外的風險。
如何從根本上規避 「清道夫」?
最好的防范措施當然是保護好自己的地址不被 「清道夫」 侵入,也就不需要與 「清道夫」 斗智斗勇了。
近年來,我們已經在一些 app 的 UI 上看到了反面例子 —— 允許用戶在 dapp 界面上使用原始保密資訊,這是很不安全的做法,不應該被鼓勵。
永遠不要在聯網設備以及任何網頁上輸入你的原始保密資訊(私鑰、key store 文件和助記詞)。
我們建議使用硬件錢包來確保私鑰存放在獨立設備上 —— 如果你使用 MetaMask 與 dApp 進行交互,MetaMask 最近發布了一個更新,可以讓用戶使用多個硬件錢包地址,
- 購買 Ledger
- 購買 Trezor
如果你使用移動設備與 dApp 進行交互,我們建議使用 WalletConnect 簽署消息(注:WalletConnect 永遠不會要求你提供保密資訊)。
來源鏈接:blog.mycrypto.com