Bitcoin Core 0.7ms 的代價 - 數位貨幣

Victoria avatar
By Victoria
at 2018-09-29T12:32

Table of Contents

Bitcoin Core 0.7ms 的代價
細說 CVE-2018–17144的來龍去脈
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
圖文好讀 Medium 版 : https://tinyurl.com/y7l8gf53


前言
Bitcoin Core 在 2018/09/18 時緊急發布了新版本 0.16.3,並在其中提到:

We highly recommend users of all affected versions
immediately upgrade to 0.16.3.(Ref#1)

區塊鏈圈無不掀起一波討論,當然各式媒體也相繼報導;最聳動的莫過於這句話:

康奈爾大學教授 EminGünSirer 表示,估計只需不到 8 萬美元的成本
(12.5 枚比特幣)就能癱瘓整條比特幣區塊鏈。(Ref#2)

事情真有這麼可怕?癱瘓整條鏈?只要八萬美元?

秉持著工程師精神,追根究柢找了一些資料終於瞭解整件事情的前因後果,
就讓我娓娓道來。

=============

前因
Bitcoin Core 身為元老級的 bitcoin 用戶端
(Bitcoin 的其餘分支也師承此 source code),算得上是 open source 界經典範例。
擁有五百個以上的全球貢獻者時時都為 Bitcoin Core 上 pull request,
有的為了修正 bug,有的為了提升效能。

那現在我們就要回到 2016/11 的 pull request #9049 (Ref#3):

Benchmark results indicate this saves about
0.5–0.7ms during CheckBlock.

這個 PR 提高了 CheckBlock 的效能,主要是做了以下的 change:

// Check for duplicate inputs — note that this check is slow
so we skip it in CheckBlock

https://i.imgur.com/T2e1MtP.png
(Code Snippet for PR#9049)

簡單來說,礦工們會無所不用其極地節省各式計算的時間,
以期在挖礦時確保能挖的比別人快。所以這個 PR 的用意在於,
想要在 CheckBlock 時略過檢查於 transaction 中是否有兩個相同的 input,
以節省時間。

(檢查的方式算是蠻暴力的,利用 std::set::count 與 std::set::insert 來檢查
是否有重複,時間複雜度為 O(n log n))


其實,有沒有相同的 input 是一個非常重要的檢查,
意義在於避免雙花(double-spending);當初此 PR 作者群認為,
每個 transaction 在上到 mempool 的時候,就應該做過檢查了,
所以當 block 上鏈後,照理說事後應不需多花這個計算時間重複檢驗。

=============

後果
But,就是這個 but ,在將近兩年後的 2018/09/17 ,
這段 comment 被一位 Bitcoin Cash/Bitcoin Unlimited 的開發者 Awemany
於開發時無意發現(Ref#4),於是做了一些實驗,
製造出具有相同的 input 的 transaction,
來測試 Bitcoin ABC (Bitcoin Cash 的 client),居然遇到了 assert()
程式直接 crash ,當他轉而測試 Bitcoin Core 也得到相同結果
(這並不意外,Bitcoin 子子孫孫的原始程式大多都從 Bitcoin Core fork 出來),
這時候 Awemany 就知道不太妙了,開始做後續通報的動作。

https://i.imgur.com/SOoc2XI.jpg
(bitcoin/src/validation.cpp code snippet)

Assertion failure point 在CheckBlock()之後的鏈結區塊ConnectBlock()。
而其中之 UpdateCoin() 會檢查 input 是否有被重複 spend,若有則 assert()。

Bitcoin Core 團隊迅速的於24小時內提出修正並釋出新版本(Ref#5)。
Fix 非常簡單,就是把原本於CheckBlock() 的duplicate inputs重新打開…(#Ref6)

=============

這件事情為什麼是個區塊鏈圈大新聞,這邊歸納為以下幾點:

1. 影響範圍廣大:許多區塊鏈實作受到影響,尤其是從 Bitcoin 分叉出來的,
除了上述的 Bitcoin Cash、Bitcoin Unlimited 外,Litecoin 也受其影響。

2. 可能引發嚴重後果:普通程式異常關閉雖然是我們生活中的日常,
但在區塊鏈的世界中卻是一件大事。礦工利用程式挖礦,以建立共識並確認交易;
當程式異常關閉(而且是一直關閉),就不會有礦工可以幫交易做確認,
整條區塊鏈可以算是癱瘓;
更嚴重的是,只要駭客成功算出一個包含有重複 input 的區塊放到鏈上,
會成為一種阻斷服務攻擊(DoS),可以大大的降低整體算力,
使 51% 攻擊更容易成功,進而修改區塊鏈上的資料

3. 修復是一個緩慢的過程:P2P 世界中,成千上萬的節點需要被更新,
這不是像按一個按鈕就可以完成的。截至 9/24 修正釋出的一個禮拜後,
Bitcoin 全網仍有 87% 的節點受此CVE 影響(Ref#7)。(真的是87%….)

=============

反思
理解了來龍去脈,回到最前言的部分,
到現在為止我們已經知道了為什麼大家認為這是一個(目前)史上最嚴重的
Bitcoin bug,會使整條鏈癱瘓。

但讓我再次引用 INSIDE 文章的某一段文字:

康奈爾大學教授 EminGünSirer 表示,
估計只需不到 8 萬美元的成本(12.5 枚比特幣)就能癱瘓整條比特幣區塊鏈。(Ref#2)

那個 8 萬美元的成本(12.5 枚比特幣)到底是怎麼算出來,
一直困擾著我。查閱了 Bitcoin Core 0.16.3 的 release note 後發現:

Such blocks are invalid, so they can only be created by a miner willing to
sacrifice their allowed income for creating a block of at least 12.5 BTC
(about $80,000 USD as of this writing)

原來國內外媒體一直引用的 8 萬美元的成本(12.5 枚比特幣)
就可以癱瘓 Bitcoin 的這句話是有一些誤解的。

原意其實是指:攻擊者先必須真正的算出合法的 hash,
才可將不合法的交易包入區塊中,進而達成攻擊。

反過來說,攻擊者等於是放棄了這 12.5 枚比特幣挖礦獎勵
(時下匯率換算約八萬美元),來達成攻擊,
因為包含了不合法的交易之區塊絕對不會被其他礦工承認。

所以真正要成功完成攻擊,成本絕對是遠高於所謂的 8 萬美元。

(cryptoglobe 文章中提到,www.crypto51.app 已經成功預估出於
Bitcoin Private (BTCP) 網路上,只需 $122 美金即可達成 51% 攻擊(Ref#8),
不過目前還找不到相關佐證文件)

=============

另一個反思則是,區塊鏈世界強調去中心化,但吸引眾多使用者的交易所、
共用的智能合約與區塊鏈全網使用的相同程式,再再的打破去中心化的概念,
只要任何一點被攻破,都是重大的損失,這樣還算是真正的去中心化嗎?

=============

Note : 若有錯誤,歡迎指正;也歡迎討論與指教,謝謝。

References :

1. https://bitcoincore.org/en/2018/09/18/release-0.16.3/
2. https://tinyurl.com/ycg2cmlm
3. https://github.com/bitcoin/bitcoin/pull/9049
4. https://medium.com/@awemany/600-microseconds-b70f87b0b2a6
5. https://bitcoincore.org/en/2018/09/20/notice/
6. https://github.com/bitcoin/bitcoin/pull/14247
7. https://twitter.com/LukeDashjr/status/1044224230114627586
8. https://tinyurl.com/ycq5gzjb

--

All Comments

Andrew avatar
By Andrew
at 2018-10-04T09:16
寫的還滿清楚的,推
Yuri avatar
By Yuri
at 2018-10-07T02:27
所以我向來都認為Bitcoin的金流protocol應該簡單
甚至能有多個不同的node implementation
Margaret avatar
By Margaret
at 2018-10-10T16:13
那就比較不會有單個implementation bug失效的問題
Hamiltion avatar
By Hamiltion
at 2018-10-14T16:52
像這次的bug就是被Bitcoin Umlimited的開發者抓到
Una avatar
By Una
at 2018-10-18T01:23
推~
Belly avatar
By Belly
at 2018-10-22T02:24
認真推
Dora avatar
By Dora
at 2018-10-23T02:05
Mary avatar
By Mary
at 2018-10-25T15:41
真正的攻擊成本當然是高於八萬美金
Anonymous avatar
By Anonymous
at 2018-10-26T04:29
除了12.5枚BTC還加上了算出區塊的電費以及設備折舊
Anonymous avatar
By Anonymous
at 2018-10-28T10:28
恐怖點在於BTC的挖礦節點幾乎只有一種implmentation
攻擊過後可能挖礦節點全死光,剩下自己爽爽挖51%攻擊
Irma avatar
By Irma
at 2018-10-31T05:32
好文章該推
Linda avatar
By Linda
at 2018-11-03T00:14
0.15.0之後 CheckTransaction()從validation.cpp被移到
consensus/tx_verify.cpp
Hedda avatar
By Hedda
at 2018-11-06T22:24
難怪剛剛找validation.cpp找無
Tracy avatar
By Tracy
at 2018-11-11T13:24
是說 點進去bitcoin的github的release頁
https://github.com/bitcoin/bitcoin/releases
Joe avatar
By Joe
at 2018-11-11T23:36
最近幾個release 比較舊的反而在比較上面
是否跟這個bug有關?
Noah avatar
By Noah
at 2018-11-16T05:55
除了可以讓程式crash, 能夠憑空產生bitcoin才是重點吧
Lucy avatar
By Lucy
at 2018-11-18T03:34
應該沒有允許多產生BTC UpdateCoins那裡有檢查 會擋下來
Franklin avatar
By Franklin
at 2018-11-22T02:48
只不過擋下來=直接讓程式死掉
Candice avatar
By Candice
at 2018-11-26T08:10
流通量不會增加,頂多可以讓你double spend
Annie avatar
By Annie
at 2018-11-30T20:51
但鏈要長的時候就會被reject掉
Brianna avatar
By Brianna
at 2018-12-04T01:27
0.14x 的完整節點會直接死給你看,其他版本可能會拒絕
Oscar avatar
By Oscar
at 2018-12-08T20:39
不過我認為 就算有攻擊者弄出一個區塊 裡面帶有這種引用重
複input的交易
Delia avatar
By Delia
at 2018-12-12T20:25
而且一時之間也成功進到區塊鏈了
Delia avatar
By Delia
at 2018-12-15T03:16
我是看到相關新聞@@ 像是發現bug的開發者說可以造成 in
flation http://goo.gl/16eCng
Zenobia avatar
By Zenobia
at 2018-12-19T21:45
但之後當大家發現這個bug的時候 都能發現鏈上這個出問題的
區塊
Todd Johnson avatar
By Todd Johnson
at 2018-12-20T09:37
所以應該也能達成共識 一致把區塊鏈轉回那個區塊之前
Sandy avatar
By Sandy
at 2018-12-22T10:59
那篇文章只有說有這個可能,但實際上double spend的
檢查依照節點實作的不同,會被檢查不只一次
Elizabeth avatar
By Elizabeth
at 2018-12-26T09:11
新加入的節點一定會檢查double spend,所以inflation
Jacky avatar
By Jacky
at 2018-12-30T07:15
不會產生,但是可能還是有少數的特定節點實作通過
那這樣就會造成chain split
Linda avatar
By Linda
at 2019-01-03T12:24
Awemany就是在批評,避免雙花這種核心的功能竟然可以
Liam avatar
By Liam
at 2019-01-05T17:28
好文推
Jack avatar
By Jack
at 2019-01-09T17:39
靜悄悄地被省略拿掉,開啟了inflation的可能性
Emily avatar
By Emily
at 2019-01-14T00:02
想要攻擊的人可以故意不公布,找到真正增加流通量方法
Valerie avatar
By Valerie
at 2019-01-15T21:45
請問現在的Bitcoin Core是誰在帶頭呀?
Lydia avatar
By Lydia
at 2019-01-20T13:36
感謝解說@@
Isabella avatar
By Isabella
at 2019-01-22T19:15
https://en.bitcoin.it/wiki/Wladimir_van_der_Laan
Selena avatar
By Selena
at 2019-01-22T23:44
https://github.com/laanwj
George avatar
By George
at 2019-01-26T23:04
原來就是發release的人
Eartha avatar
By Eartha
at 2019-01-29T20:38
謝謝各位強者的補充 還沒機會回答問題 大家都解答完了
Mia avatar
By Mia
at 2019-02-01T12:51
推。
James avatar
By James
at 2019-02-04T15:25
技術文推
Candice avatar
By Candice
at 2019-02-08T21:35
Mary avatar
By Mary
at 2019-02-12T21:33
推~
Jacob avatar
By Jacob
at 2019-02-13T23:00
推專業文
Valerie avatar
By Valerie
at 2019-02-16T06:47
以太好像沒被波及到
Agnes avatar
By Agnes
at 2019-02-19T09:24
以太不是直接fork比特幣ㄅ
Irma avatar
By Irma
at 2019-02-22T02:04
以太的客戶端 最大宗的好像是用go寫 而且也有不只一種實作
Rachel avatar
By Rachel
at 2019-02-25T17:59
用各種不同語言寫
Victoria avatar
By Victoria
at 2019-03-01T21:16
以太幣自己重底層重刻的,金流只是EVM的一個功能罷了
Jacob avatar
By Jacob
at 2019-03-04T11:58
Lily avatar
By Lily
at 2019-03-06T15:20
推 謝謝分享
Faithe avatar
By Faithe
at 2019-03-07T05:07
推認真解釋
Anonymous avatar
By Anonymous
at 2019-03-10T07:31
專業給推

配合資料銀行事業 富士通以區塊鏈技術追

Jacob avatar
By Jacob
at 2018-09-29T00:32
新聞來源連結: 配合資料銀行事業 富士通以區塊鏈技術追蹤資料 https://goo.gl/3wWh5x 新聞本文: 針對假新聞、假資料等問題,日本IT大廠富士通(Fujitsu)在2018年9月20日發布消息,該 廠將以區塊鏈(blockchain)技術為基礎,推出名為Chained Lineage的技 ...

pax/bnb 交易對將上線

Rachel avatar
By Rachel
at 2018-09-28T01:28
剛剛看到幣安的公告 有美國政府背書且每月審計的穩定幣pax要上線了 初期只有pax/bnb,接著會開放pax/btc 不過pax一開始的發行量 應該沒辦法達到usdt的水準 流通性不知如何 大家會有意願持有pax嗎 ? - ...

想請教Cardano跟ADA的發展性

Blanche avatar
By Blanche
at 2018-09-27T09:26
各位先進早安 小弟幣圈新手,最近有機會面試一個跟Cardano有關的項目 做了很多資料研究, 發現Cardano最為人詬病的就是發展緩慢 我大乙太都被各種ICO項目沖洗一波了, Cardano還在一種要死不活的感覺 Q_Q 想請問各位大大對於Cardano還有ADA的看法 第三代加密貨幣到底是喊喊的還 ...

大戶交易情報機器人

Yedda avatar
By Yedda
at 2018-09-27T08:24
: 或者你有想要我加的chain也留言說一下吧 : 還是說沒在用twitter要改成用line之類的= = -- → walelile: 交易所內的交易不一定會上chain吧 要砸盤還是可以砸 09/26 14:17 → HamalAri: 交易所內的幣甚至可以是無中生有的 09/26 15:11 → PHE ...

10月GOOGLE將解禁虛擬貨幣廣告投放

Aaliyah avatar
By Aaliyah
at 2018-09-26T16:47
新聞來源連結: http://ec.ltn.com.tw/article/breakingnews/2562197 新聞本文: 〔財經頻道/綜合報導〕繼臉書(Facebook) 解除了虛擬貨幣廣告禁令後,Google也公 布其最新的廣告規範,表示將重新開放虛擬貨幣交易所刊登廣告,不過目前僅允許受監管 且合法 ...