值得關注的其他問題
盡管有一個安全問題排名很不錯,但它往往一些有趣的細節,因為某些細節與排名列表并不完全一致。在深入挖掘10大問題之前,必要闡述一下原始研究中一些值得關注的亮點問題:
在2018年,最主要的兩個問題是外部合約拒絕服務和重入。但是現在這些問題有所緩解。可以從我們的研究博客中了解更多有關Reentrancy的信息:從安全角度出發審視智能合約。
譯者注:實際上由于DeFi應用之間的組合應用,又導致了多起嚴重的重入攻擊事件。
現在Solidityv0.6.x發布了,它帶來了許多重大變化,然而掃描的智能合約中有50%甚至還沒有準備好使用Solidityv0.5.0編譯器。另外30%智能合約使用了過時的語法,并且83%的合約在指定編譯器版本存在規范問題。
深圳:鼓勵智能合約技術在數字人民幣領域的融合應用:金色財經報道,深圳市地方金融監督管理局4月7日印發《深圳市扶持金融科技發展若干措施》,《措施》指出將推動中國人民銀行數字貨幣研究所貿易金融區塊鏈平臺和境外貿易金融平臺的聯動合作,鼓勵優質外貿企業積極參與,豐富應用場景,探索人民幣國際化和貿易便利化的落地場景。支持供應鏈金融企業運用隱私計算、區塊鏈等前沿技術探索數據融合共享應用。支持科研院所和金融科技機構持續推動區塊鏈、隱私計算等關鍵基礎技術的研發與金融應用,提升金融產品、金融服務、金融監管的基礎技術支撐能力。
深圳還將積極對接中國人民銀行,深化數字人民幣的研發應用與國際合作。吸引數字人民幣相關的重大基礎設施落地深圳,培育數字人民幣產業生態。積極鼓勵智能合約技術在數字人民幣領域的融合應用,率先建設基于數字人民幣的智能合約公共平臺,服務數字人民幣的全場景應用,打造新型商貿流通形態。[2022/4/7 14:11:08]
譯者注:Solidity0.6在語義上更明確了,有助于編譯器及時發現問題,讓代碼更安全,
Solend在智能合約漏洞賞金平臺Immunefi推出漏洞賞金計劃:Solana生態借貸協議Solend在智能合約漏洞賞金平臺Immunefi推出漏洞賞金計劃,賞金總上限為50萬美元。漏洞按等級分別獎勵高達5萬美元、2萬美元和5千美元。漏洞范圍為:因凍結或盜竊而損失(本金)用戶資金;治理資金丟失;盜竊無人申領的收益;凍結無人申領的收益;資金暫時凍結至少1小時;無法調用智能合約。[2021/8/15 22:15:54]
盡管可見性問題沒有出現在2018年的前10位,也沒有出現今年的前10,但可見性問題增加了48%,值得關注。
下表比較了2018年和2020年十大常見問題列表之間的變化。這些問題按嚴重程度和流行程度排序:
1.未檢查的外部調用
在2018年Solidity十大安全問題榜單上未檢查的外部調用是第三個常見問題。由于現在前兩個解決了,因此未檢查的外部調用成為了2020年更新列表中最常見的問題。
獨家 | 新增翻版Fomo3D智能合約“剪刀石頭布”Jan Ken Pon:第三方大數據評級機構RatingToken最新數據顯示,2018年8月8日全球共新增757個合約地址,其中177個為代幣型智能合約。據RatingToken團隊發布的“新增代幣型智能合約風險榜”,Jan Ken Pon(JKP)、Opporty(OPP)和bank(BANK)風險最高,檢測得分分別為1.97、2.80和2.80,其中Jan Ken Pon在日語中意為“剪刀石頭布”,是類Fomo3D游戲,存在14個安全風險。其他登上該風險榜TOP10的還包括Debt Coins(DEBT)、APAY(APAY)、RUBBER(REC)、RIGACOIN(RIGA)、dodgers(DOD)、MudToken(MUD)和SuperstartupX(SSX)。如需查看更多智能合約檢測結果,請查看原文鏈接。[2018/8/9]
Solidity底層調用方法,(例如
address.call()
Ripple旗下智能合約結算系統Codius或將復活 :據Bitdays消息,Ripple旗下的Codius項目已表現出可能將被復活的跡象。Ripple在2015年中止了智能合約結算系統Codius的開發,原因是當時的虛擬貨幣市場尚處于早期階段,智能合約結算沒有實用基礎。不過如今,Codius的相關網站已重新開放,同時似乎在暗示該項目已進入了測試階段。[2018/5/9]
)不會拋出異常。而是在遇到錯誤,返回
false
。
而如果使用合約調用
ExternalContract.doSomething()
時,如果
doSomething()
拋出異常,則異常會繼續「冒泡」傳播。
應該通過檢查返回值來顯式處理不成功的情況,以下使用
addr.send()
GuildOne的Royalty Ledger通過R3的Corda區塊鏈平臺 首次執行一份版稅智能合約:GuildOne Inc.宣布,公司在R3的Corda區塊鏈平臺上使用該公司的新版稅收總賬應用程序,首次執行一份版稅智能合約。該聲明于2月14日,在阿爾伯塔省卡爾加里召開的石油和天然氣會議上宣布了這一消息。[2018/2/21]
進行以太幣轉賬是一個很好的例子,這對于其他外部調用也有效。
if(!addr.send(1)){revert(。
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引入了一些重大更改,并且預計在以后的版本中還會有更多更改。
2020年1月3日,伊朗革命衛隊下屬“圣城旅”武裝指揮官卡西姆·蘇萊曼尼在伊拉克巴格達機場附近,遇美軍襲擊身亡.
1900/1/1 0:00:00如果有人問DeFi在未來十年會發展成什么樣子,我們很可能會說“就是金融啊”這樣的答案。我認為,這個答案忽視了兩個層面。首先是時間。科技發展需要很長的時間,比早期采用者所預期的時間要長得多.
1900/1/1 0:00:00美國證券交易委員會主席杰克克萊頓聲稱,比特幣交易所缺乏足夠的透明度和監管市場,以便看到經批準的比特幣交易所交易基金.
1900/1/1 0:00:00兩間密碼貨幣公司正聯手讓華爾街的機構們更容易處理他們的數字資產。據Coindesk于1月16日報導,密碼貨幣托管公司BitGo與機構場外交易公司GenesisGlobalTrading合作,讓傳.
1900/1/1 0:00:00trezorWallet開發團隊宣布該設備的beta版固件現在為以太坊,以太坊Classic和ERC20令牌提供本機支持.
1900/1/1 0:00:00Golem在2018年11月20日的交易中創造了0.07711美元的新低。由于硬幣交易價格約為0.087美元,價格行動現已跌破0.10美元.
1900/1/1 0:00:00