1. 程式人生 > >智慧合約安全事故回顧(4)-針對Fomo 3D的DDOS攻擊事件

智慧合約安全事故回顧(4)-針對Fomo 3D的DDOS攻擊事件

上一章有介紹關於DOS的攻擊。DDOS是DOS攻擊的一個實現方式,如果把DOS理解為是一次野蠻的搶劫,那麼DDOS可以說是一次針對伺服器的群毆了。

DDOS全稱是分散式拒絕服務攻擊,攻擊者往往通過控制一些“肉雞”來針對某個伺服器發起大規模的流量攻擊。這些肉雞一般是攻擊者事先準備好的一些傀儡機,傀儡機的多少決定了攻擊的強度。在區塊鏈世界中,也存在一些通過DDOS攻擊導致的安全時間。本文介紹的就是註明的Fomo 3D遊戲被DDOS攻擊導致崩盤的事件。

 

事件介紹

Fomo3D是一款執行在區塊鏈上的“龐氏騙局”遊戲。遊戲中剛開始時就存在一個倒數24小時的計時,玩家通過花費eth來購買遊戲中的key,這些花費的eth會被記入獎池,並且延長三分鐘倒計時時間。後面加入的玩家需要支付高出前一次購買的價格來購買key,而當沒有人繼續購買key時,倒計時就會慢慢結束,遊戲也隨之結束。最後一個購買key的玩家會獲得獎池中48%的獎金額,也就是獎池中的大部分eth。2018年8月22日,Fomo3D遊戲第一輪結束,一個錢包開頭0xa169的使用者獲得10469eth的獎金。這看起來沒什麼問題,然而人們後來發現這位玩家早就通過DDOS攻擊的手段,讓自己有很大概率成為最後的勝利者。人們發現在最後開獎的三分鐘內,以太坊總共完成了12個區塊鏈的打包,然而卻沒有一個關於Fomo3D合約的交易,事實上真的沒有玩家發起交易嗎?

攻擊方式/原理介紹

那麼我們前面講過DDOS就是一次分散式的拒絕服務攻擊。這個專案中,黑客的思路很簡單:在黑客購買key之後,讓伺服器不接受其他人的購買請求,等待時間倒數,那麼最後黑客就理所當然的成為了最後的贏家。

那麼如何讓伺服器不接受其他人的請求呢?在這裡需要需要了解的一個知識點是,以太坊大概14S會完成一次出塊,礦工會將接收到的交易篩選打包,而最後完成pow的節點獲得出塊權。由於每個交易都帶有以太坊規定的手續費gas,那麼礦工為了自身的利益,自然回選擇手續費高的交易優先打包。而每筆交易也可以設定gas limit(手續費上限),如果最後消耗的gas超過gas limit,交易就會失敗進而回滾。

在回到攻擊事件上來,聰明的讀者應該會想到,攻擊者正是通過傳送大量的超高gas的交易,讓礦工優先打包自己傳送的無用的交易來讓其他的正常交易不能被打包到塊中。具體過程如下:

1.攻擊者首先在恰當的時機買入key,讓自己成為最後一個購買者。

2.攻擊者開始進行DDOS攻擊:通過提前準備的合約傳送大量的交易,這些交易都有一個共同的特點就是高額的手續費。

3.攻擊者同時不斷呼叫Fomo3D合約的getCurrentRoundInfo方法(獲取當前最後一個購買者地址),通過該方法判斷自己是不是最後一個購買者。因為第二步只算是一種擁堵的方式,誰也不能保證沒有其他交易被打包。

4.到這裡,讀者應該發現攻擊者並不是一味的無腦花費鉅額的手續費讓區塊打包。而是在最後的時間內(設定某個預置),通過第三步判斷,如果自己不是最後的購買者,攻擊者會回滾自己的交易,只需要消耗少量的gas。而如果自己是最後的購買者則讓交易失敗,但是花費大概的gas給礦工,吸引礦工打包。完成這一步的主要依據是assert()函式的妙用。以太坊中有assert函式和require函式,兩者的作用都是判斷某個條件是否滿足。而區別在於require如果不滿足會把gas退還給呼叫者,交易失敗。而assert則會標記交易失敗,但是會扣除gas。

5.到這裡攻擊基本完成,攻擊時間段內其他關於Fomo3D遊戲的交易通過正常的方式提交,礦工大概率不會打包這些交易。對於我們來說,就像是伺服器拒絕服務。最後攻擊者實現了一次巧妙的“小投資,高回報”的DDOS 攻擊。

防範

講到如何防範就得知道為什麼會有這個漏洞可以被攻擊。我們講區塊鏈是去中心化的,Fomo3D遊戲一時火爆無外乎是人們覺得公開透明,資料無法被篡改。然而去中心化的區塊鏈又跟“逐利”的人是衝突的,例如礦工總是會選擇手續費高的交易進行打包,這也無可厚非。所以在防護時,並不是像之前那樣修改某段程式碼就能解決。針對此次DDOS攻擊:一方面應該在getCurrentRoundInfo介面遮蔽掉合約對該函式的呼叫,這樣攻擊者就不能完成自動化的攻擊。同時提高攻擊成本,我們在前面看到最後的獲勝者只獲得了48%的獎池獎金,那麼剩下的部分可以用來作為交易費用的一部分,並且可以在規則中修改,最後一個購買者有大概率獲獎,然而也並非百分百。當然這些都是在明確攻擊手段的情況下給出的防範,真正安全的合約還是應該加強安全的同時也能在出現問題的時候既是修復。我們知道,Fomo3D遊戲的第二輪的獎金得主同樣被黑客摘走。

安全防範,任重而道遠。