風險提示:防範以"虛擬貨幣""區塊鏈"名義進行非法集資的風險。——銀保監會等五部門
資訊
發現
搜索
登錄
简中
繁中
English
日本語
한국어
ภาษาไทย
Tiếng Việt
BTC
ETH
HTX
SOL
BNB
查看行情
EOS中的“鈔級騙局”:偽EOS及其變種攻擊
成都链安
特邀专栏作者
2019-09-29 03:04
本文約3322字,閱讀全文需要約5分鐘
DApp假幣魚目混珠,轉賬函數檢測疏漏馬虎。

前情提要

前情提要

前情提要

本期話題

本期話題

本期話題

DApp假幣魚目混珠,轉賬函數檢測疏漏馬虎

二級標題

二級標題

基礎知識鋪墊

EOS智能合約的架構

EOS智能合約是由一系列action組成的,每個action代表一條合約條款,以實現條款中的具體規則。執行一個EOS智能合約分為製作、部署、調用三個部分。

其中,在部署智能合約這一步,每個EOS智能合約必須實現一個apply()函數,作用是將action請求映射到具體的處理函數。具體的實現細節封裝在EOSIO_ABI宏裡面。這樣的設計讓開發者只需要專注業務邏輯的開發,而不必關注底層技術,起到簡化開發的作用。 apply函數示例:

 偽EOS轉賬攻擊

歷史事件:

大名鼎鼎的EOSBet在9月12日損失約42,000 EOS,開始了黑客使用偽EOS token攻擊的熱潮,接下來就是eoswindice和去中心化交易所newdex,都淪落為黑客的“魚肉”。

攻擊分析:

在EOS鏈上通用代幣為EOS token,EOS token是由EOSIO部署的eosio.token合約生成的,但是eosio.token代碼是開源的,任何eos賬戶都可以自己部署eosio.token合約,並且發行縮寫名為EOS的token,如圖我們可以看到大量無價值的偽EOS:

如何鑑別真偽EOS呢?驗鈔機嗎?當然不用, eosflare瀏覽器上會顯示token的全名,真EOS和假EOS全名是有區別的:

從圖中可以看到一個是EOS且後面沒有其他說明,另一個是refundwallet偽造的EOS (refundwallet)。

在瀏覽器中,我們可以看到交易細節來判斷用來交易的EOS token是真是假,那麼如果放在智能合約中呢?

比如案例合約:

void transfer(const account_name& from,

                            const account_name& to,

                            const asset& quantity,

                            const string& memo)`

這是一個用來接收回調的函數,在被傳遞假EOS時,函數是沒有辦法分辨真偽的。如果沒有提前在apply中檢測EOS真假,就會導致合約接收了假的EOS也會執行正常業務邏輯。如果惡意賬戶自己部署合約發布一個EOS token,就可以實現空手套白狼,用假鈔換真錢。

漏洞修復:

二級標題

二級標題

漏洞分析:

漏洞分析:

按照上述漏洞修復手段添加相關判定後,許多項目方長籲了一口氣,但是引發EOSBet事件的漏洞代碼並沒有那麼簡單就被修復。因為,在使用上述的apply對code調用進行檢測時,還存在另一種繞過的情況,檢測條件如果只為:

if( code == self || code==N(eosio.token) ||action == N(onerror))

那麼這個檢測條件只處理兩個檢測:函數自身action的調用和來自eosio.token的action的調用,沒有校驗transfer action的調用方必須是eosio.token或自己的合約。

這樣就會導致可以直接調用合約賬戶下的transfer。

比如,原本是用戶A調用eosio.token給用戶B轉1 EOS,然後eosio.token發送trasfer回執調用到B合約transfer函數執行業務邏輯,現在的話就可以直接調用B合約的transfer函數,裡面指定from, to,value等正確的參數,不通過轉賬直接執行到B合約的業務邏輯。所以進攻EOSBet的攻擊者完全繞過eosio.token->transfer函數,直接以正確的參數調用eosbetdice11->transfer,在不將EOS轉移到合約的情況下執行了合約的業務邏輯。

漏洞修復:

二級標題

二級標題

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

        {                                                                                }  

變體2 EOS假回執攻擊

歷史事件:

在9月14日的事件之後,EOSBet還發過官方聲明提到他們對代碼安全的重視程度。

漏洞分析:

漏洞分析:

漏洞原因是智能合約處理邏輯的transfer函數內缺少對to的判斷:如果缺少to判斷,合約無法判斷收到轉賬的是不是自己,可能在沒有收到轉賬的情況下繼續執行邏輯功能,假設攻擊者擁有AB兩個賬戶,c是遊戲合約賬戶,攻擊者可以通過A賬戶調用eosio.token轉賬EOS到B賬戶,然後在A或B賬戶部署合約,在回調transfer中再調用一次require_recipient(N(XXXXXX) );將轉賬通知發送到遊戲合約C賬戶,這樣就可以繞過code==N(eosio.token)&&action==transfer的校驗,執行相應的業務邏輯。

二級標題

void transfer(const account_name& from,

                            const account_name& to,

                            const asset& quantity,

                            const string& memo) {

二級標題

         return;

     }

代碼安全非黑即白

引用:

引用:

引用:

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

[2]: BET被黑客攻擊始末,實錘還原作案現場和攻擊手段

[3]: 震驚! EOSBet又被攻擊了。損失高達500萬。攻擊手法竟是這樣?

[4]: How EOSBET attacked by aabbccddeefg

[5]: EOSBet Transfer Hack Statement

智能合约
安全