值得關注的其他問題
盡管有一個安全問題排名很不錯,但它往往一些有趣的細節,因為某些細節與排名列表并不完全一致。在深入挖掘10大問題之前,必要闡述一下原始研究中一些值得關注的亮點問題:
在2018年,最主要的兩個問題是外部合約拒絕服務和重入。但是現在這些問題有所緩解。可以從我們的研究博客中了解更多有關Reentrancy的信息:從安全角度出發審視智能合約。
譯者注:實際上由于DeFi應用之間的組合應用,又導致了多起嚴重的重入攻擊事件。
現在Solidityv0.6.x發布了,它帶來了許多重大變化,然而掃描的智能合約中有50%甚至還沒有準備好使用Solidityv0.5.0編譯器。另外30%智能合約使用了過時的語法,并且83%的合約在指定編譯器版本存在規范問題。
智能合約中USDC供應量百分比已上升至42.08%:金色財經報道,Glassnode 3 月 27 日發布的最新報告強調,智能合約中 USDC 供應量的百分比有望飆升。數據表明該百分比已上升至 42.08%,創六個月高點。USDT 在智能合約中的供應量占比為 14.0%,今年最高占比僅為 14.7%。這表明 USDC 被更廣泛地用于與智能合約相關的交易。[2023/3/28 13:30:37]
譯者注:Solidity0.6在語義上更明確了,有助于編譯器及時發現問題,讓代碼更安全,
盡管可見性問題沒有出現在2018年的前10位,也沒有出現今年的前10,但可見性問題增加了48%,值得關注。
下表比較了2018年和2020年十大常見問題列表之間的變化。這些問題按嚴重程度和流行程度排序:
V神:以太坊EIP-2929提案或將打破部分已有智能合約:為了減小以太坊飆升的交易費,以太坊創始人Vitalik Buterin?于2日發布了以太坊改進提案EIP-2929,他建議將一些合約收費提高三倍,受影響的合約包括更新以太坊狀態的合約,以及一些應用程序。但是這個重新定價的提議可能會打破一些已經在以太坊上運行的智能合約,批準這一提議也需要以太坊社區的一致同意,這一過程可能需要數周或數月的時間。(Coindesk)[2020/9/4]
1.未檢查的外部調用
在2018年Solidity十大安全問題榜單上未檢查的外部調用是第三個常見問題。由于現在前兩個解決了,因此未檢查的外部調用成為了2020年更新列表中最常見的問題。
Solidity底層調用方法,(例如
address.call()
)不會拋出異常。而是在遇到錯誤,返回
false
。
動態 | bZx使用管理員密鑰取消智能合約時間鎖功能:bZx 宣布已使用管理員密鑰移除了智能合約中的時間鎖,以應對最近頻繁發生的黑客套利事件。bZx 稱,一旦平臺通過測試,將會恢復時間鎖功能。據此前報道, bZx 最近頻繁遭受兩次黑客套利行為,兩次攻擊的主要是因為 Uniswap 的價格的劇烈變化最終導致資產的損失,這本該是正常的市場行為,但是通過惡意操縱市場,攻擊者可通過多種方式壓低價格,使項目方造成損失。[2020/2/19]
而如果使用合約調用
ExternalContract.doSomething()
時,如果
doSomething()
拋出異常,則異常會繼續「冒泡」傳播。
應該通過檢查返回值來顯式處理不成功的情況,以下使用
addr.send()
進行以太幣轉賬是一個很好的例子,這對于其他外部調用也有效。
聲音 | Coin Metrics數據工程師:以太坊伊斯坦布爾升級后,智能合約調用Gas供不應求:Coin Metrics數據工程師Antoine Le Calvez在一系列推文中指出了以太坊伊斯坦布爾升級帶來的“負面后果”:“雖然技術上是成功的,但最近的以太坊伊斯坦布爾升級并非沒有負面影響。一些EVM操作被重新定價,成本更高,這影響了一些智能合約活動。” 在最新的網絡升級中,EIP主要集中在降低成本、為智能合約引入新功能等方面。然而,據Calvez透露,自從升級以來,智能合約的Gas消耗量激增。“一個調用被認為是一個契約函數的本地調用,它不會在區塊鏈上廣播或發布任何內容。”Calvez分享了一份圖表,并說明道:“在全球范圍內,智能合約調用Gas的供不應求情況在升級之后變得更加頻繁。失敗率是原來的四倍多。”此外,Calvez指出,像Gemini這樣的大型交易所也受到了同樣的影響。以太坊開發者Tim Beiko也證實了Calvez的發現。[2019/12/10]
if(!addr.send(1)){revert(。
動態 | 瑞士安全公司Kudelski Security與智能合約審計公司Hosho達成合作:據Cointelegraph消息,3月19日,瑞士網絡安全解決方案提供商Kudelski Security宣布與智能合約審計公司Hosho建立戰略合作伙伴關系,以為區塊鏈生態系統提供更高的安全性。[2019/3/20]
2.高成本循環
高成本循環從Solidity安全榜單的第四名上升至第二名。受該問題影響的智能合約數量增長了近30%。
大家都知道,以太坊上的運算是需要付費的。因此,減少完成操作所需的計算,不僅僅是優化問題,還涉及到成本費用。
循環是一個昂貴的操作,這里有一個很好的例子:數組中包含的元素越多,就需要更多迭代才能完成循環。最終,無限循環會耗盡所有可用GAS。
for(uint256i=0;i<elements.length;i++){//dosomething}
如果攻擊者能夠影響元素數組的長度,則上述代碼將導致拒絕服務(執行無法跳出循環)。而在掃描的智能合約中發現有8%的合約存在數組長度操縱問題。
3.權力過大的所有者
這是Soldiity十大安全問題新出現的問題,該問題影響了約16%的合約,某些合約與其所有者緊密相關,某些函數只能由所有者地址調用,如下例所示:
只有合約所有者能夠調用
doSomething()和doSomethingElse()
函數:前者使用onlyOwner修飾器,而后者則顯式執行該修飾器。這帶來了嚴重的風險:如果所有者的私鑰遭到泄露,則攻擊者可以控制該合約。
4.算術精度問題
由于使用256位虛擬機,Solidity的數據類型有些復雜。Solidity不提供浮點運算,并且少于32個字節的數據類型將被打包到同一個32字節的槽位中。考慮到這一點,你應該預見以下程序精度問題:
functioncalculateBonus(uintamount)returns(uint){returnamount/DELIMITER*BONUS;}
如上例所示,在乘法之前執行的除法,可能會有巨大的舍入誤差。
5.依賴tx.origin
6.溢出
Solidity的256位虛擬機存在上溢出和下溢出問題,這里有具體的分析。在
for
循環條件中使用
uint
數據類型時,開發人員要格外小心,因為它可能導致無限循環:
7.不安全的類型推導
該問題在Solidity十大安全問題排行榜中上升了兩位,現在影響到的智能合約比之前多了17%以上。
8.不正確的轉賬
此問題在Solidity十大安全問題榜單中從第六位下降到第八位,目前影響不到1%的智能合約。
9.循環內轉帳
當在循環體中進行以太幣轉賬時,如果其中一個轉賬失敗,那么整個交易將被回滾。
for(uinti=0;i<users.lenghth;i++){users.transfer(amount);}
在這個例子中,攻擊者可能利用此行為來進行拒絕服務攻擊,從而阻止其他用戶接收以太幣。
10.時間戳依賴
如果你的應用需要隨機性,可以參考RANDAO合約,該合約基于任何人都可以參與的去中心化自治組織,是所有參與者共同生成的隨機數。
總結
比較2018年和2020年十大常見問題時,我們可以觀察到開發最佳實踐的一些進展,尤其是那些影響安全性的實踐。看到2018年排名前2位的問題:外部合約拒絕服務和重入,已經不再榜單了,這是一個積極的信號,但仍然需要采取措施來避免這類常見錯誤。
請記住,智能合約在設計上是不可變的,這意味著一旦創建,就無法修補源代碼。這對安全性構成了巨大挑戰,開發人員應利用可用的安全測試工具來確保在部署之前對源代碼進行了充分的測試和審核。
Solidity是一種非常新且仍在成熟的編程語言,Solidityv0.6.0引入了一些重大更改,并且預計在以后的版本中還會有更多更改。
據Ti數據顯示,BTC24h交易額為$227億,活躍地址數較前日上升12.08%,轉賬數較前日上升6.07%.
1900/1/1 0:00:00BNB信息突破關鍵支撐區域及其長期上升通道的底部,表明下跌趨勢正在進行中。價格可能會從這里開始關注下一個長期底線。然而,100小時均線仍然高于長期200小時均線,表明阻力最小的路徑是向上的.
1900/1/1 0:00:001.中國人民銀行正式發布《金融分布式賬本技術安全規范》。2.加密領域公司積極參與大學捐贈,以推動區塊鏈技術教育發展。3.日本CoinHive一案被告對法院有罪判決表示不服,將再次上訴.
1900/1/1 0:00:00大家都知道加密貨幣本身是一種去中心化項目,開源軟件,誰都可以參與開發,但是一旦到了統一升級維護的時候就麻煩了。“該采用誰的方案,誰去負責開發,資金怎么解決”都是社區需要面臨的難題.
1900/1/1 0:00:00長期以來人們一直認為加密貨幣的采用將推動下一次牛市的發展,就像ICO市場在2017年推動最后一次牛市一樣。現在我們看似已經觸底,或者在加密市場接近底部,新的發展導致大規模采用已經開始.
1900/1/1 0:00:00美國證券交易所專員海絲特·皮爾斯以其親比特幣的立場而聞名,在幾個不同場合發表聲明,表明她對新興資產類別即加密貨幣的信念.
1900/1/1 0:00:00