圖片版權所屬:站長之家
編者按:本文來自 36 氪戰略合作區塊鏈媒體「Odaily星球日報」(公眾號ID:o-daily,APP下載)
據 blog.ethereum 消息,由於以太坊改進提案(EIP 1283)被發現重大安全漏洞,原定於在第 7080000 個區塊上進行的君士坦丁堡硬分叉被推遲。
Week in Ethereum 創始人 Evan Van Ness 表示,新的硬分叉日期將在周五的下一次核心開發者電話會議期間確定。以太坊核心開發者 Afri Schoedon 則在 Twitter 上表示,硬分叉將於下周一舉行。
漏洞發生了怎麼辦?
關於 EIP 1283 漏洞處理,以太坊官方也通過博客表示,推遲君士坦丁堡硬分叉,即不在第 7080000 個區塊上分叉,並且發布了相關處理辦法:
對於已經升級同步的節點、礦工、交易所,需要在 Geth 或 Parity 新版本發布後及時更新版本,新版本預計在博客發布的 3~4 個小時內發布。具體的方案如下所示:
Geth 版本:升級到 Geth 1.8.21;降級至 Geth 1.8.19;如果想保持在 Geth 1.8.20,請使用開關 '-override.constantinople = 9999999' 無限期推遲君士坦丁堡分叉;
Parity 版本:推薦升級到 Parity Ethereum 2.2.7-stable 或 Parity Ethereum 2.3.0-beta;不推薦降級至 Parity Ethereum 2.2.4-beta 。
對於未同步升級的節點、錢包以及代幣持有者(網絡用戶),現在不需要進行任何操作。
對於合約所有者,現在可以檢查一下合約是否還存在其他潛在的漏洞,但請不用擔心,因為有著漏洞的 EIP 1283 不會被啟用。
漏洞是什麼?
北京時間今天零點,智能合約審計公司 ChainSecurity 發布了一份報告,報告指出以太坊君士坦丁堡代碼(EIP 1283)存在漏洞,該漏洞可能導致「重入攻擊」——攻擊相關合約、修改用戶餘額或其他關鍵變量。
為什麼會產生重入攻擊? ChainSecurity 認為,在分叉前一個存儲至少需要 5000 gas,遠遠超過使用 「transfer」或「send」調用合約時發送的 2300 gas ;而在分叉後,一個存儲只需要 200 gas,攻擊者可以通過調用一些公共函數,更改所需變量。比如攻擊者可以調用攻擊者合約,只需要花費 2300 gas 就可以成功地更改弱勢合約的變量,包括帳戶餘額等。
當然,攻擊要想成功需要一些條件:
必須有一個函數a,在該函數中,「transfer / send」後面緊跟著一個狀態更改操作,這有時是不明顯的;
攻擊者必須有一個能夠訪問函數 A 改變狀態的函數 B, B 狀態改變會與函數 A 發生衝突;
函數 B 需要在小於 1600 gas 的情況下執行( 2300 氣費-700 氣話費)。
ChainSecurity 提醒大家,可以從檢查以下幾個方面避免合約被攻擊:
檢查 transfer 事件後是否有任何操作。
檢查這些操作是否改變了存儲狀態,最常見的是通過分配一些存儲變量,檢查哪些變量已被修改,做一個列表。
檢查合約中,非管理員可以訪問的任何其他方法是否使用這些變量之一;
檢查這些方法本身是否自行改變存儲狀態;
檢查是否低於 2300 gas,同時記住 SSTORE 操作可能只有200 gas。
漏洞重演何時休?
這次 EIP 1283 出現的重入攻擊,在以太坊的發展史上曾出現多次,屬於頑疾。
「其實這個攻擊方式,在以太坊上早就是赫赫有名了,我不相信以太坊社區沒有考慮到這個問題。」以太坊研究者胡靖宇告訴 Odaily 星球日報。
重入攻擊影響最大是 The DAO 合約漏洞事件。當時黑客利用 The DAO 合約漏洞,轉移了價值 4 千多萬美元以太幣(ETH)。為了奪回資金,以太坊社區決定進行軟分叉與硬分叉,結果社區內部產生分歧,一部分選擇留在原鏈(現在的 ETC),一部分選擇了進入新的分叉鏈(ETH)。
根據胡靖宇所說,以太坊智能合約為了方便一些邏輯操作,留下了「 transfer() 和 send() 」這樣一種調用方式,但也給開發者留下了安全隱患。「但是只要開發者知道有這樣一個安全隱患,在寫代碼的時候多判斷一下邏輯就可以保證安全性了。」
至於下周一會不會進行硬分叉升級,胡靖宇表示硬分叉升級具體的時間點應該是未定的,因為官方目前還沒有評估到具體的風險以及制定解決方案。