1. 程式人生 > >區塊鏈TOP1重入漏洞之自我理解【原創】

區塊鏈TOP1重入漏洞之自我理解【原創】

bubuko ont 國內 編程語言 credit 導致 被攻擊 復合 我們

最近在研究區塊鏈方面的漏洞,智能合約top 1重入漏洞。在網上找了很多相關的文章,發現大部分都是通過代碼進行分析。話說,我們不了解平臺,只是熟悉代碼,只知其原理不知其過程,不便於我們的漏洞理解。

在此之前,我們需要先了解一個東西,The DAO2016年6月18日被攻擊前募集了$150M。攻擊者 利用合約中的漏洞發動了Reentrancy攻擊,獲得了$60M。為了追回這部分資金, 以太坊社區決定進行硬分叉,在新分支中回滾自攻擊開始後的所有交易記錄並修復合 約漏洞,但因為此舉違背了‘Code is law’精神,部分成員拒絕新分支,導致最終形 成了兩個分支。舊分支稱為以太坊經典(Ethereum Classic/ETC),新分支為現行以 太坊。攻擊者最終離開以太坊經典,帶走了數千萬美元。

以上新聞說明兩個問題:

  1. 因為此漏洞,直接導致了以太坊硬分叉。(這個硬分叉什麽意思呢?簡單理解,就是一個樹枝一分為二,你走你的,我走我的。另,你只需要了解,這個漏洞影響很大。)
  2. The DAO是一個募集資金的平臺。(我們可以理解為,某某生病了,然後需要錢,然後眾籌給你籌錢。這個很好理解)

技術細節

那麽眾籌就需要三方,付款方,公證人(平臺),收款方。我們先進行簡單了解。談完了,背景,我們再來談談漏洞,先看一段:

技術分享圖片

大多數都沒有進行註釋,畢竟是新的編程語言,國內熟悉的比較少。我進行了註釋。但是為了大家便於理解,我就重新解釋一次。

假如賬戶有10個幣,你要轉9個出去。肯定是可以的,你要轉11個,就不行。因為你沒有11個。所以此處要轉9個出去肯定是可以的。因為10>=9。最後一步就是減去你賬戶中的9個幣了。此時賬戶裏面只有1個幣了。所以,各位看官肯定會說,這裏沒毛病啊。嗯,程序好像看似沒毛病但是。看看黑客如何進行攻擊的:

技術分享圖片

攻擊者首先構造一個惡意合約MalloryMallory部署之後,攻擊者調用withdraw函數向Mallory合約捐贈一點以太幣。看似沒什麽問題。

withdraw函數中的msg.sender.call.value(amout)()執行之後,由於轉賬 操作特性 ,會在轉賬結束之後自動調用Mallory 的 fallback函數,於是再次調用 withdraw函數。因為此時credit中並未更新額度,所以依然可以正常取款,便陷入遞 歸循環,每次都提取DAO中的一部分以太幣到Mallory合約中。

技術分享圖片

在這裏,我們上面分析過了,我們是先進行轉賬再進行扣款的。那麽這樣有什麽壞處呢?也就是說,如果在轉賬處一直循環卡住了,那麽扣款就不會執行。

舉個流程例子:

正常情況下

技術分享圖片

不正常情況下

技術分享圖片

重復此操作,理論上能夠將The DAO的以太幣全部提取到Mallory。

註:由於剛接觸區塊鏈這一塊,以上代碼註釋如果有錯誤歡迎指正。

區塊鏈TOP1重入漏洞之自我理解【原創】