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