去中心化應(yīng)用安全威脅Top10榜單出爐!了解智能合約中的威脅有哪些?
NCC Group 發(fā)起了一個名為 2018 年去中心化應(yīng)用安全 Top10 ( Decentralized Application Security Project)的項目。據(jù)悉,該項目會與類似于 OWASP 的方式發(fā)布去中心化應(yīng)用安全領(lǐng)域中,每年的十大安全威脅報。與 OWASP 開放合作透明的運作理念相似,該項目也是以集成合作的方式披露智能合約中存在的安全漏洞。
本文是第一版的 DASP Top10 2018 內(nèi)容,詳細(xì)描述包括遞歸調(diào)用漏洞、權(quán)限控制漏洞、算數(shù)問題、返回值問題、拒絕服務(wù)、偽隨機在內(nèi)的智能合約威脅。
一、遞歸調(diào)用漏洞
該漏洞的利用有一個知名的案例,以太坊(Ethereum)漏洞。在首次發(fā)現(xiàn)以太坊存在這個問題的時候,很多人都覺的不可思議,在高漏洞造成數(shù)千萬美元的損失之后,該漏洞可謂直接導(dǎo)致了以太坊的硬分叉之路。
這個漏洞的觸發(fā)在于外部合約對正在起草的合約進行新的調(diào)用,而這個調(diào)用發(fā)生在初次執(zhí)行完成之前。對于函數(shù)而言,這個調(diào)用意味著合同狀態(tài)發(fā)生了改變,調(diào)用的合約變得不可信,外部地址卻上使用了低層功能。
該漏洞造成的損失:350萬 ETH 損失(當(dāng)時價值 5000萬美元)
二、權(quán)限控制漏洞
權(quán)限控制問題在所有程序中都很常見,而不僅存在于智能合約之中。事實上,在OWASP中該問題也排行第5。我們通常通過公開或者外部函數(shù)獲取到合約的內(nèi)容。但如果合約的可視性沒有進行良好的安全設(shè)置,攻擊者也很容易查看并獲取合約的隱私內(nèi)容和內(nèi)部邏輯,他們能夠找到繞過限制的方式。這些漏洞通常在合約使用tx.origin 對調(diào)用者進行驗證時觸發(fā)。
漏洞造成的損失:大約15000ETH(當(dāng)時約為3000萬美元)
三、算數(shù)問題
整數(shù)的溢出并不少見,但這類問題在智能合約中尤其危險。合約中無符號整數(shù)的應(yīng)用非常普遍,大多數(shù)開發(fā)人員習(xí)慣于簡化 int 類型(有符號整數(shù))。 如果溢出問題發(fā)生,許多良性代碼路徑會成為攻擊者進行信息竊取或拒絕服務(wù)的載體。
四、未經(jīng)核查的返回值問題
這個問題有時也稱為無聲的失敗發(fā)送或者未經(jīng)核實的發(fā)送。我們應(yīng)該盡可能避免在合約中使用低層次的調(diào)用,因為返回值如果處理不當(dāng)會出現(xiàn)很多意外的行為。
Solidity 中有一部分功能是低層函數(shù),如 call() ,callcode(),delegatecall() 和send()。 這些函數(shù)在處理錯誤方面的行為與其他 Solidity 函數(shù)完全不同,他們不會回到當(dāng)前執(zhí)行的狀態(tài),而只會返回布爾值false,程序會繼續(xù)執(zhí)行。
如果這些返回值沒有得到核查,就會導(dǎo)致一些預(yù)想不到的結(jié)果。
五、拒絕服務(wù)問題
拒絕服務(wù)的情況,包括達(dá)到到達(dá)了程序的容量上限,意外拋出錯誤,意外的進程殺死,或者訪問控制違規(guī)問題。
在去中心化應(yīng)用、以太坊的世界中,拒絕服務(wù)問題往往會是致命的:盡管其他類型的應(yīng)用程序最終總是可以恢復(fù)服務(wù)的,但智能合約可能會因一次拒絕服務(wù)攻擊而永久下線。
有多種原因引發(fā)導(dǎo)致拒絕服務(wù),如在合約交易時收到了對方惡意行為的攻擊,人為地提高了執(zhí)行操作消耗的容量,濫用訪問控制來獲取智能合約的隱私組件,遭到混淆攻擊。
這一系列攻擊都包括了各種變體,并在未來的時間中攻擊方式會繼續(xù)變化。
漏洞造成的損失:估計為 514,874 ETH(當(dāng)時約3億美元)
六、偽隨機問題
該漏洞也被稱為 “沒有什么是秘密的”。
隨機問題很難在以太坊中得到糾正。盡管 Solidity 提供了些難以預(yù)測值的函數(shù)和變量,但很多情況中還是難以保持隱私性。隨機性在一定程度上是可預(yù)測的,所以惡意用戶以此實施攻擊。
漏洞造成的損失:超過400 ETH
七、競爭條件問題
由于礦工總是通過外部地址來獲得報酬,因此用戶可以指定更高的費用來讓自己的交易更快地完成。
而以太坊區(qū)塊鏈?zhǔn)枪_的,每個人都可以看到其他人尚未完成的交易內(nèi)容。
這意味著,如果某個用戶正在處理問題,惡意用戶也可以竊取該解決方案,以較高的費用發(fā)起新交易,搶占原始解決方案。
如果智能合約的開發(fā)者不太謹(jǐn)慎,這種情況會導(dǎo)致實際且毀滅性的攻擊。
八、時間處理問題
從鎖定令牌到在特定時間解鎖資金,合約都需要依賴當(dāng)前時間。 這通常通過 block.timestamp 或其 now 來在 Solidity 中實現(xiàn)。
由于這個時間依賴的是礦工,一筆交易的礦工如果在挖礦時間上會有余地,所以良好的智能合約應(yīng)該避免時間依賴。而正如在6中探討的,block.timestamp 函數(shù)中使用的隨機只是偽隨機。
九、短地址攻擊問題
短地址攻擊是以太坊虛擬機未能接受正確參數(shù)的副產(chǎn)物。攻擊者可以通過特定制作的地址利用這個弱點,針對部分編碼錯誤的客戶端進行參數(shù)填充。
盡管不同的人對于這個問題看法不同:
這是以太坊虛擬機的問題還是客戶端的問題?這能夠在智能合約中修復(fù)嗎?
雖然這個漏洞還沒有被大規(guī)模利用,但它很好地證明了客戶和以太坊區(qū)塊鏈之間的交互也可能存在問題。
其他鏈外問題也存在著:以太坊生態(tài)系統(tǒng)以來著特定的 JavaScript 前端,瀏覽器插件以及公共節(jié)點。
在Coindash ICO 欺詐事件中的黑客也使用了臭名昭著的鏈外漏洞,他們在網(wǎng)頁上修改了 ICO 公司的以太坊地址,誘騙參與者將攻擊者地址發(fā)到自己的賬戶。
十、未知
以太坊仍然處于起步階段。 用于開發(fā)智能合同的主要語言 Solidity 尚未達(dá)到穩(wěn)定版本,生態(tài)系統(tǒng)中的其他工具也仍然處于試驗階段。
每次發(fā)現(xiàn)具有破壞性的智能合約讓許多人都感到驚訝,但我們沒有理由相信其他同等性質(zhì)破壞力的漏洞不會出現(xiàn)。代碼審計和安全檢查仍然會是有效的措施,盡管有很多不成熟的地方,去中心化應(yīng)用仍然在以飛速的方式發(fā)展。