科普入門 不推遲就可能會死 「重入攻擊」詳解

2021-09-10 09:31:16 字數 2439 閱讀 4576

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

據官方發布的訊息稱,這次分叉改期的原因是在已完成硬分叉的測試網路中,發現了會被黑客用來發動「重入攻擊」的**漏洞。

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

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軟體補丁即可,此舉可以說是把一次可能的「大事件」扼殺在了搖籃裡。

文字/魔路西

/網路無盤挖礦奇蹟摩爾:

官網:

telegram:

qq群:9107173

關注微博:@minerhub

字串編碼入門科普

對於單純做前端或者後端的同學來說,一般很難接觸到編碼問題,因為在同乙個平台上,一般都是使用同一種編碼方式,自然問題不大。但對於寫爬蟲的同學來說,編碼很可能是遇到的第乙個坑。這是因為字串無法直接通過網路被傳輸 也不能直接被儲存 需要先轉換成二進位制格式,再被還原。因此凡是涉及到通過網路傳輸字元的地方,...