2018年4月25日,我以匿名的方式私下披露了比特幣現(xiàn)金(BCH)的一個關(guān)鍵漏洞。比特幣現(xiàn)金是世界上最有價值的加密貨幣之一,與比特幣(BTC)不同。如果有黑客成功地利用這個安全漏洞,可能會造成極大的破壞,導致比特幣現(xiàn)金的交易不再可能安全進行下去,最終會完全破壞該貨幣本身的使用以及價值。事實情況是,這一漏洞在沒有發(fā)生事故的情況下得到了很好的修復,并于2018年5月7日向公眾披露了這起事件。
首先要對比特幣現(xiàn)金做一個簡單的說明。比特幣現(xiàn)金是一種不同于比特幣、而且與比特幣不兼容的加密貨幣。之所以這樣命名,是因為它源自比特幣。下文描述的已經(jīng)修復好的漏洞只對比特幣現(xiàn)金產(chǎn)生了影響;比特幣現(xiàn)金與比特幣唯一相關(guān)的就是它們的名字很相似。
至于我為什么要這么做?我的動機是什么?我在麻省理工學院媒體實驗室的數(shù)字貨幣項目工作,顧名思義,這是一個負責研究和開發(fā)加密貨幣的團隊。具體來說,我?guī)椭_發(fā)和維護比特幣核心錢包以及比特幣的主要軟件實現(xiàn)。由于承擔這項工作,我經(jīng)常在會議和研討會上被問到這樣一個問題:你認為未來比特幣面臨的最大挑戰(zhàn)是什么?而我的回答總是一樣的:比特幣未來一定要注意避免災難性的軟件漏洞。
通過研究這個有可能帶來災難性后果的漏洞,我確信軟件漏洞的威脅在加密貨幣世界中被嚴重低估了。我對這一事件提供了一個詳細的報告,這不是小題大做,而是希望以這個真實世界的例子讓人們了解到,要達到加密貨幣所需的復雜工程水平還有很多工作仍然要做,同時也給那些還沒有為這種情況做好充分準備的公司敲響了警鐘。
簡而言之,一部分交易簽名驗證代碼被重寫,但新代碼省略了對簽名類型中特定位(bit)的關(guān)鍵檢性查。我在本文中將這個位稱為SIGHASH_BUG。這種省略行為將使一個特制的交易把比特幣現(xiàn)金區(qū)塊鏈分叉成兩條不兼容的鏈。下一節(jié)我將描述這種分叉的重要性。有關(guān)漏洞和修復的詳細信息,請參閱公開的文本。
區(qū)塊鏈分叉漏洞有何特別之處?
大多數(shù)加密貨幣,包括比特幣和比特幣現(xiàn)金,通過向所有參與者分發(fā)所有交易的分類帳來運行。為了能夠進行消費,貨幣持有者必須首先創(chuàng)建一個交易,這個交易要遵守系統(tǒng)的所有規(guī)則。這些規(guī)則大多數(shù)都很明顯,很直接,例如“你的花費不能超出你所擁有的數(shù)量”,但其他規(guī)則則更加微妙,技術(shù)性更強,尤其是那些描述數(shù)字簽名應該如何格式化的規(guī)則。但是,如果加密貨幣是不允許使用的,那么誰來設置這些所謂的驗證規(guī)則呢?
每個人都參與設置驗證規(guī)則系統(tǒng)的規(guī)則是由每個人來決定的,而執(zhí)行這些規(guī)則是軟件的工作。如果一個參與者試圖欺騙并創(chuàng)建一個交易,在這筆交易中,他花費的不是自己的貨幣,那么其他參與者的軟件會簡單地拒絕這筆交易。因此,為了確保交易被普遍接受,它必須遵守所有的規(guī)則,哪怕規(guī)則迂腐至極。
負責執(zhí)行驗證規(guī)則的軟件需要不斷地改進。為了提高性能、增加特性、提高安全性等,需要不斷進行更改。但是,從一個版本到另一個版本執(zhí)行規(guī)則的方式必須保持完全相同,這一點非常重要。
那么,如果新版本軟件中的一個意外編程漏洞導致交易被認為是有效的,而之前的所有版本都將其視為無效時,會發(fā)生什么情況呢?其結(jié)果就是“區(qū)塊鏈分裂”,這意味著只有升級了該軟件的參與者子集才會接受上述交易。由于交易和區(qū)塊是鏈接在一起的,因此這兩個子集在接下來的每筆交易上都不一致。如果沒有開發(fā)人員的快速行動,沒有讓所有參與者團結(jié)統(tǒng)一到一起,這兩個參與者陣營將永遠無法達成一致。到那時,這種貨幣實際上已經(jīng)分裂為兩種不兼容的貨幣,像以前那樣交易將不再可能。
在權(quán)衡諸如此類的漏洞的潛在影響時,時機起著至關(guān)重要的作用。如果區(qū)塊鏈被分割成兩塊,99%的參與者在一邊,而只有1%的參與者站在另一邊,那么顯然與多數(shù)人站在一起就是前進的道路。然而,如果大約有50%的人已經(jīng)升級到新版本,那么就沒有簡單的選擇了。
我在比特幣現(xiàn)金最受歡迎的一個軟件新版本中發(fā)現(xiàn)了這種分鏈漏洞,但這是在將近一半的網(wǎng)絡升級到它之后才發(fā)現(xiàn)的。
發(fā)現(xiàn)漏洞由于比特幣現(xiàn)金是免費的開源軟件,它經(jīng)常被用作新興加密貨幣的起點。除了受益于多年的改進之外,共享代碼還意味著,其他不相關(guān)的加密貨幣可以從彼此的改進中獲益。比特幣現(xiàn)金的主要軟件被稱為比特幣ABC(Bitcoin ABC),是基于比特幣核心錢包的軟件之一。
由于大量的通用代碼,這些派生項目通常會有類似的漏洞,因此也會有類似的漏洞修復。但是,期望一種貨幣的開發(fā)人員積極主動地與其他貨幣的開發(fā)人員分享他們的改進是不現(xiàn)實的,因為單單要跟上一個項目就是足夠困難了。出于這個原因,我養(yǎng)成了一個習慣,每隔幾個月就會對這些項目進行一些修改,以查找可能與比特幣核心錢包相關(guān)的漏洞修復。
在今年早些時候查看比特幣ABC的變更日志時,我注意到交易驗證中一個關(guān)鍵部分已經(jīng)被重構(gòu)。這些變更立即吸引了我的注意力,因為這些變更似乎是沒有必要的。出于對這些變更的好奇,我看了一下公眾對這些變更的評論。除了“封裝”之外,沒有任何理由能解釋。這個變更只有兩個審核人,審核持續(xù)一周后代碼就被接受了。
大型重構(gòu)是非常常見的,通常是特定軟件開發(fā)中的良好實踐。但是,修改加密貨幣的驗證代碼是極具風險的,極有可能會在無意中引入了一個鏈分叉錯誤。
在看到評論很少而變更很大后,我認為一個漏洞很有可能已經(jīng)產(chǎn)生,所以我就去查看了一下。找到SIGHASH_BUG花了不到10分鐘。
匿名披露我在上面提到我的披露是匿名的。我想解釋一下這個原因,因為匿名在這個過程中扮演了重要的角色。
在確認該漏洞可被人利用后,我開始通知比特幣ABC(比特幣現(xiàn)金協(xié)議的全節(jié)點實施)開發(fā)人員,但很快意識到我遇到了一個大問題。這是公開可用的開源軟件中的一個漏洞,可能已經(jīng)有人發(fā)現(xiàn)了這個漏洞。在完全部署修復程序之前,沒有什么可以阻止其他人發(fā)現(xiàn)并利用這個漏洞。
那么在最糟糕的情況下,會怎么樣呢?假設我以我的名義以非公開的形式披露了這個漏洞,而其他人也找到了這個漏洞并在第二天匿名利用了這個漏洞。因為我使用我的名字進行披露,所以會有足夠的證據(jù)證明我有攻擊比特幣現(xiàn)金網(wǎng)絡的知識和手段,而我無法證明我不是攻擊者。然而,如果漏洞被利用,可能會造成數(shù)十億美元的損失,代價遠比殺害這些人要高得多。所以匿名是非常重要的,我認為這對我的安全是必要的。
在試圖弄清楚是否可以完全匿名披露時,我開始懷疑它是否值得我花費這么多精力。畢竟,我沒有義務報告任何事情。但是,如果有人在比特幣核心錢包中發(fā)現(xiàn)了一個同樣嚴重的漏洞,我會很希望這個人以盡可能謹慎和安全的方式引起我們的注意。所以我決定這樣做:創(chuàng)建我想要閱讀的報告,按照我想要的標準來寫這個報告。
第一步很明顯,我需要追蹤比特幣ABC的責任信息披露政策。如今,處理此類問題的策略很常見,并且對于任何安全關(guān)鍵項目來說都是必備的。遺憾的是,我在比特幣ABC網(wǎng)站或代碼庫中找不到這樣的策略。在我提交一個漏洞到他們的GitHub問題跟蹤器時,我找到了最接近的一個策略。
然而這沒有幫助。然后,我開始試圖找到公開發(fā)布的比特幣ABC開發(fā)人員的加密密鑰。我向他們加密一條消息,確保沒有其他人可以查看它,這樣我就不用擔心如何傳遞消息了。我無法實際驗證密鑰持有者的身份,但這種方法仍然是相當安全的,而且比根本沒有加密要好得多。
但是,我又遇到了障礙。公共PGP密鑰服務器上沒有列出任何主要開發(fā)人員的密鑰,而這些密鑰通常都是在公共PGP密鑰服務器上找到的,而且它們的代碼存儲庫中也沒有。當時,我別無選擇,只能通過不同的在線渠道匿名請求密鑰,使用Tor盡可能掩蓋我的身份。
4月25日,我首先創(chuàng)建了一個一次性的Github賬戶,并在那里向一些比特幣ABC開發(fā)人員發(fā)送了請求。
值得慶幸的是,這個方法奏效了!大約5個小時后,我收到了一把密鑰,然后迅速用它對問題進行了加密的詳細披露。然而,當我第二天回來查看回復時,Github標記了我的一次性賬戶,大概是因為我使用了Tor。所以我無法在Github繼續(xù)進行進一步的接觸,我只得假設沒有人接收到了我的披露。
現(xiàn)在我有了加密密鑰,我決定嘗試最后一種方式:向比特幣ABC的漏洞追蹤器提交了一條加密消息,同樣是使用Tor和一個一次性賬戶。6個小時后,在沒有收到任何回復后,我在他們的追蹤器上做了最后一次請求。
4月27日,在等待了大約48個小時后,比特幣ABC發(fā)出了pull request,秘密解決了這個問題。顯然他們收到了我的信息。成功!
我的思考我發(fā)現(xiàn)的比特幣現(xiàn)金漏洞已成功披露,且目前已經(jīng)得到修補,最終沒有對比特幣現(xiàn)金造成明顯影響。但是,如果整個加密貨幣生態(tài)系統(tǒng)沒有從對這種漏洞的分析中得到一些經(jīng)驗和教訓,那將是一種遺憾。作為加密貨幣開發(fā)者,有必要現(xiàn)在后退一步,重新評估我們可以使用的工具,以及我們實施的政策和程序。我們可能無法消除這些漏洞帶來的威脅,但我們可以從中學習并做好準備,以便將來處理它們。





