這次我們殺出了以太坊 DeFi 黑暗森林,完美拯救 960 萬美元

買賣虛擬貨幣

撰文:Sam Sun、Alex Wade、Scott Bigelow、Tina Zhen、少平

2020 年 9 月 15 日,一個行動小組徹夜合作,從一個脆弱的智慧合約中救出 960 萬美元。下文講述了他們的故事。

Sam Sun aka samczsun 自述

下面我總結一下審閱部分智慧合約發生的故事。

當然我沒想到會有什麼有趣的事兒。過去的幾週中我看了無數收益耕種(yield farming)克隆專案一模一樣的宣傳模式:把你的代幣放到我們手中,你就可能會成為下一個加密百萬富翁。多數克隆專案只是對經過良好審計的程式碼進行分叉,加上些許的調整,而這有時會帶來災難性的結果。

但是在所有的喧囂中,有些程式碼我以前從未見過。本文中的主角、這份智慧合約持有超過 25,000 個 以太幣 Ether,當時價值超過 960 萬美元,對於那些拼命從邏輯上發現錯誤的人來說,這將是一次收穫滿滿的狩獵。

我迅速看了一下將 ETH 轉出的程式碼,發現了兩個匹配項。其中之一將 ETH 轉移到了硬編碼的代幣地址,因此可以忽略。第二個是將 ETH 轉移給傳送方的焚燬功能。在跟蹤了此功能的用法之後,我發現任何人可以免費為自己鑄造代幣,然後將其焚燬,換取該智慧合約中的所有以太幣都是不費吹灰之力的。我的心跳加速了。突然,問題變得嚴重了。

我那份智慧合約是 Lien Finance 協議。不幸的是,他們的團隊是匿名的!唯一的即時訊息支援平臺是 Telegram,而我不確定該 Telegram 頻道的管理員是開發者還僅僅是某些早期支持者。我可萬萬不想將這一漏洞意外透漏給錯誤的人。

在他們的網站又多瀏覽了一段時間,我發現他們曾與 ConsenSys Diligence 和 CertiK 合作,接受其程式碼審計。這看起來像是很不錯的途徑, ConsenSys Diligence 和 CertiK 在審計期間肯定和開發者進行過互動。我迅速在 Telegram 上私聊了 ConsenSys Diligence 的安全工程師 John Mardlin (aka maurelian) 。

發起聊天等回覆是太煎熬的事兒。不幸的是,時間一分分過去,maurelian 沒回應。他好像已經睡了。絕望之下, 我向 ETHSecurity Telegram 頻道發了條訊息,詢問 ConsenSys 有沒有哪位沒有睡,請速聯絡。

幾分鐘後,我收到了一位過去有過幾次合作的人的回覆——Alex Wade,ConsenSys Diligence 的另一位安全工程師。

Alex Wade 自述

我的腦袋剛剛沾上枕頭,聽到我室友敲門。「Sam 在 ETHSec Telegram 頻道問有誰認識 ConsenSys Diligence 的任何人。」

Sam 與 Alex 對話中說今晚可能會是個漫漫長夜,事實確實如此

一聽說是 Sam,我就知道這不會是什麼好事。我找到了幾個月前建立的與 Lien 溝通的頻道以及一個電郵地址。他們團隊可是個匿名團隊,有這些總比什麼都沒有強。

我當時依然半睡半醒。Sam 不想在聊天中具體詳談,要求 Zoom 對話。我一面後悔幹嘛要起床,一面評估事態的嚴重性:

五分鐘後,我清楚瞭解我得喝咖啡提提神開始幹活了。

Sam 和我一起審閱了程式碼。Sam 當時已經準備好一個樣品測試,能在其機器上確認這一問題。我們的對話尋找轉移到討論可行性方案:

  1. 我們自己動手拯救這筆錢。
  2. 聯絡上 Lien 團隊,讓他們公開身份,敦促使用者撤資。

兩者都不是很讓人滿意的選擇。第一個舉動極為危險,如果您讀過 Dan Robinson 與 Paradigm 研究合夥人 Georgios Konstantopoulos 所討論的以太坊 DeFi 黑暗森林(鏈聞中文版)一文 ,我們的交易被搶跑截胡的概率極高。第二種選擇幾乎同樣危險,因為公開宣告會引發外界對該問題的關注,給攻擊者帶來一個機會視窗。我們需要的是第三種方案。

回想起以太坊 DeFi 黑暗森林一文中的部分內容,Sam 聯絡了 Amberdata 工程副總裁 Scott Bigelow:「如果你切實陷入了這種困境,我建議你去找 Amberdata 工程副總裁 Scott Bigelow,他是一直研究這一課題的安全研究人員,有一套能更好實現瞞天過海目的的原型實施策略。」

Scott Bigelow 自述

我參加了 以太坊 DeFi 黑暗森林 一文中的資金拯救行動,最終敗給黑暗森林狙殺者之後,我非常渴望能重賽一場。我花了一些時間監控搶跑截胡行動,設計了一個簡單的系統,似乎能夠騙過一般的搶跑者,至少我個人投入測試的 200 美元是成功拯救了出來。當 Sam 深夜聯絡我,誠懇得說「介意佔用你大約一個小時左右時間嗎」,我摩拳擦掌準備嘗試了!我已經設想了那個畫面:我如何做幾個技術調整,需要幾個小時,然後成功拯救使用者數千美元的資產,戴著那種成就感,好好地睡上一晚。

當 Sam 分享給我這個智慧合約後,這些計劃瞬間七零八碎:大約 25,000 個 ETH,價值 960 萬美元。我雖然非常想進行這種重賽,但我那幾行破程式碼可不是給 960 萬美元這種級別資產設計的。

過去幾個月,我一直試圖與礦工們拉上關係,就為了這一目的:進行這類白帽拯救交易。如果有一個時間點需要礦工們幫忙,在其挖礦中寫入一筆交易,以免被搶跑者偷走這筆錢,那就是現在。幸運的是, Tina Zhen 和我過去幾個月聯手尋求建立這種協作關係。當時這一拯救行動的成功希望渺茫,但值得一試:讓 Tina 參與這一拯救行動,與一個礦池合作挖出一筆私下交易。

Tina Zhen 自述

我剛剛因為加州代號「山貓」的森林大火從家撤離,當時正在喝著不知名的沙灘飲料,聽著暗淡的太平洋送來的海浪聲,Sam 的 Telegram 私信使我回到了一個更黑暗的現實:「資金有風險,可能被截胡」。過去的幾週中,我一直與 Sam 和 Scott 合作開展有關「礦工可提取價值」MEV 的研究專案,並且在他們傳送請求之前就已經猜到了:一個直接的渠道,可以保護白帽交易在以太坊記憶體池 mempool (待處理、未確認的交易集)這一「黑暗森林」中免遭「搶跑者」掠奪。

由於這是一個冒險的舉動,需要將我們的策略暴露給礦工,因此我們決定首先嚐試從匿名的 Lien 團隊獲得開綠燈批准。當 Alex 試圖透過 ConsenSys 內部頻道進行聯絡時,我們也嘗試聯絡 CertiK。

我意識到, Certik 在美國的審計人員得過四個小時才會起床,但時間已經刻不容緩。 我對 CertiK 瞭解不多,只是知道他們曾審計過幾個亞洲專案,於是試圖聯絡 CertiK 中國團隊。我在「 DeFi the World 」和「Yellow Hats」兩個微信群裡分別留了一條語音留言。我的私聊裡 30 分鐘內接到四條資訊,確認了我微信好友中的這個 ID 是真正的 CertiK 技術長倪兆中 Zhaozhong Ni。我被拉進由五位 CertiK 團隊成員組成的一個微信群中,而當時我依然不能透露相關專案或漏洞。為了將暴露風險和潛在責任降至最低,我們只能邀請一位 Certik 成員加入我們的白帽行動。經過官方郵件最終確認後,CertiK 的工程負責人 Georgios Delkos 加入我們的對話。

在 Georgios 的幫助下,Alex 得以迅速聯絡到 Lien 團隊,並驗證確認其身份。我們讓他們最快速度瞭解到目前的嚴峻形勢,爭取其同意,直接與一家礦池合作拯救這筆脆弱的資金。在考慮之後, Lien 團隊贊同直接拯救資金或釋出預警宣告過於危險,同意我們推進這一方案。

現在我們需要找一家基礎設施充分到位、願意儘快與我們合作的礦池。我們應該找哪家礦池?這家礦池的哪位聯絡人能迅速做出技術決策,幫助我們爭分奪秒執行這一行動?

我們想到了星火礦池 SparkPool,我知道了他們一直在打造名為 Taichi Network 的公眾基礎設施,能輕鬆給予我們所要的支援。我決定私聊星火礦池聯合創始人少平 Shaoping Zhang ,他之前曾幫我調查過 mempool 安全事件。

半個小時後,少平回覆了:「你是說我給交易開白名單?抱歉,我們不能。」 好吧, lost in translation, 中文裡「白帽」whitehat 和「白名單」 whitelist 看起來有點像。

「現在有 1000 萬美元危在旦夕。我和 Samczsun 線上,」我再次試圖在不透露任何具體細節的情況下溝通這一局面。

「你倆在拯救世界?需要礦池幫忙嗎?」有點意外也讓我鬆了一口氣,少平調侃著表示願意提供幫助。在經過官方郵件確認後, 少平進入我們馬拉松般的 Zoom 電話會,並由大批星火礦池開發人員給予技術支援。

少平自述

吃過午飯,我正準備小睡一會兒,然後收到了 Tina 的一條微信:「星火礦池幫忙進行過白帽交易嗎?」我一開始看錯了,當時看成了給交易開白名單。以前沒有人聯絡我們進行白帽交易,我們也不熟悉「白帽交易」具體什麼情況。Tina 更詳細解釋了以後,我意識到他們需要一筆私下交易服務,比如,白帽駭客想傳送交易來拯救一個 DeFi 智慧合約,但要防止被別人搶跑截胡,他們需要礦池在不廣播交易的情況下將交易寫入區塊。

我們一直在 Taichi Network 打造私下交易功能,這個功能還在開發中,還沒測試過。我把白帽駭客的請求告訴了我們的開發團隊,並強調了這種緊迫性:我們的私下交易功能需要在幾個小時內順利進入生產階段。 我們的開發人員說會盡力完成,然後迅速投入工作。我們在兩個小時內完成了私下交易功能的開發,又花了點時間修復了 bug。

我們完成了內部測試後,把 hitehat.taichi.network 端點傳送給 Scott Bigelow ,來完成白帽任務。

Scott Bigelow 自述

星火礦池加班加點推出了全新的白帽 API,Sam 和我也完成了指令碼程式設計,生成四個先後銜接的簽名交易。依次處理這些交易本身不會取出 25000 個 ETH,但會把(「錯誤」生成的) 30,000 個 SBT+LBT 代幣轉移給 Lien 團隊,他們可以將其提交給最終交易,將這些代幣再轉換成 ETH。

透過將可以無限鑄造的 SBT+LBT 代幣轉移給 Lien 團隊而不是 ETH,我們使用了更多交易作為障眼法,迷惑廣義強迫者的攻擊(如果遭遇重組),能夠讓 960 萬美元的收入一直不會進入我的腰包,片刻也不可以。

我們生成四個簽名交易後, Sam 和我花了大量時間、利用各種多方交易模擬工具驗證其連環行動。總資料量不到 1.5 KB 的這四個交易程式,就是拯救 960 萬美元資產的殺器,保障在星火礦池捕獲這些交易之前不會被任何人先知先覺。

我用一筆無意義的交易測試了星火礦池的白帽端點,其執行過程毫無偏差:該交易不會在 mempool 中看到,然後突然出現在星火礦池的一個區塊中!就像眼睜睜看著水蒸氣直接變成了冰,中間令人討厭的液化過程完全看不到!

我們調整了交易生成指令碼,將交易直接提交給星火礦池的新端點,現在該是行動的時刻了。我猶豫了一會兒,但這絕對是我們能做到的最好的努力。我們可能會損失掉這 960 萬美元,但不會後悔:我在 IntelliJ 中點選了「執行」。我不確定為什麼,但我之前預計整個過程會花點時間,就像節點會了解情況的嚴重性,然後在其中消耗一些時間。但實際上它沒有;交易以毫秒為單位傳送。

Zoom 通話中的每個人都開始瘋狂重新整理 Etherscan,我懷疑 Etherscan 團隊是否看到了這 3 分鐘的流量高峰。由於只有星火礦池有交易,並且星火礦池的雜湊率中只有一部分專用於此目的,我們能做的只能冒著冷汗焦急等待。每一個其他礦工挖出的每個區塊都讓我們膽顫心驚。Zoom 電話會中會有人伴隨著緊張的笑聲念出挖出區塊的礦工名稱。我們的交易被寫入區塊之前大約會產生 15 個區塊,我們卻感覺度日如年,像是經歷了幾個小時,但最終,我們完成了完美無缺的交易:依次挖出,沒有回滾。

我們如釋重負地看著越來越多的區塊疊加在我們的區塊之上,對區塊重組的擔憂迅速消失。Lien 團隊現在擁有足夠的 SBT + LBT 代幣來清算整個系統的資金,Sam 負責協調救援的最後階段。

Sam Sun 自述

現在我們已經成功地將代幣轉移給了 Lien 團隊,並沒有發現任何強迫截胡跡象、嘗試或其他跡象,我們很快用私聊告訴了他們這一好訊息。他們確認已收到代幣,並立即傳送交易,以取出智慧合約中鎖定的大部分 ETH。幾秒鐘後,Etherscan 上出現了這一待處理的交易。

看著進度條轉圈時,我藉此機會反思了這一行動。最開始就是看了看智慧合約,最終演變成吸引了世界各地專家通力協作的一場「拯救大兵瑞恩」行動。如果沒有 Alex 和 Georgios,我們將無法與 Lien 開發人員取得聯絡。沒有 Scott,我們的拯救行動可能早就陷入困境。沒有 Tina,我們將無法與 CertiK 或星火礦池取得聯絡。沒有星火礦池,我們註定要重演 Dan 幾周前文章中寫的悲劇。

然而在週二深夜,我們這個看似完全沒有可能合作的團隊為了同一個目標通力合作,經過不懈努力,最終確保 960 萬美元物歸原主。我們過去七個小時的努力最終匯成一筆待確認的交易和這個轉圈的進度條。

當進度條最終顯示為綠色對勾,Zoom 電話會的緊張氣氛終於煙消雲散,大家都長舒了一口氣。

https://etherscan.io/tx/0xe99ccb0b21854b65a2fa283638ab9ef01962b61c3310b596b4597bf22b911a43

我們終於成功殺出黑暗森林。

本文記錄了很多人努力工作的成功。特別感謝拯救危難的 Alex Wade、Scott Bigelow、Tina Zhen、Georgios Delkos 和星火礦池 SparkPool,以及審校本文並給予反饋的 Alex Obadia 和 Dan Robinson。

如果你對這一行動背後的技術細節很感興趣,請 點選這裡 瞭解更多。如果因為種種原因,你還沒讀過 以太坊 DeFi「黑暗森林」 一文,你確實應該讀一下。

免責聲明:

  1. 本文版權歸原作者所有,僅代表作者本人觀點,不代表鏈報觀點或立場。
  2. 如發現文章、圖片等侵權行爲,侵權責任將由作者本人承擔。
  3. 鏈報僅提供相關項目信息,不構成任何投資建議

推荐阅读

;