背景概述
看了一個關于學習solidity的站,里面講了關于solidity智能合約的很多漏洞,考慮到現在針對智能合約的攻擊事件頻頻發生,不法分子盜取的加密資產越來越多,我就想寫一些與智能合約安全審計相關的文章給想了解智能合約安全審計的入門者閱讀,讓一些對智能合約安全審計感興趣的初學者可以學到如何識別一些常見的漏洞和如何利用這些漏洞去做什么事情。這次我們就一起先看一個很經典的漏洞——?重入漏洞。
前置知識
重入漏洞相信大家都有所耳聞了,那么什么是重入漏洞呢?
以太坊智能合約的特點之一是合約之間可以進行相互間的外部調用。同時,以太坊的轉賬不僅僅局限于外部賬戶,合約賬戶同樣可以擁有以太并進行轉賬等操作,且合約在接收以太的時候會觸發fallback函數執行相應的邏輯,這是一種隱藏的外部調用。
小蜜蜂Bee智能合約已通過知道創宇安全審計:據官網消息,知道創宇近日已完成小蜜蜂Bee智能合約項目的安全審計服務。
據介紹,小蜜蜂Bee是基于波場底層打造的第二代DeFi協議。旨在改善上一代DeFi協議在交易速度、成本等方面,面臨的一些固有挑戰,突破較大規模 DeFi 應用的瓶頸。
小蜜蜂Bee將于2020年10月15日晚20:00開啟創世挖礦,目前小蜜蜂Bee已上線bitkeep錢包defi專欄推薦位,并已在Justswap開啟流通。小蜜蜂Bee無ICO、零預挖且零私募,社區高度自治。
?合約地址:TNUXHrnHFJ89cgT8kCLmxYCVj3PeEqyJ4C[2020/10/13]
我們先給重入漏洞下個定義:可以認為合約中所有的外部調用都是不安全的,都有可能存在重入漏洞。例如:如果外部調用的目標是一個攻擊者可以控制的惡意的合約,那么當被攻擊的合約在調用惡意合約的時候攻擊者可以執行惡意的邏輯然后再重新進入到被攻擊合約的內部,通過這樣的方式來發起一筆非預期的外部調用,從而影響被攻擊合約正常的執行邏輯。
Adam Back:DeFi使抵押貸款和執行智能合約變得更容易:7月24日,Blockstream首席執行官Adam Back與推特網友討論DeFi相關話題,針對網友所說,為什么DeFi是幫助資本所有者與資本使用者直接聯系的重要一步?Adam Back表示,DeFi使得抵押貸款和直接執行智能合約,或者貸方對證券進行保管,變得更加容易。否則,在難以取得留置權或無擔保的情況下借貸是混亂的,風險和回收、壞賬轉售已經演變成應對現實世界的權衡。[2020/7/24]
漏洞示例
好了,看完上面的前置知識我相信大家對重入漏洞都有了一個大致的了解,那么在真實的環境中開發者寫出什么樣的代碼會出現重入漏洞呢,下面我們來看一個比較典型的有重入漏洞的代碼:
安盛推出適用于航班延誤的智能合約保險產品:全球第二大金融公司、保險巨頭安盛(AXA)推出了一項以太坊公鏈上的智能合約保險產品。這款名為Fizzy的產品與之前稱為FlightDelay的Etherisc類似,個人支付保險費,如果航班延誤超過兩個小時,則自動獲得賠償。[2018/6/19]
漏洞分析
看到這里大家可能會有疑惑了,上面的代碼就是個普通的充提幣的合約,憑什么說他有重入攻擊呢?我們來看這個合約的withdraw函數,這個函數中的轉賬操作有一個外部調用,所以我們就可以認為這個合約是可能有重入漏洞的,但是具體能否產生危害還需要更深入的分析:
1.所有的外部調用都是不安全的且合約在接收以太的時候會觸發fallback函數執行相應的邏輯,這是一種隱藏的外部調用,這種隱藏的外部調用是否會造成危害呢?
金色財經現場報道 STBChain CEO劉海峰:智能合約對于區塊鏈公司是一項非常大的挑戰:金色財經現場報道,在4月3日舉辦的2018年世界區塊鏈峰會現場,STBChain CEO劉海峰表示:“區塊鏈里有一個很重要的概念,就是智能合約。目前來看,在做軟件開發的時候很多狀況下都無法把邏輯制定的特別完美,可能會存在一定的邏輯問題與bug,然而智能合約再發出之后便無法修改,仿若潑出去的水,無法再收回。而去中心化指的是移除了一個中心化的服務器,在智能合約的影響下可以讓數據可以在各節點進行存儲。從而確保了信息的安全性與不可篡改性,所以可以說智能合約非常重要,但由于其特性是后續無法更改,所以智能合約對于各區塊鏈公司來講,都是一個很大的挑戰。”[2018/4/3]
2.我們可以看到在withdraw函數中是先執行外部調用進行轉賬后才將賬戶余額清零的,那我們可不可以在轉賬外部調用的時候構造一個惡意的邏輯合約在合約執行balance=0之前一直循環調用withdraw函數一直提幣從而將合約賬戶清空呢?
下面我們看看攻擊者編寫的攻擊合約中的攻擊手法是否與我們的漏洞分析相同:
攻擊合約
我們看到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.加入防重入鎖。
下面是一個防重入鎖的代碼示例:
作為審計人員
作為審計人員我們需要關注的是重入漏洞的特征:所有涉及到外部合約調用的代碼位置都是不安全的。這樣在審計過程中需要重點關注外部調用,然后推演外部調用可能產生的危害,這樣就能判斷這個地方是否會因為重入點而產生危害。
Tags:ACKETHERETHHERBACKSTABDOGEethereumhdetha幣能買不togetherbnb游戲攻略
金色財經報道,彭博資訊上周發布了2022年加密貨幣前景報告。彭博資訊的分析師MikeMcGlone分享了他對加密貨幣市場未來的展望.
1900/1/1 0:00:00原文標題:《賺錢&送錢:坑貨ID0形式總結》相信大家對于ID0這個名字不再陌生,首發最低籌碼上市后立刻5–10倍甚至百倍收益的神話,這個項目也造富了不少玩家.
1900/1/1 0:00:00元宇宙是一個虛擬世界,在這個世界中,人們可以通過整合社交媒體網站、電腦游戲、虛擬現實、增強現實和加密資產進行數字連接.
1900/1/1 0:00:00太長不讀: 1、新公鏈的擴展遵循自上而下的路徑:從上層應用到下層技術,從生態應用的繁榮到公鏈使用的爆發.
1900/1/1 0:00:00元宇宙是數字時代的理想國嗎?在上一期的《元宇宙是數字時代的理想國嗎?》中,我們提出了一個重要的觀點:元宇宙是現實世界的投影。具言之,我們根據現實世界來創造新世界.
1900/1/1 0:00:00近日,世界知名啤酒品牌百威用了30個ETH購買了一個名為beer.ethENS域名。另外,擁有22.5萬+名粉絲的百威官方還將推特頭像換成了在Opensea上用8ETH的價格購入的NFT作品,并.
1900/1/1 0:00:00