摘要: belluminarbank 是俄羅斯戰隊在 WCTF 上出的一道 EVM 題目,其中用到了很多 ETH 中經典漏洞。這道題的題目是一個存儲交易類合約,用戶可以通過給合約發送 ether 實現將 ether 存儲在合約中的目的。攻擊者的目標就是將存儲在這個合約裏的所有 ether 全部取走。

belluminarbank 是俄羅斯戰隊在 WCTF 上出的一道 EVM 題目,其中用到了很多 ETH 中經典的漏洞。雖然難度都不是很大,但是如果對 EVM 相關特性不瞭解的話還是有一定難度的,我們就來介紹一下ETH 智能合約中的安全問題。

我們不講這個WCTF的題目,主要是瞭解智能合約中的安全問題有哪些,危害多大;

就以太坊智能合約的安全漏洞。新加坡國立大學的Loi Luu提出了現在的智能合約存在的幾種安全漏洞。然而,由於智能合約目前還只是初級階段,相信各種安全問題會不斷的發現。

重入漏洞:

也被稱爲或與空競爭,遞歸調用漏洞,未知調用等。

菲爾戴安說過:這種漏洞在很多時候被很多不同的人忽略:審閱者傾向於一次一個地審查函數,並且假定保護子例程的調用將安全並按預期運行。

重入攻擊介紹:

1.重入攻擊,可能是最着名的以太坊漏洞;第一次被發現時,每個人都感到驚訝。

2.它在數百萬美元的搶劫案中首次亮相,導致了以太坊的分叉。

3.當初始執行完成之前,外部合同調用被允許對調用合同進行新的調用時,就會發生重新進入。

4.對於函數來說,這意味着合同狀態可能會在執行過程中因爲調用不可信合同或使用具有外部地址的低級函數而發生變化。

在以太坊中,當一個合約調用另一個合約的時候,當前的操作就要等到調用結束之後纔會繼續。這時,如果被調用者需要使用調用者當前所處的狀態,那麼這就產生了問題。

著名的DAO攻擊事件就是因爲這個漏洞而發生的。

示例:

1.⼀個聰明的合同跟蹤⼀些外部地址的平衡,並允許⽤戶通過其公共資⾦檢索withdraw功能。

2.⼀個惡意的智能合同使⽤withdraw函數檢索其全部餘額。

3.在更新惡意合同的餘額之前,受害者合同執⾏call.value(amount) 低級別函數將以太⽹發送給惡意合同。

4.該惡意合同有⼀個⽀付fallback接受資⾦的功能,然後回調到受害者合同的withdraw功能。

5.第⼆次執⾏會觸發資⾦轉移:請記住,惡意合同的餘額尚未從⾸次提款中更新。結果, 惡意合同第⼆次成功退出了全部餘額。

以下函數包含易受重⼊攻擊影響的函數。當低級別call函數向msg.sender地址發送ether時,它變得易受攻擊; 如果地址是智能合約,則付款將觸發其備⽤功能以及剩餘的交易⽓體:

從一道CTF題折射出的智能合約安全問題

交易順序依賴合約:

交易順序依賴就是智能合約的執行隨着當前交易處理的順序不同而產生差異。例如,有兩個交易T[1]和T[2],兩個區塊鏈狀態S[1]和S[2],並且S[1]狀態處理完交易T[2]後才能轉化爲狀態S[2]。那麼,如果礦工先處理交易T[1],交易T[1]調用的就是S[1]狀態下的智能合約;如果礦工先處理交易T[2]再處理交易T[1],那麼由於先執行的是T[2],合約狀態就轉化爲S[2],最終交易T[1]執行的就是狀態S[2]時的智能合約。

攻擊方法舉例:

攻擊者提交一個有獎競猜合約,讓用戶找出這個問題的解,並允諾給予豐厚的獎勵。攻擊者提交完合約後就持續監聽網絡,如果有人提交了答案的解,此時提交答案的交易還未確認,那麼攻擊者就馬上發起一個交易降低獎金的數額使之無限接近0。當礦工處理這兩個交易時,當前交易池就有兩個待確認交易:一個交易是提交答案,一個交易是更改獎金數額。如果礦工先處理的是敵手更改獎金的交易,而敵手可以通過增加交易費用讓礦工先處理自己的交易,那麼等到礦工處理提交答案的交易時,答案提交者所獲得的獎勵將變得極低,敵手就能幾乎免費的獲得正確答案。

時間戳依賴合約,也稱時間篡改;

礦工處理一個新的區塊時,如果新的區塊的時間戳大於上一個區塊,並且時間戳之差小於900秒,那麼這個新區塊的時間戳就是合法的。這是以太坊協議所規定的。時間戳依賴顧名思義就是指智能合約的執行依賴當前區塊的時間戳,隨着時間戳的不同,合約的執行結果也有差別。

攻擊方法舉例:

1.一場比賽在今天午夜付出了第一名球員。

2.惡意礦工包括他或她試圖贏得⽐賽並將時間戳設置爲午夜。

3.在午夜之前,礦工最終挖掘該塊。當前的實時時間“能夠接近”到午夜(當前爲該塊設置的時間戳),⽹絡上的其他節點決定接受該塊。

以下功能只接受特定⽇期之後的呼叫。由於礦⼯可以影響他們區塊的時間戳(在一定程度上),他們可以嘗試挖掘⼀個包含他們交易的區塊,並在未來設定⼀個區塊時間戳。如果⾜夠接近,它將在網絡上被接受,交易將在任何其他玩家試圖贏得比賽之前給予礦工以太:

從一道CTF題折射出的智能合約安全問題

誤操作異常:

在以太坊中,一個合約調用另一個合約可以通過send指令或直接調用另一個合約的函數。然而在調用過程中可能會出現錯誤,調用的合約就會回退到之前的狀態。那麼這個異常就可能無法很好地被調用者獲知,這取決於調用方式。例如,通過send指令調用的合約應該通過檢查返回值來驗證合約是否被正確執行。

攻擊方法舉例:

有個名KingOfTheEtherThrone(KoET)的智能合約:用戶可以通過一定數量的以太幣成爲“以太幣國王”,支付的數額由現任國王決定。很顯然,當前國王可以通過買賣國王獲得利潤。當一個用戶聲稱爲國王后,合約就發送賠償金給現任國王,並指定這個用戶爲新的國王。然而,這個合約並沒有檢查支付賠償金的交易的結果。 這樣一旦合約在執行過程中產生了異常,現任國王就有可能同時失去王座和賠償金。

可能的攻擊方式就是敵手故意超出調用棧的大小限制。以太坊虛擬機規定調用棧的深度爲1024。敵手在攻擊之前,首先調用自身1023次,然後發送交易給KoET合約,這樣就造成了合約的調用棧超出了限制,從而出現了錯誤。合約出錯後,因爲這個合約沒有檢查合約的返回值,那麼如果合約在發送賠償金給現任國王的過程中出現了異常,那麼現任國王極有可能失去王座和賠償金。

相關文章