背景概述
看了一個關于學習solidity的站,里面講了關于solidity智能合約的很多漏洞,考慮到現在針對智能合約的攻擊事件頻頻發生,不法分子盜取的加密資產越來越多,我就想寫一些與智能合約安全審計相關的文章給想了解智能合約安全審計的入門者閱讀,讓一些對智能合約安全審計感興趣的初學者可以學到如何識別一些常見的漏洞和如何利用這些漏洞去做什么事情。這次我們就一起先看一個很經典的漏洞——?重入漏洞。
前置知識
重入漏洞相信大家都有所耳聞了,那么什么是重入漏洞呢?
以太坊智能合約的特點之一是合約之間可以進行相互間的外部調用。同時,以太坊的轉賬不僅僅局限于外部賬戶,合約賬戶同樣可以擁有以太并進行轉賬等操作,且合約在接收以太的時候會觸發fallback函數執行相應的邏輯,這是一種隱藏的外部調用。
Cosmos生態智能合約平臺Neutron將發布主網:5月10日消息,Cosmos 生態無需許可 CosmWasm 智能合約平臺 Neutron 將發布主網。目前主網上線的相關文件已發布在 Github。Cosmos Hub 驗證者可參加今日 23 時在 Cosmos Hub Discord 社區舉辦的發布會,了解更多細節。[2023/5/10 14:54:51]
我們先給重入漏洞下個定義:可以認為合約中所有的外部調用都是不安全的,都有可能存在重入漏洞。例如:如果外部調用的目標是一個攻擊者可以控制的惡意的合約,那么當被攻擊的合約在調用惡意合約的時候攻擊者可以執行惡意的邏輯然后再重新進入到被攻擊合約的內部,通過這樣的方式來發起一筆非預期的外部調用,從而影響被攻擊合約正常的執行邏輯。
漏洞示例
好了,看完上面的前置知識我相信大家對重入漏洞都有了一個大致的了解,那么在真實的環境中開發者寫出什么樣的代碼會出現重入漏洞呢,下面我們來看一個比較典型的有重入漏洞的代碼:
動態 | BTP將智能合約帶入亞馬遜量子分類賬數據庫:金色財經報道,Blockchain Technology Partners(BTP)今天宣布,由BTP的Sextant for DAML提供商業支持,DAML(由Digital Asset創建的開源智能合約語言)與亞馬遜量子分類賬數據庫(Amazon QLDB)的集成已全面上市。據悉,Amazon QLDB是Sextant for DAML商業支持的第三個平臺。Sextant for DAML是一個集成產品,可簡化DAML支持的分類賬的部署和管理。[2020/2/26]
漏洞分析
看到這里大家可能會有疑惑了,上面的代碼就是個普通的充提幣的合約,憑什么說他有重入攻擊呢?我們來看這個合約的withdraw函數,這個函數中的轉賬操作有一個外部調用,所以我們就可以認為這個合約是可能有重入漏洞的,但是具體能否產生危害還需要更深入的分析:
聲音 | 法中委員會秘書長林碧溪:中法兩國深入區塊鏈及人工智能合作:據人民網消息,2018年第五屆中法團隊合作創新獎即將在巴黎揭幕,法中委員會秘書長林碧溪表示,今年提交的候選項目中,區塊鏈、人工智能、數字化工具的項目明顯增加,且涉及領域非常廣泛,覆蓋核電站老化預測的解決方案、區塊鏈學歷認證及智慧城市能源管理等領域。林碧溪指出,中法兩國創新合作的多樣性,體現在創新合作的跨領域特征中。當今世界技術革新非常迅速,從區塊鏈、人工智能到數字應用,都需要中法合作團隊及時掌握并適應形勢,才能致力于開發未來的新技術。[2018/11/30]
1.所有的外部調用都是不安全的且合約在接收以太的時候會觸發fallback函數執行相應的邏輯,這是一種隱藏的外部調用,這種隱藏的外部調用是否會造成危害呢?
2.我們可以看到在withdraw函數中是先執行外部調用進行轉賬后才將賬戶余額清零的,那我們可不可以在轉賬外部調用的時候構造一個惡意的邏輯合約在合約執行balance=0之前一直循環調用withdraw函數一直提幣從而將合約賬戶清空呢?
公告 | SHOW推出ShowCoin智能合約2.0:coin2coin發布公告稱,SHOW團隊將在6月28日18:00至6月29日16:00對SHOW代碼進行升級,將升級為ShowCoin2.0 。在此期間SHOW在交易所中充值、提現等功能將會暫停,預計升級時長為22小時左右,開放充提以各交易所為準。暫停充提期間,不影響SHOW的交易功能。數字貨幣錢包中的SHOW將進行快照,新的代幣將會在2018年6月29日零點對現有區塊進行快照,完全映射(1:1映射)給用戶,代幣總量保持不變,新代幣隨即發放給持有原代幣的錢包用戶。原代幣在區塊快照時即作廢。[2018/6/30]
下面我們看看攻擊者編寫的攻擊合約中的攻擊手法是否與我們的漏洞分析相同:
攻擊合約
我們看到EtherStore合約是一個充提合約,我們可以在其中充提以太。下面我們將利用攻擊合約將EtherStore合約中用戶的余額清零的:
這里我們將引用三個角色,分別為:
用戶:Alice,Bob
攻擊者:Eve
1.部署EtherStore合約;
2.用戶1和用戶2都分別將1個以太幣充值到EtherStore合約中;
3.攻擊者Eve部署Attack合約時傳入EtherStore合約的地址;
4.攻擊者Eve調用Attack.attack函數,Attack.attack又調用EtherStore.deposit函數,充值1個以太幣到EtherStore合約中,此時EtherStore合約中共有3個以太,分別為Alice、Bob的2個以太和攻擊者Eve剛剛充值進去的1個以太。然后Attack.attack又調用EtherStore.withdraw函數將自己剛剛充值的以太取出,此時EtherStore合約中就只剩下Alice、Bob的2個以太了;
5.當Attack.attack調用EtherStore.withdraw提取了先前Eve充值的1個以太時會觸發Attack.fallback函數。這時只要EtherStore合約中的以太大于或等于1Attack.fallback就會一直調用EtherStore.withdraw函數將EtherStore合約中的以太提取到Attack合約中,直到EtherStore合約中的以太小于1。這樣攻擊者Eve會得到EtherStore合約中剩下的2個以太幣。
下面是攻擊者的函數調用流程圖:
修復建議
看了上面的攻擊手法相信大家對重入漏洞都會有一個自己的認知,但是只會攻擊可不行,我們的目的是為了防御,那么作為開發人員如何避免寫出漏洞代碼還有作為審計人員如何快速發現問題代碼呢,下面我們就以這兩個身份來分析如何防御重入漏洞和如何在代碼中快速找出重入漏洞:
作為開發人員
站在開發者的角度我們需要做的是寫好代碼,避免重入漏洞的產生。
1.寫代碼時需要遵循先判斷,后寫入變量在進行外部調用的編碼規范;
2.加入防重入鎖。
下面是一個防重入鎖的代碼示例:
作為審計人員
作為審計人員我們需要關注的是重入漏洞的特征:所有涉及到外部合約調用的代碼位置都是不安全的。這樣在審計過程中需要重點關注外部調用,然后推演外部調用可能產生的危害,這樣就能判斷這個地方是否會因為重入點而產生危害。
本周日凌晨,印度總理莫迪的個人推特賬號被黑客短暫入侵。雖然該賬戶后來很快就被找回,但在被盜期間,該賬戶已經分享了一條比特幣的推文,隨后被刪除.
1900/1/1 0:00:00「垃圾OpenSea。」昨晚的NFT社群熱鬧極了,OpenSea又被罵了。起因是美國頭部網約車企業LyftCFOBrianRoberts成為了OpenSea的新任CFO.
1900/1/1 0:00:00今年,不少大型游戲廠商都對近來很火的NFT概念公開表示過感興趣,而育碧成為了游戲圈“第一個吃螃蟹”的大型公司.
1900/1/1 0:00:002021中國元宇宙第二屆峰會現場腦洞已經開到了天涯海角,驀然回首,已經找不到鐵嶺。但在聊天的過程中碰撞出了很多好書單,給大家總結分享一下.
1900/1/1 0:00:00金色財經報道,在接受CNBC的一次最新采訪中,加密投資機構GalaxyDigital創始人邁克·諾沃格拉茨解釋了為什么比特幣現在的交易不如以太坊(ETH),他表示:“如果你看看以太坊的價格.
1900/1/1 0:00:00今年5月,Vitalik在Uniswap治理論壇上創建了一個帖子,名為“UNI應該成為一個預言機代幣”.
1900/1/1 0:00:00