1. 程式人生 > >假EOS攻擊再升級:EOSCast遭黑客“假EOS轉賬變種”攻擊,損失超6萬EOS

假EOS攻擊再升級:EOSCast遭黑客“假EOS轉賬變種”攻擊,損失超6萬EOS

10月31日凌晨,區塊鏈媒體鏈金術接到開發者爆料稱,類時時彩遊戲平臺EOSCast遭到黑客攻擊,7萬多EOS被黑客轉走。區塊鏈安全公司PeckShield隨即對相關賬號鏈上資料展開深入分析發現,今晨00:15起,黑客“refundwallet”嘗試對EOSCast遊戲合約“eoscastdmgb1”實施攻擊,黑客先以“假EOS”攻擊方式進行轉賬攻擊8次,未能得逞,後又採用“假EOS攻擊變種”的方式成功攻擊9次。

 

“假EOS轉賬變種”攻擊原理:

 

“假EOS”攻擊最早出現於EOSBet平臺上。一般意義上的“假EOS”理解是,黑客建立了一種基於EOS的代幣,並將其命名為“EOS”,開始大量給被攻擊合約賬號轉賬假EOS代幣,由於合約沒有檢測EOS的發行方,誤把“假EOS”轉賬視為真的,進而呼叫了合約中的transfer函式,按照開獎流程分配了獎金。這種“假EOS”攻擊方式,關鍵點是合約函式沒有檢測發行代幣的合約名。

 

黑客在盯上EOSCast遊戲合約後,首先嚐試用“假EOS”方式實施攻擊。黑客efundwallet發行了大量假EOS代幣,然後以每筆100個假EOS轉賬給遊戲合約eoscastdmgb1進行攻擊嘗試,由於遊戲合約對EOS系統合約(eosio.token)做了限定,黑客實施“假EOS“攻擊未能得逞。

 

於是黑客改進了攻擊策略,採用“假EOS轉賬變種”攻擊方式再次嘗試,其原理是強制呼叫遊戲合約transfer,由於遊戲合約eoscastdmgb1沒有對transfer的呼叫來源進行檢測,黑客將假轉賬通知寫進了transfer函式中,如下圖可以看出,transfer中的引數為"90558c86a7a997ba100e93296383305500e1f5050000000004454f530000000023656f7363617374646d6762312d6269672d6f64642d5b5d2d5b5d2d5b5d2d5b5d2d5b5d",通過EOS的RPC介面"v1/chain/abi_bin_to_json"解析可知為

{

    "args": {

        "from": "refundwallet",

        "to": "eoscastdmgb1",

        "quantity": "10000.0000 EOS",

        "memo": "eoscastdmgb1-big-odd-[]-[]-[]-[]-[]"

    }

 

(圖示一:  攻擊交易HASH頁面詳情  )

 

 

這樣一來,黑客在沒有進行“假EOS”轉賬的情況下,用偽造的transfer引數,把假EOS轉賬通知傳遞給了遊戲合約,致使遊戲合約誤判斷玩家進行了真實的EOS轉賬,從而依照開獎流程發放了獎金。值得一提的是,黑客為了轉賬隱蔽性也採用EOSBet假EOS轉賬攻擊時用過的方法對transfer引數進行了編碼處理,以此防止EOS瀏覽器的跟蹤。

 

 

 

 (圖示二:黑客對transfer引數進行了加密操作)

 

  

在短短4分鐘(4局遊戲)內,進行了9次“假EOS轉賬變種”攻擊。根據遊戲規則,黑客每次攻擊可得到198、9,800、19,600個不等的EOS,在實施最後一次攻擊時,遊戲方察覺到異常攻擊,及時轉走了獎金池僅剩的8,000個EOS。最終,黑客共計獲利63,014.1個EOS

 

攻擊後續:

 

在黑客refundwallet實施“假EOS轉賬變種”攻擊得逞後。今天,中午時分,PeckShield態勢感知監測平臺發現,賬號“xobkwdiifget”於11:03起在批量給多個EOS遊戲合約發攻擊測試,伺機找機會實施攻擊,截止15:43分,該賬號總共對168個遊戲合約嘗試進行攻擊。

 

不過由於遊戲合約的玩法中需要填入遊戲自定義的memo資訊格式,而xobkwdiifget 攻擊的memo始終是空的,即使遇到存在該漏洞的遊戲合約,也不會產生攻擊效果。不過,可以看出,此類假EOS攻擊事件愈加猖獗,對DApp生態產生了巨大威脅,PeckShield在此提醒廣大遊戲開發者警惕風險。

 

修復建議:

 

在apply過濾呼叫時,一方面是確認收到的EOS轉賬的合約是eosio.token,另一方面,要排除自己合約的transfer被呼叫的情況:

if((code == N(eosio.token) && action == N(transfer)) || ((code == self  && action != N(transfer))