曲速未來披露:SIM token 自動化薅羊毛攻擊分析區(qū)塊鏈
曲速區(qū)表示前段時間利用SIMtoken合約代碼邏輯缺陷自動化薅羊毛的攻擊事件,攻擊者的思路很棒,對以太坊的一些原理理解非常深刻。
事件回顧:
前段時間追蹤到了以太坊token中的首個自動化薅羊毛攻擊事件。被攻擊的合約地址已發(fā)出。token名稱為Simoleon (SIM),截止當(dāng)時已有接近57萬賬戶持有該合約的token:
經(jīng)過深入的分析了解,最終發(fā)現(xiàn)了攻擊者對以太坊的理解非常深刻,其通過部署攻擊合約獲得了超過700萬的token,從57萬賬戶中脫穎而出,一舉成為該合約token的第四大持有者:
被攻擊的合約Simoleon
在token發(fā)行過程中,為增加人氣發(fā)行方可能會選擇空投,即在一定時間窗口和投放總量的條件下免費(fèi)給參與地址發(fā)送一定數(shù)量的token。Simoleon合約也加入了空投能力,在總量發(fā)放完之前,任何未接受過該token空投的賬戶都可以調(diào)用本合約的transfer函數(shù)給指定賬戶地址免費(fèi)轉(zhuǎn)賬token:
漏洞分析:
在transfer()中首先調(diào)用了initialize():
initialize()作用是判斷參與賬戶是否接收過空投,沒有接受過就給參與賬戶空投一定數(shù)量的代幣,再標(biāo)記參與賬戶以接收空投,以免重復(fù)空投被薅羊毛。
看似一段比較正常的代碼邏輯,但是開發(fā)者忽略了一個問題:錢包賬戶是可以無條件創(chuàng)建的。
Simoleon合約對已經(jīng)發(fā)放token的地址都進(jìn)行了記錄,因此每個地址只能免費(fèi)獲得1萬的token。要獲得更多的數(shù)量,就需要創(chuàng)建很多新賬戶,然后利用這些新賬戶調(diào)用Simoleon合約的transfer函數(shù)給指定賬戶來獲得大量token。如果通過創(chuàng)建EOA賬戶來進(jìn)行薅羊毛,則每個賬戶都需要一些以太幣,否則EOA賬戶就沒有g(shù)as去調(diào)用Simoleon合約的transfer函數(shù),也就無法薅羊毛。顯然,這樣不僅步驟繁瑣,而且每一筆交易都會產(chǎn)生手續(xù)費(fèi),增加了不必要的成本。
攻擊者在這里采用了一種精妙的攻擊手法:首先部署一個惡意合約,在惡意合約中生成臨時合約,臨時合約調(diào)用SIM token中的transfer(),因?yàn)榕R時合約賬戶沒有進(jìn)行過交易,會觸發(fā)initialize()進(jìn)行空投。獲得空投后,臨時合約賬戶將空投獲得的代幣轉(zhuǎn)入攻擊者賬戶,最后臨時合約銷毀。
這是攻擊一次的流程,攻擊者一次生成了50個臨時合約薅羊毛,效率比手工高太多了。
果然,知識才能解放雙手啊。
經(jīng)過分析,找到原因就在Simoleon合約的transfer函數(shù),合約在空投的時候也會對目標(biāo)地址進(jìn)行免費(fèi)發(fā)送token,但是這個發(fā)放卻沒有調(diào)用Transfer事件:
于是,攻擊合約的token變化過程如下:
攻擊合約被創(chuàng)建,token為零。
第1個臨時合約初始化時調(diào)用Simoleon的transfer函數(shù),由空投的1萬加上臨時合約發(fā)送的1萬構(gòu)成。
第2個臨時合約初始化時調(diào)用Simoleon的transfer函數(shù),由先前2萬加臨時合約發(fā)送的1萬構(gòu)成。
攻擊者從攻擊合約提取全部token,提取總量token為3萬。
總結(jié)
Simoleon合約能被自動化的薅羊毛,最根本的原因在于其合約代碼的空投獎勵函數(shù)沒有任何權(quán)限控制,任意未領(lǐng)過空投的賬戶都可以直接調(diào)用Simoleon合約來獲取。因此,攻擊者可以利用攻擊合約來創(chuàng)建大量賬戶來領(lǐng)取。一種緩解辦法是給空投獎勵函數(shù)設(shè)置權(quán)限控制,比如只有合約創(chuàng)建者才能給目標(biāo)地址發(fā)放token。
曲速未來實(shí)驗(yàn)室提醒:區(qū)塊鏈的特性決定了合約代碼一經(jīng)部署就無法修改,無論是合約的開發(fā)者,還是投資者,還是交易平臺,都應(yīng)當(dāng)對合約進(jìn)行多重安全審計(jì),盡量在上鏈前消除安全風(fēng)險。
1.TMT觀察網(wǎng)遵循行業(yè)規(guī)范,任何轉(zhuǎn)載的稿件都會明確標(biāo)注作者和來源;
2.TMT觀察網(wǎng)的原創(chuàng)文章,請轉(zhuǎn)載時務(wù)必注明文章作者和"來源:TMT觀察網(wǎng)",不尊重原創(chuàng)的行為TMT觀察網(wǎng)或?qū)⒆肪控?zé)任;
3.作者投稿可能會經(jīng)TMT觀察網(wǎng)編輯修改或補(bǔ)充。