導讀:此次TronBank合約被盜事件再次印證了一個簡單到令人髮指的常識——所謂智慧合約的開源並不能等同於“無條件的安全”,而且粗糙的去中心化機制可能存在被利用的中心化黑幕可能。在目前這個混沌無序的市場環境中,作為一個成熟的“韭菜”,請不要再輕易相信任何口頭上的去中心化承諾。
北京時間5月3日凌晨4點12分,一筆神奇的合約呼叫轉走了TronBank合約中的2673萬TRX(價值427萬RMB),合約餘額歸零。
僅僅在20多天前,Tronbank團隊的第二個遊戲BTTBank在釋出3小時內即被駭客用假幣攻擊並盜走數千萬BTT(並非1.8億BTT),事隔不到一個月,第三款遊戲TRX Pro於4月29日20點正式上線,幾天時間之內,合約餘額已經突破2500萬TRX。
這是否是TRON生態上的Dapp又一次被駭客盯上併成功洗劫一空?
而接下來發生的這一切
更讓所有人始料未及
偶然觸發的Bug?
合約餘額歸零後,專案方telegram群裡面騙局和駭客的質疑聲不絕於耳,DappReview和小夥伴們開始著手研究到底發生了什麼。"駭客"的地址為THeRTTCvN4SHEVYNqcLVLNGGVsWLR4smyH,利用DappReview的玩家資料檢視工具,可以看到該地址的所有者像是一個正常的Dapp玩家,從今年1月到5月該玩家涉獵過數十個Dapp,其中TronGoo是他玩過最多的遊戲,從TronGoo官方排行榜可以看到他就是排名第二的大戶玩家。
資料來源 https://player.dapp.review/
發生被盜事件約2個小時之後,在一個名為Scam Watch(騙局觀察)的Discord頻道中,調走這一筆2673萬TRX的地址THeRTT**擁有者wojak現身了。
根據wojak的說法,他寫了個指令碼在分析波場虛擬機器位元組碼,批次掃描合約併發起交易看看有沒有什麼能賺到錢的方法,結果偶然之中命中了Tronbank合約的bug。一開始連他自己都不知道這筆錢是從Tronbank打過來的。
社羣裡部分人建議wojak把錢還給Tronbank開發者,而wojak認為這不是他的問題,開發者應該自己寫測試例子,做審計以及至少跑一些形式化驗證(很顯然他們啥都沒幹),他願意把這筆錢原封不動還給Tronbank的每一個投資者,而不是專案方的開發者。
wojak要求參與了Tronbank的投資者發給他投資的交易hash值以及自己的地址,他將寫一個指令碼進行驗證,並承諾退款給有損失的Tronbank投資人。
刻意埋藏的後門?
隨著調查的深入,那一筆觸發Bug的交易被放回桌面上被仔細的剖析。我們再來看一下:
注意到,該筆交易呼叫的是合約裡withdraw函式,傳送的金額為0.011911 TRX,要注意在Tronbank正常的業務邏輯下,呼叫withdraw函式是不應該傳送任何TRX的,金額應該為0. 這一點在原始碼中就可以驗證。
像Tronbank這樣資金盤屬性的Dapp,往往都會把程式碼開源讓合約和邏輯變得透明可信來吸引投資人,在網站最明顯的位置,也標明瞭透過第三方驗證工具tronsmartcontract.space(以下簡稱TSC)進行合約程式碼驗證後的程式碼資訊。
從TSC點開原始碼之後,找到withdraw函式,函式第一行會先呼叫_withdraw()來取得可以提取的TRX金額,在_withdraw()函式的第一行我們可以看到:
require(msg.value == 0, "wrong trx amount");
這一行程式碼的意思是要求該筆交易傳送的TRX金額必須為零,否則無法繼續執行,交易會被REVERT。
也就是說,按照開原始碼的邏輯,那一筆觸發Bug的交易根本不可能發生。
現實變成了,TRX Pro的合約實際執行邏輯和所謂“開源”的程式碼邏輯並不一致。
這裡補充說明一下,所謂的程式碼認證過程是這樣:
1. 開發者在主網釋出合約
2. 開發者在TSC上傳程式碼,選擇編譯版本,編譯為bytecodes,
3. TSC把步驟2中的bytecodes和步驟1中釋出合約的bytecodes做匹配,匹配成功,則認證透過,理論上多或者少一個空格都不行
進一步深扒,從tronscan上找到TRX Pro合約的bytecodes,用反編譯工具進行處理得到:
反編譯工具:
https://www.trustlook.com/products/smartcontractguardian
在withdraw函式中,多了一個判斷 else if ((0x2E87 == msg.value)),如果滿足條件,那麼就會把合約的餘額全部轉給交易發起者!我們把16進位制的數字0x2E87轉換成10進位制,也就是11911,要知道TRX的精度為6位,11911所對應的TRX金額就是0.011911 TRX... 而這一部分判斷在TSC的開原始碼中是不存在的,看起來就像是是一個被藏起來沒有公佈的後門。
用更簡單的語言梳理一遍:
1. 在主網上部署的合約,透過反編譯發現,呼叫withdraw函式時,如果傳送金額等於0.011911 TRX,則會轉移全部合約餘額;
2. 在TSC上認證過的開原始碼中,如果傳送金額不為零呼叫withdraw函式,交易會被撤回。
那麼一切就很清晰了,實際發生的與第一點完全吻合,主網的程式碼執行沒有問題,即TronBank在主網部署的合約中存在一個可以直接提走合約餘額的後門程式碼,而有意思的在於第二點,明明不一樣的程式碼邏輯是如何上傳後透過了TSC的認證過程?
根據已有的資訊,斷定“是開發者在合約之中放置後門”這個結論仍然為時過早,目前我們可以得出的客觀結論只有兩點:
1. TRX Pro在主網的合約中存在後門
2. TSC上認證過的程式碼與實際合約執行邏輯不符
注:以下內容是基於現有事實依據的可能性探討,不代表最終結論和真相,請在傳播時不要斷章取義。
至於後門是誰放置的,如何放置的?目前沒有任何實錘證據,有的人認為是Tronbank開發者,有的人認為開發者的實力還不足以透過欺騙TSC驗證與實際部署所不同的程式碼。
客觀來分析存在的可能性(注意,此處僅討論可能性,即便該可能性極低,真相目前沒有任何實錘證據),有以下幾種:
可能性一:Tronbank開發者在實際部署的合約中夾雜私貨放置了後門,併成功欺騙了TSC完成了另一份沒有後門的程式碼驗證。
在探討這種可能性時,如何欺騙TSC成為了焦點,如果真的TSC的驗證存在Bug,那麼這意味著之前所有透過TSC認證並標榜開源的Dapp都不再可信和透明,事實上,在Discord群裡,TSC的開發者Khanh承認程式碼已經很久沒有維護並存在bug的可能性,也有其他開發者證實自己實際部署的程式碼和透過認證的程式碼可以不完全相同。
另一方面,Tronbank開發者在Telegram群中多次聲稱團隊沒有在合約中放置任何的後門,有一種自證清白的方式是:官方給出部署時的原始碼以及編譯方式(包括編譯工具以及版本),理論上任何人按照同樣方式編譯出來的bytecode和線上部署的TRX Pro合約應該一致。但當我們提出該質疑時,官方回覆如下:
這個回覆的內容如果當真,則該事件將更加戲劇化和複雜化,參考可能性三
可能性二:Tronbank團隊和TSC團隊合謀,部署了有後門的合約,同時TSC協助用另一個沒有後門的合約完成驗證。
這是在“欺騙TSC”很難成立的前提下提出的可能性,TSC最終打上驗證的標籤其實是中心化的行為,完全可以人為操作,但對於TSC作為一個第三方合約驗證工具來說,目前尚無競品,做這樣的事情無疑嚴重損傷自己的品牌,串通合謀是在價效比太低。
可能性三:Tronbank團隊沒有在合約中放置後門,而是後門在合約部署過程中以某種方式產生。
這種可能性是基於“可能一”中的官方回覆的一種暗示,即專案方在合約部署時確實使用的是沒有後門的合約,編譯工具在部署合約到主網的過程中出現了貓膩,加入了有問題的後門。但專案方目前沒有提供任何的可驗證資訊,使用的編譯工具,以及同樣程式碼兩次編譯不同結果的資訊。
不論如何,TronBank開發者實際部署的程式碼原樣我們不得而知,也無法驗證真偽,該事件的真相需要等待各方提供更有說服力的證據才能被逐漸還原出來。
至少在此刻,我們還不能下定論,究竟是誰埋下了這個後門。
投資者的錢怎麼辦?
在以上錯綜複雜的資訊之下,大部分玩家已經放棄了追查真相,而更關注的則是找回損失。
在承諾退款並要求蒙受損失的投資人傳送交易資訊之後,wojak整整失聯了超過12小時,這期間wojak賬戶裡的錢大部分被轉移到了幣安交易所。有人開始懷疑wojak並沒有打算退錢準備捐款跑路,還有人認為這是TronBank專案方監守自盜,wojak就是專案方之一。
5月3日下午2點44分
另一邊,在Tronbank的官方群裡,管理員貼出的置頂訊息是“TRX Pro被駭客THeRTTCvN4SHEVYNqcLVLNGGVsWLR4smyH攻擊,目前開發團隊正在緊急處理,將會及時在群裡更新訊息”
5月3日晚上9點13分
wojak再次現身,說自己花4個多小時寫了指令碼從鏈上獲取到tronbank的投資資料來跟收集到的損失資訊對比,其中有不少人虛報損失,甚至有完全沒有參與過投資的使用者也來謊報損失,僅有少數人誠實地彙報了數字。wojak也把比對資訊貼了出來https://pastebin.com/raw/gMtxCw97。
5月4日下午1點24分
整整一天之後,Tronbank專案方再次發出通知,他們正在聯絡wojak進行退款,如果wojak在5月4日晚7點時沒有任何回覆,官方將提供給投資人的補償方案。
5月4日下午3點 - 4點
針對之前所承諾的24小時內給出事件分析報告,官方將再次延期,聲稱將聯絡安全公司,TSC以及波場官方做更多的調查。同時評論到,有很多細節仍需確認,之前從未遇到類似情況,這有可能是一個精彩的故事。
5月4日晚上7點
Tronbank專案方如約公佈了賠償方案,令大部分人吃驚的是專案方沒有跑路,而是承諾在24小時內收集資訊,並在72小時內進行全額賠付。如果賠付照常發放,這可能是Dapp歷史上最大的一次專案方賠付。
而此次賠付通知,可以說是給投資者吃了一顆定心丸,使得大部分使用者打消了“後門是由開發者留下”的疑慮。但在真相露出水面之前,DappReview依舊保留質疑的態度,等待專案方公開更多的調查報告。
結語
原本看起來是一起常見的駭客攻擊事件,卻喜劇般演化成一場羅生門。究竟是開發者留後門,巧被程式設計師開啟,還是如專案方所說有更底層的問題存在?除了當局者本身,無人知曉。
投資者們對於去中心化的信任(TSC提供的程式碼認證)崩塌,寄託於中心化的信任(起初是wojak的承諾,後來是Tronbank的賠付公告)。雖然嚴格意義上來講最終的真相可能並不是“去中心化的鍋”,但對於普通使用者而言,很難區分其中差異,大部分使用者的認知只能停留在“智慧合約為什麼開源了明明沒有問題還被黑了?”
在本次事件中,雖然Tronbank承諾賠付投資人受損的利益,但受傷的無疑是波場的整個Dapp生態,基於TSC認證的開原始碼所產生的信任和背書已經毫無價值,在波場官方出來驗證工具之前,DappReview建議各位Dapp玩家不要輕信專案方所謂程式碼開源言論。
此外,截至到發稿,wojak尚未再次露面,也未將資金退還給任何投資人。