區塊鏈漏洞:如何避免編寫易受攻擊的程式碼和易受攻擊的ERC20 代幣


本文重點介紹新發現的ERC20 batchOverflow 漏洞、開發過程中所犯的導致易受影響的ERC20 代幣開發的錯誤,以及為防止再次犯同樣錯誤而應採取的步驟。

ERC20代幣漏洞

隨後被確定為batchOverflow漏洞的事件發生在2018年4月。漏洞利用了BeautyChain(BEC)和MeshBox(MESH)等ERC代幣的易受攻擊的ERC20合約,憑空創建了不合理數量的代幣。

在發現batchOverflow問題後不久,保全公司PeckShield發現了各種以太幣中的許多漏洞。受影響的代幣包括:

極光道(AURA) 美麗鏈(BEC) UG代幣(UGT) 智能數十億(SMART) 第一幣(FRST) GG代幣(GG) 人民幣代幣(CNY) CNYTokenPlus (CNYt+) 無用以太坊代幣(UET) 六角形(HXG) 教育(教育) 智慧網格(SMT) MTC 斯卡

這些缺陷是在使用batchOverflow攻擊後不久就發現的。研究人員調查了攻擊者留下的可疑交易以找到它們。

可疑交易的主要指標是異常高的傳輸率,有時會超過代幣的總供應量。一些重要交易所已全面停止接受ERC20 代幣的充值和提現,以阻止投機行為。這些對話是:

OKEx 波洛尼克斯改變利火幣專業版ERC20代幣的兩個主要問題

研究人員在搜尋ERC20 代幣中的漏洞時發現了多種攻擊,並為每種攻擊指定了不同的名稱。但實際上,所有這些代幣都只有兩個主要問題:

溢出漏洞不受保護的功能讓我們仔細看看這些問題。

溢出漏洞

利用整數溢位或下溢(ERC20 代幣標準中的一個缺陷)是溢出漏洞的基礎。當數學運算的結果超出變數可以表示的範圍時,就會出現此問題。

在以太坊智能合約中,當從零減去任何值時,結果是一個非常大的值。兩個巨大值相加的結果將接近零並且會迴繞。

在本例中,第206 行具有易受影響的程式碼。未正確檢查該行的新增是否有溢出。 _value 和_feeSmart 設定過大的值會導致它們的總和溢出,導致值低於帳戶餘額並通過條件,從而將大得離譜的值添加到所設定帳戶的餘額中。

未受保護的功能漏洞

未受保護的功能是ERC20 代幣安全問題的第二類。只有當開發人員忽略包含限制函數存取的必要修飾符時,才會出現此類ERC20 漏洞。這意味著任何用戶都可以自由調用某些基本的核心功能。

例如,創建以太坊智能合約時的標準程序是限制單一帳戶對特定功能的存取。通常,該帳戶被稱為所有者。

AURA 代幣正是經歷了這一點。設定所有者的函數不受OwnerOnly 修改的限制,即使合約內的函數受到限制。因此,任何人都可以使用setOwner 函數透過呼叫合約來選擇隨機所有者。幸運的是,此時所有者帳戶除了普通用戶之外什麼也做不了,因此這個問題不會被安全地修復。

如何避免編寫易受攻擊的程式碼

如你所見,這些ERC20 功能漏洞通常是無意的程式碼錯誤造成的。此外,儘管這些錯誤已被很好地識別並且易於預防,但以太坊網路上仍然存在易受影響的合約。

有什麼辦法可以避免加到一堆嗎?在使用create ERC20 token 時,你能否避免寫出易受攻擊的程式碼?當然可以,而且當然是可行的。我們提供以下建議來幫助你確保高度的程式碼安全:

1. 為了防止任何東西被暴露,請清楚地表明函數和狀態變數的可見性。

2. 使用OpenZeppelin 的SafeMath 等函式庫來阻止上溢和下溢。

3. 整數除以四捨五入時要小心。由於不斷向下舍入,5/2 等於2,而不是2.5。

4. 為了減少Gas 使用量並防止拒絕服務攻擊,允許用戶提取代幣(在獎金、遊戲、空投等中)而不是推送代幣。

利用最新的Solidity 構造: * 適當使用require 和assert,以便自動分析器可以正式驗證你的程式碼。

使用keccak256 代替sha3,並使用selfdestruct 代替自殺。

使用公共測試網Ropsten 建立測試合約。建立錯誤賞金計劃並允許社區測試你的合約。

獲得對你的合約安全性的官方審核。

透過遵循這些簡單的步驟,你可以提高程式碼的安全性並避免編寫易受影響的程式碼。

結論

最近的batchOverflow 駭客攻擊演示了單一編碼錯誤如何可能導致嚴重的安全性問題。儘管ERC-20 代幣容易發生溢出,但開發人員只需仔細檢查其程式碼並採取額外的預防措施即可避免溢出和下溢。

聲明:以上內容採集自VOCAL,作品版權歸原創作者所有內容均以傳遞訊息為目的,不代表本站同意其觀點,不作為任何投資指導。幣圈有風險,投資需謹慎

Total
0
Shares
Related Posts