這次我們殺出了以太坊DeFi黑暗森林,完美拯救960萬美元
編者按:本文來自鏈聞ChainNews(ID:chainnewscom),經授權發布。
編者按:本文來自
鏈聞ChainNews(ID:chainnewscom)
鏈聞ChainNews(ID:chainnewscom)
,經授權發布。
撰文:Sam Sun、Alex Wade、Scott Bigelow、Tina Zhen、少平
鏈聞ChainNews(ID:chainnewscom)
Sam Sun aka samczsun 自述
鏈聞ChainNews(ID:chainnewscom)
,經授權發布。
編者按:本文來自
鏈聞ChainNews(ID:chainnewscom)
鏈聞ChainNews(ID:chainnewscom)
,經授權發布。
撰文:Sam Sun、Alex Wade、Scott Bigelow、Tina Zhen、少平
Sam Sun aka samczsun 自述
Alex Wade 自述
下面我總結一下審閱部分智能合約發生的故事。
當然我沒想到會有什麼有趣的事兒。過去的幾周中我看了無數收益耕種(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 不想在聊天中具體詳談,要求Zoom 對話。我一面後悔幹嘛要起床,一面評估事態的嚴重性:
Scott Bigelow 自述
五分鐘後,我清楚了解我得喝咖啡提提神開始乾活了。
Sam 和我一起審閱了代碼。 Sam 當時已經準備好一個樣品測試,能在其機器上確認這一問題。我們的對話尋找轉移到討論可行性方案:
我們自己動手拯救這筆錢。
聯絡上Lien 團隊,讓他們公開身份,敦促用戶撤資。
鏈聞中文版
Tina Zhen 自述
)一文,我們的交易被搶跑截胡的概率極高。第二種選擇幾乎同樣危險,因為公開聲明會引發外界對該問題的關注,給攻擊者帶來一個機會窗口。我們需要的是第三種方案。
回想起以太坊DeFi 黑暗森林一文中的部分內容,Sam 聯絡了Amberdata 工程副總裁Scott Bigelow:「如果你切實陷入了這種困境,我建議你去找Amberdata 工程副總裁Scott Bigelow,他是一直研究這一課題的安全研究人員,有一套能更好實現瞞天過海目的的原型實施策略。」
Scott Bigelow 自述
我參加了
以太坊DeFi 黑暗森林
一文中的資金拯救行動,最終敗給黑暗森林狙殺者之後,我非常渴望能重賽一場。我花了一些時間監控搶跑截胡行動,設計了一個簡單的系統,似乎能夠騙過一般的搶跑者,至少我個人投入測試的200 美元是成功拯救了出來。當Sam 深夜聯絡我,誠懇得說「介意佔用你大約一個小時左右時間嗎」,我摩拳擦掌準備嘗試了!我已經設想了那個畫面:我如何做幾個技術調整,需要幾個小時,然後成功拯救用戶數千美元的資產,戴著那種成就感,好好地睡上一晚。
當Sam 分享給我這個智能合約後,這些計劃瞬間七零八碎:大約25,000 個ETH,價值960 萬美元。我雖然非常想進行這種重賽,但我那幾行破代碼可不是給960 萬美元這種級別資產設計的。
過去幾個月,我一直試圖與礦工們拉上關係,就為了這一目的:進行這類白帽拯救交易。如果有一個時間點需要礦工們幫忙,在其挖礦中寫入一筆交易,以免被搶跑者偷走這筆錢,那就是現在。幸運的是, Tina Zhen 和我過去幾個月聯手尋求建立這種協作關係。當時這一拯救行動的成功希望渺茫,但值得一試:讓Tina 參與這一拯救行動,與一個礦池合作挖出一筆私下交易。
我剛剛因為加州代號「山貓」的森林大火從家撤離,當時正在喝著不知名的沙灘飲料,聽著暗淡的太平洋送來的海浪聲,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 加入我們的對話。
現在我們需要找一家基礎設施充分到位、願意盡快與我們合作的礦池。我們應該找哪家礦池?這家礦池的哪位聯絡人能迅速做出技術決策,幫助我們爭分奪秒執行這一行動?
Scott Bigelow 自述
我們想到了星火礦池SparkPool,我知道了他們一直在打造名為Taichi Network 的公眾基礎設施,能輕鬆給予我們所要的支持。我決定私聊星火礦池聯合創始人少平Shaoping Zhang ,他之前曾幫我調查過mempool 安全事件。
半個小時後,少平回復了:「你是說我給交易開白名單?抱歉,我們不能。」 好吧, lost in translation, 中文裡「白帽」whitehat 和「白名單」 whitelist 看起來有點像。
「現在有1000 萬美元危在旦夕。我和Samczsun 在線,」我再次試圖在不透露任何具體細節的情況下溝通這一局面。
「你倆在拯救世界?需要礦池幫忙嗎?」有點意外也讓我鬆了一口氣,少平調侃著表示願意提供幫助。在經過官方郵件確認後, 少平進入我們馬拉松般的Zoom 電話會,並由大批星火礦池開發人員給予技術支持。
少平自述
吃過午飯,我正準備小睡一會兒,然後收到了Tina 的一條微信:「星火礦池幫忙進行過白帽交易嗎?」我一開始看錯了,當時看成了給交易開白名單。以前沒有人聯繫我們進行白帽交易,我們也不熟悉「白帽交易」具體什麼情況。 Tina 更詳細解釋了以後,我意識到他們需要一筆私下交易服務,比如,白帽黑客想發送交易來拯救一個DeFi 智能合約,但要防止被別人搶跑截胡,他們需要礦池在不廣播交易的情況下將交易寫入區塊。
我們一直在Taichi Network 打造私下交易功能,這個功能還在開發中,還沒測試過。我把白帽黑客的請求告訴了我們的開發團隊,並強調了這種緊迫性:我們的私下交易功能需要在幾個小時內順利進入生產階段。我們的開發人員說會盡力完成,然後迅速投入工作。我們在兩個小時內完成了私下交易功能的開發,又花了點時間修復了bug。
Scott Bigelow 自述
https://etherscan.io/tx/0xe99ccb0b21854b65a2fa283638ab9ef01962b61c3310b596b4597bf22b911a43
星火礦池加班加點推出了全新的白帽API,Sam 和我也完成了腳本編程,生成四個先後銜接的簽名交易。依次處理這些交易本身不會取出25000 個ETH,但會把(「錯誤」生成的) 30,000 個SBT+LBT 代幣轉移給Lien 團隊,他們可以將其提交給最終交易,將這些代幣再轉換成ETH。
我用一筆無意義的交易測試了星火礦池的白帽端點,其執行過程毫無偏差:該交易不會在mempool 中看到,然後突然出現在星火礦池的一個區塊中!就像眼睜睜看著水蒸氣直接變成了冰,中間令人討厭的液化過程完全看不到!
圖片描述點擊這裡我們調整了交易生成腳本,將交易直接提交給星火礦池的新端點,現在該是行動的時刻了。我猶豫了一會兒,但這絕對是我們能做到的最好的努力。我們可能會損失掉這960 萬美元,但不會後悔:我在IntelliJ 中點擊了「運行」。我不確定為什麼,但我之前預計整個過程會花點時間,就像節點會了解情況的嚴重性,然後在其中消耗一些時間。但實際上它沒有;交易以毫秒為單位發送。Zoom 通話中的每個人都開始瘋狂刷新Etherscan,我懷疑Etherscan 團隊是否看到了這3 分鐘的流量高峰。由於只有星火礦池有交易,並且星火礦池的哈希率中只有一部分專用於此目的,我們能做的只能冒著冷汗焦急等待。每一個其他礦工挖出的每個區塊都讓我們膽顫心驚。 Zoom 電話會中會有人伴隨著緊張的笑聲念出挖出區塊的礦工名稱。我們的交易被寫入區塊之前大約會產生15 個區塊,我們卻感覺度日如年,像是經歷了幾個小時,但最終,我們完成了完美無缺的交易:依次挖出,沒有回滾。我們如釋重負地看著越來越多的區塊疊加在我們的區塊之上,對區塊重組的擔憂迅速消失。 Lien 團隊現在擁有足夠的SBT + LBT 代幣來清算整個系統的資金,Sam 負責協調救援的最後階段。







