科普入門 | 不推遲就可能會死——“重入攻擊”詳解

買賣虛擬貨幣


不知道是不是之前老路奶了一口的原因,以太坊硬分叉在原定日期的前一天居然又雙叒叕被推遲了,這狼來了的故事一再重演,礦工們的小心臟都要承受不住了呀。

據官方釋出的訊息稱,這次分叉改期的原因是在已完成硬分叉的測試網路中,發現了會被駭客用來發動“重入攻擊”的程式碼漏洞。

那麼“重入攻擊”到底是如何進行的?它會對區塊鏈網路以及使用者造成什麼危害呢?當然礦友們最關注的是,現在的以太坊網路會不會受到“重入攻擊”?

//

The DAO 事件回顧

//

17 年那起導致以太坊分家的 The DAO 事件大家想必都不陌生吧,The DAO 的發生就是因為駭客對當時的以太坊網路發動了“重入攻擊(Re-entrancy)。

出於拓展性的考慮,以太坊的智慧合約程式碼是可以和其他網路上的各類合約程式碼互相相容以及呼叫的。

駭客們發現,雖然一時半會找不到以太坊自身程式碼的漏洞,但是當以太坊呼叫一些外部合約時,卻有可能出現一些邏輯上的自相矛盾或者是以太坊程式碼開發者沒想到過的情況,這些問題會導致以太坊智慧合約做出令人意想不到的操作。

//

“重入攻擊”如何產生

//

以太坊智慧合約中有兩個功能函式,depositFunds() 和 withdrawFunds()depositFunds() 功能函式被用於增加發件人餘額,而 withdrawFunds() 功能函式允許發件人指定要撤回的以太坊數字貨幣數量,這兩個程式碼一般被運用於交易發起人撤回交易的情況。

當時被攻擊的 "DAO" 合約就包含這兩個函式,函式本身是沒有問題的, 為了避免使用者鑽空子,"DAO" 智慧合約還對這兩個函式設定了撤回數量和撤回間隔的限制,類似“一週內只能有一次小於等於 1 ETH 的交易撤回”。

因為以太坊智慧合約的執行需要消耗手續費 Gas(Gas 說明看這裡),假設需要撤回交易的錢包在發起撤回請求時裡面有 1 ETH,但發起撤回請求時,使用者設定了較高額度的 Gas,那麼撤回之後錢包裡的 ETH 數量就不足 1 了,這使得 "DAO" 智慧合約判定這次撤回失敗,withdrawFunds() 函式還可以被執行。

駭客所編寫的攻擊合約就是利用這一點,在攻擊合約上反覆發起交易撤回請求,"DAO" 智慧合約也會自動將自己錢包裡的以太坊不限次數地“返還”給攻擊合約錢包,直到 "DAO" 的錢包餘額小於 1 ETH 為止。

//

硬分叉帶來的重入危機

//

The DAO 事件直接導致的“分家”,使得以太坊元氣大傷,開發團隊自然是不會想再來一次“The DAO”的。

針對重入攻擊The DAO 事件後以太坊網路在智慧合約中加入了 transfer() 功能函式,該函式可以透過限制以太坊手續費 gas 來阻止智慧合約。

此前,以太坊已經在測試網路 Rinkeby 成功實現了君士坦丁堡硬分叉,但隨後智慧合約審計公司 ChainSecurity 就在測試網路的程式碼中發現了漏洞:“EIP-1283 協議為 SSTORE 操作引入了更便宜的 Gas 成本。

一些智慧合約(已經在鏈上了)可能會利用這種程式碼模式,這會使它們在君士坦丁堡升級之後容易遭受一種重入攻擊。"

//

目前的情況

//

此次的漏洞和 The DAO 事件相似,也是透過“反覆執行交易撤回命令”來從目標賬戶中轉出 ETH 來獲利的。但它的發生有一個前提,就是“君士坦丁堡硬分叉”。在當前較高的 SSTORE 操作費用下,以太坊智慧合約程式碼並沒有被重入攻擊的可能。

可能也是出於對 The DAO 事件重演的恐懼,這次 EIP 1283 協議所曝出來的漏洞,以太坊開發團隊只花了 9 個小時就解決了(但出於風險考慮還是延後了硬分叉),執行節點的使用者僅需第一時間更新官方釋出的 Geth 以及 Parity 軟體補丁即可,此舉可以說是把一次可能的“大事件”扼殺在了搖籃裡。

  文字/魔路西

  編輯/魔路西

圖片/網路

無盤挖礦奇蹟摩爾:

官網:http://minerhub.com

Telegram:https://t.me/MinerHub

QQ群:9107173

關注微博:@MinerHub

免責聲明:

  1. 本文版權歸原作者所有,僅代表作者本人觀點,不代表鏈報觀點或立場。
  2. 如發現文章、圖片等侵權行爲,侵權責任將由作者本人承擔。
  3. 鏈報僅提供相關項目信息,不構成任何投資建議

推荐阅读

;