前情提要
前情提要
前情提要
本期話題
本期話題
本期話題
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萬。攻擊手法竟是這樣?;


