#72
2018 / 文章

用「51% 攻擊」正確的破壞區塊鏈

25 分鐘閱讀

嗨,早安!

相信大家多少都有發現,網路上在討論區塊鏈安全性的時候,經常會分成兩種說法。

一邊會說區塊鏈很安全,例如目前比特幣區塊鏈都還沒有被成功駭過。另一邊則會舉出各種交易所被駭的例子,例如日、韓交易所常常被攻擊,說這怎麼算安全。對這個領域沒有那麼熟悉的人,往往是霧裡看花,覺得兩邊說得都有道理。

今天我們深入來看,為什麼交易所明明經常被駭,卻又會有人說區塊鏈很安全。還有,假如你是駭客,該怎麼發動 51% 攻擊。(不是教大家做壞事啦)


華爾街日報(The Wall Street Journal)最近刊出一篇專欄文章,標題是「交易所常被駭,是因為駭它簡單又划算」(Cryptocurrency Exchanges Are Getting Hacked Because It’s Easy)。

內文有一張圖表,按照被駭的金額由高至低,列出史上最大的 11 起密碼貨幣交易所竊案。

目前被駭金額最高的 11 次交易所竊案 / 圖片來源

你會發現,這 11 家被駭的交易所,有 7 家都座落在亞洲。而且日本佔據了被駭金額最高的前兩名,南韓則是在排行榜上重複出現了三次,甚至最近的一起駭客入侵事件是發生在以色列的 Bancor 交易所。

是因為亞洲交易所的資訊安全,都做得特別不好嗎?

文內引用 CoinMarketCap 的統計,目前全球約有 205 家交易所,而大多數都是開在亞洲地區。換句話說,我們常常在新聞上看到亞洲的交易所被駭客入侵,不完全是因為這些交易所的資訊安全措施做得不完善,還可能是因為亞洲是目前交易所數量最多的地區,所以特別容易中槍。

那麼大家難免會好奇,駭客入侵交易所真的簡單又划算嗎?(讓人好想試試看)

多數交易所的安全性,和區塊鏈無關

多數的交易所(中心化交易所),雖然做的是密碼貨幣的交易業務,但是本身並沒有用到區塊鏈技術。我們過去多次討論過交易所的業務,就是搓合買賣雙方的出價。

那交易所都是怎麼做呢?

交易所會說,你們要買賣的話,就都把密碼貨幣轉到我這裡來,然後到我的網站來下單買賣。如果有人要跟你交易,那我就會幫你們兩邊自動配對,並把交易後的結果更新在各自的交易所帳號上。

你發現了嗎?

我們其實就是把錢轉給一個自稱是交易所的機構,由它來幫忙完成交易,這當然風險很高。無論是它捲款潛逃,或是它手上因為拿著大把鈔票而吸引駭客攻擊,這兩種情況在歷史上都發生過不只一次。

也就是因為風險高,所以大家在選擇交易所的時候,都會先打聽那個交易所是否可靠。畢竟,交易所跟網路上的陌生人最大的差別,就只是交易所有個看似華麗且功能完整的網站而已。這也可以解釋爲什麼 LINE 來開交易所,會有它獨特的優勢,至少大家信任 LINE 這個品牌。

不過,品牌只能讓人相信交易所不會監守自盜,但不一定能阻止駭客攻擊。

所以,交易所還是得想辦法把錢保管好,或是透過銀行信託交易所的資金。最常見的做法,是效法銀行保管資金的方式,只將一小部分的錢放在櫃台上流通,多數的錢(可能 90%)會鎖在銀行的金庫裡。

放在櫃台上流通的,我們會稱它是熱錢包(hot wallet)。而鎖在金庫裡的,稱它是冷錢包(cold wallet)。熱、冷錢包的差別,在於錢包「是否有連接網路」。

所以,駭客透過網路闖進交易所,頂多只能偷走熱錢包裡的錢,但是冷錢包因為完全沒連接網路,就像金庫和銀行櫃檯完全在兩個不同的地址,外部的駭客很難知道金庫在哪裡,除非駭客還有內應。

所以,如果你是駭客的話,就可以直覺地想出兩種策略:

  1. 選擇交易量大的交易所來攻擊,因為它們可能會在櫃檯(熱錢包)放比較多錢,以應付日常需求。
  2. 選擇安全意識較弱的交易所來攻擊,他們可能沒有建立自己的金庫(冷錢包),所以只好將全部的錢都放在櫃台。

有的人會認為規模越大的交易所,資安防護也會越完整,但其實未必。大型交易所可能會忙於做行銷、衝流量,而忽略資安的重要,這時候就讓駭客有機可乘。

因此,你得考慮每次攻擊的 CP 值有多高。

今年初,有一間日本交易量前三大的交易所叫做 Coincheck,你聽到消息說它們把交易所持有的新經幣(NEM)都放在熱錢包(櫃檯)裡,而沒有存到冷錢包(金庫)去。這對你這個駭客來說,當然是機不可失的好機會,交易量大又沒有金庫保護。

此時不駭,更待何時。

所以,Coincheck 是目前交易所失竊金額排行榜上的冠軍,一共被偷走價值 5.35 億美金的新經幣。就是因為犯了沒有把錢分開放,這是很低級的錯誤。

說了這麼長一段,我想告訴你的是交易所被駭和一般的網站被駭,並沒有什麼不同。多數交易所只是透過自己的網站、資料庫,協助使用者交易用區塊鏈發行的密碼貨幣,而交易所的安全性並不仰賴區塊鏈技術,所以才會採取熱錢包、冷錢包的方式來避免資金損失。

交易所會讓駭客知道自己在熱錢包放的錢很少,你浪費力氣闖進來其實很不划算,那麼交易所自然就不會成為駭客的攻擊目標。所以,以後你如果再看到有人說交易所被駭,就可以知道那跟區塊鏈通常都沒關係。簡單來說,「交易所被駭,不等於區塊鏈不安全」,這是許多人經常誤會的地方。

但是,也有很少數的交易所是建立在區塊鏈上,稱之為去中心化交易所(decentralized exchange)。去中心化交易所的運作方式,主要是將用戶的資金交給智慧合約保管,所以駭客要偷走資金就得找到智慧合約的漏洞,或是直接挑戰區塊鏈。

如何正確地破壞區塊鏈

直接挑戰區塊鏈並非不可能的任務,最常被提到的就是「51% 攻擊」。

但是,很多人會誤以為 51% 攻擊是過半的礦工說好一起做壞事,就好像考試集體作弊一樣,然後就可以竄改交易紀錄。這其實誤會很大,接下來我們來玩個角色扮演,讓你實際當壞人看看該怎麼發動一次 51% 攻擊。

51% 攻擊能做的事情非常有限,主要是把自己持有的同一筆錢花兩次。但是 51% 攻擊不能把別人帳戶裡的錢轉到自己帳戶。因為動用其他人帳戶內的錢,需要那個人的私鑰簽名,所以跟 51% 攻擊無關。

那什麼叫做同一筆錢花兩次呢?

假如你用 100 枚比特幣買一輛藍寶堅尼,你把錢轉給車商,車商確定你有轉帳之後,雖然自己還沒確定入帳,但是車子就先讓你開回家了。畢竟,比特幣區塊鏈過去都很安全,沒有出過什麼大事。

但是,車商今天碰上你就踢到鐵板了。如果你回家之後發動 51% 攻擊,就可以讓 100 枚比特幣再度回到你的帳戶內,而藍寶堅尼已經在你家車庫了。於是,這 100 枚比特幣你就可以再用來買其他東西,這就是用 51% 攻擊來達成重複花費(double spend)的簡單劇情。

為什區塊鏈會允許你逆轉交易?

因為區塊鏈是只仰賴規則運作的地方,沒有銀行、政府、法院來判斷誰對誰錯,只要你的行為一切都符合規則,那你也可以把黑的說成白的。

這和我們現實生活非常不一樣,規則或法律通常都是我們生活中的最低標準,留給每個人充分的自由。但是在區塊鏈上,規則必須是最高標準,否則就會有一大堆體制內的漏洞可以鑽。

例如 51% 攻擊就是一種鑽漏洞的方式,怎麼鑽?

這就得看 51% 攻擊的完整劇情,所以接下來我們會討論比較多區塊鏈的運作機制,不過我會用圖來幫助你輕鬆看懂它。

發起交易

我們再重來一次剛剛去買藍寶堅尼的例子。

你把 100 枚比特幣轉給車商,確切步驟是你用自己的私鑰,簽署一筆 100 枚比特幣的轉帳交易。於是這筆交易就會進到比特幣區塊鏈的「待確認交易區」,等待礦工們來挑選他們各自喜愛的交易。區塊鏈隨時都有數百到數千筆的交易等待確認,例如現在比特幣區塊鏈就還有大約 500 筆交易待確認。

礦工通常會優先挑選交易手續費付得比較高的交易來做,因為礦工可以收比較多錢。

這邊提醒一下,不要誤會這是人工逐筆挑選交易,而是礦工會將挑選規則寫在自己挖礦的程式碼內,透過挖礦程式來自動執行,只是我會描述得比較生動。

繼續回來,礦工挑走各自愛的交易之後,就把這些交易放到自己的箱子(區塊)內,但是還沒寫上區塊鏈哦!

礦工如果要把區塊寫到區塊鏈上,就得解出一個非常複雜的數學運算難題。電腦的運算能力就是用在這裡,有越強的運算能力,礦工就能越早解出難題的解答。

最早找到解答的那個礦工,就會在網路上廣播告訴其他礦工自己已經找到解答。但其他礦工也不是傻傻的就接受,而是會驗證那個區塊內的交易,都沒有和過去既有的交易紀錄相衝突才會接受。

這個找到解答、廣播給其他礦工,再由其他礦工驗證交易紀錄的過程,就叫做礦工們「達成共識」(consensus)。但是,你今天扮演的是藍寶堅尼的車主、心懷不軌的礦工,所以當然不會這麼安分守己地工作。

暗中醞釀

你會在大家都努力運算找到解答的時候,偷偷製作一個自己版本的區塊鏈,但是你暫時都不對外廣播。當然,每個區塊要串起來的前提,也都是要找到數學難題的解答,所以你其實也沒有閒著。

只不過,其他的礦工只要聽到有人廣播新版本的區塊鏈,他們馬上就會跟上,而不會像你一樣一直堅持自己的一套版本。

兩種版本的區塊鏈,綠色是公認的正確版,紅色是駭客私下做的攻擊版 / 圖片來源

於是,這時候整個網路就有兩條不同版本的區塊鏈,上面綠色的是由其他礦工們合力完成的區塊鏈,而下面紅色的是你偷偷在做的區塊鏈。但是,因為你沒有對外廣播,所以也沒人知道有紅色這條區塊鏈的存在。

對所有人來說,綠色的區塊鏈才是大家有共識的唯一版本。

這時候,你把家裡的電腦放著讓他自己去偷偷地替你做壞事,而你自己出門買車。你把 100 枚比特幣轉給車商,然後把藍寶堅尼開回家。這筆交易就會出現在區塊鏈上的「待確認交易區」,但是只要還沒被寫上區塊鏈,這筆錢就不算是被花掉。

接下來,你要做的事情就很明顯了,你自己偷偷維護的紅色區塊鏈要「刻意忽略」這筆 100 枚比特幣的交易。而綠色區塊鏈因為有很多礦工都在競爭,你沒辦法控制其它礦工要確認哪筆交易,所以綠色區塊鏈的那 100 枚比特幣肯定是要不回來了。

於是,現在兩種版本的區塊鏈就會長成像下方這樣。在綠色區塊鏈中,你的買車交易已經被寫進編號 40 的區塊內。但是在紅色區塊鏈中,因為你刻意忽略那筆交易,所以你買車的那 100 枚比特幣還沒真的花掉。

買車的交易已經在綠色區塊鏈被確認,紅色區塊鏈刻意忽略這筆交易 / 圖片來源

有趣的事情來了。剛剛說區塊鏈是個按照規則走的地方,對吧!

所謂的規則就是哪條區塊鏈最長,那條區塊鏈上的紀錄就是正確的。所以,你剛剛把 100 枚比特幣花去買車,現在得想辦法把自己的紅色區塊鏈變成最長的區塊鏈,才能再讓 100 枚比特幣看起來像是還沒花過。

怎麼做呢?

我們都知道,擁有越多電腦運算能力的礦工,就越有機會將自己的區塊,放到區塊鏈上。

正常情況是,大家手上的區塊鏈都是同一套版本,因為定期都會收到廣播嘛!所以,無論下一個是誰來負責更新區塊鏈,都不會影響過去的歷史。

但是,現在的情況是你的紅色區塊鏈刻意跟大家是不同版本,所以如果紅色區塊鏈變成最長的區塊鏈,那其他礦工就會被迫接受紅色區塊鏈的全部紀錄。所以,會讓一些原本有花過錢的人,現在變成沒花過錢了。

很有趣吧!

比特幣區塊鏈並沒有規定,不能有其他版本的區塊鏈,所以只要紅色區塊鏈能成為最長的區塊鏈,它就是真理。不過,通常只有刻意要攻擊區塊鏈的人,才會費盡心思刻意跟別人做出不同版本的區塊鏈就是了。

無論如何,算力競賽就開始了。

發起攻擊

接下來就是硬碰硬的比賽了,一旦你的紅色區塊鏈領先,你就會向其他礦工廣播說自己的區塊鏈最長。


一旦紅色區塊鏈領先,就會向網路廣播這個消息 / 圖片來源

其他礦工驗證你的每個區塊,當然不會找出問題。因為你只是沒有把自己花錢的那筆交易放進區塊而已,優先驗證誰的交易本來就是礦工的自由,並不是做什麼非法交易。況且,區塊鏈上隨時都有很多交易在「待確認交易區」排隊,所以有些交易沒放進去,這很正常。

當其他礦工驗證完交易,也接受紅色區塊鏈最長之後,就會逆轉原本你花過 100 枚比特幣的這個事實。再強調一次,那筆轉帳交易並不是被你刪除了,而只是一直被你刻意忽略,所以還在「待確認交易區」內。在這筆交易被寫進區塊鏈之前,看起來就像你沒花過這筆錢一樣。


其他的礦工也會加入新的區塊鏈挖礦 / 圖片來源

從此你就高枕無憂了嗎?還沒!

你得趕快把這筆逆轉回來的 100 枚比特幣花掉,畢竟之前是你刻意忽略那筆交易。但是現在全球的礦工人這麼多,他們看看區塊鏈上都還沒有你的那筆交易,就會從「待確認交易區」把這筆交易撿起來放進他們的區塊,並等著「上鏈」。

因此,你最好在把藍寶堅尼開回家的路上,趕快就把那逆轉回來的 100 枚比特幣花掉。如果你沒有趁交易上鏈之前趕緊花掉,等到那筆交易被其他礦工寫上區塊鏈之後,你精心創造出來的空檔就要消失,也就等於你白忙一場啦。

角色扮演結束。

相信你現在應該很清楚,從駭客的角度來看,發動 51% 攻擊的難度有多高。除此之外,我們剛剛還沒有討論到持有 51% 的算力成本也很貴。即便一切都順利的情況下,駭客手腳還得要夠快,否則就會功虧一簣。

現在再回頭看,大家在討論區塊鏈的安全性、交易所被駭,這兩種看似互斥的論點,確實是可以並行不悖的。

但是,區塊鏈畢竟還是透過經濟誘因建構起來的帝國,如果多數人都誤以為「交易所被駭,就是區塊鏈不安全」,並對區塊鏈逐漸失去信心,那就會減低誘因機制的吸引力。

而沒人使用的區塊鏈,就沒有價值了。

本文感謝陳昶吾協助審稿