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