出現漏洞,君士坦丁堡硬分叉被推遲
秦晓峰
@QinXiaofeng888
2019-01-16 04:03
本文约1691字,阅读全文需要约7分钟
至於下週一會不會進行硬分叉升級,胡靖宇表示硬分叉升級具體的時間點應該是未定的,因為官方還沒有評估到具體的風險以及製定解決方案。

blog.ethereum

消息,由於以太坊改進提案(EIP 1283)被發現重大安全漏洞,原定於在第7080000 個區塊上進行的君士坦丁堡硬分叉被推遲。Evan Van Ness二級標題Afri Schoedon二級標題

二級標題

漏洞發生了怎麼辦?

關於EIP 1283 漏洞處理,以太坊官方也通過博客表示,推遲君士坦丁堡硬分叉,即不在第7080000 個區塊上分叉,並且發布了相關處理辦法:

  • 對於已經升級同步的節點、礦工、交易所,需要在Geth 或Parity 新版本發布後及時更新版本,新版本預計在博客發布的3~4 個小時內發布。具體的方案如下所示:

  • Geth 版本:升級到Geth 1.8.21;降級至Geth 1.8.19;如果想保持在Geth 1.8.20,請使用開關'-override.constantinople = 9999999' 無限期推遲君士坦丁堡分叉;

二級標題

二級標題

二級標題

漏洞是什麼?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 事件後是否有任何操作。

  • 檢查這些操作是否改變了存儲狀態,最常見的是通過分配一些存儲變量,檢查哪些變量已被修改,做一個列表。

  • 二級標題

  • 二級標題

二級標題

漏洞重演何時休?

這次EIP 1283 出現的重入攻擊,在以太坊的發展史上曾出現多次,屬於頑疾。

“其實這個攻擊方式,在以太坊上早就是赫赫有名了,我不相信以太坊社區沒有考慮到這個問題。”以太坊研究者胡靖宇告訴Odaily 。

重入攻擊影響最大是The DAO 合約漏洞事件。當時黑客利用The DAO 合約漏洞,轉移了價值4 千多萬美元以太幣(ETH)。為了奪回資金,以太坊社區決定進行軟分叉與硬分叉,結果社區內部產生分歧,一部分選擇留在原鏈(現在的ETC),一部分選擇了進入新的分叉鏈(ETH)。

根據胡靖宇所說,以太坊智能合約為了方便一些邏輯操作,留下了“ transfer() 和send() ”這樣一種調用方式,但也給開發者留下了安全隱患。 “但是只要開發者知道有這樣一個安全隱患,在寫代碼的時候多判斷一下邏輯就可以保證安全性了。”

秦晓峰
@QinXiaofeng888
作者文库