Bitcoin Core開發者向BCH開發團隊披露重大漏洞始末

2018年8月15日 17:40
来源:奇点财经

引言:眾所周知,BTC和BCH的開發團隊的理念並不相同,但比特幣核心開發團隊Cory Fields並沒有計較這些,他在查閱BCH軟體更新時發現了一個重大漏洞,並想盡方法通過最安全最謹慎的方式將其報告給了BCH的開發團隊,避免了重大損失,堪稱道德的楷糢。Cory Fields指出,對於加密貨幣而言,最重要的威脅就是軟體的安全問題。本文詳細的講述了他發現漏洞,反饋漏洞的過程,值得全體加密貨幣的從業者反思與借鑒。

本文轉自Bitcoin Core開發者Cory Fields發表在Medium上的文章,由奇點財經翻譯。

在2018年4月25日,我以非公開的形式匿名披露了比特幣現金(BCH)的一個嚴重漏洞。如果這一漏洞被人成功利用,可能會對比特幣現金造成巨大破壞,用戶將無法安全的交易比特幣現金,目前該漏洞已經在沒有發生意外的情況下得到修複,並於2018年5月7日公開披露。

小貼士:比特幣現金是一種與比特幣完全不同的加密貨幣,與比特幣的唯一相似的是名稱。本次漏洞僅影嚮比特幣現金。

關於我本人:我在麻省理工學院媒體實驗室為數字貨幣計劃工作,顧名思義,這個社區負責研究和開發加密貨幣。具體來說,我幫助開發和維護Bitcoin Core,這一開發組負責維護比特幣的程序。因為我的工作關系,我經常在會議上被問到甚麼是比特幣未來的最大挑戰。我的回答只有一個:避免災難性的軟體漏洞。

本次發現這一漏洞更堅定了我的信念,即在加密貨幣世界中,軟體漏洞的威脅被嚴重低估。我現在提供一份關於這次事件的報告,並不是針對比特幣現金,而是作為一個真實的例子,告訴大家做好加密貨幣需要足夠的努力,並作為一個警鐘,讓那些沒有為此做好充分準備的公司早作準備。

SIGHASH_BUG

簡而言之,一部分交易簽名驗證代碼被重寫,但新代碼省略了對簽名類型中特定位(bit)的關鍵檢性查。我在本文中將這個位稱為SIGHASH_BUG。這個省略將允許一個特制的交易將比特幣現金區塊鏈分叉成兩條不兼容的鏈。

鏈分叉漏洞指甚麼?

大多數加密貨幣,包括比特幣和比特幣現金,通過向所有參與者分發包含所有交易資訊的賬本而運作。為了花費一些硬幣,消費者必須首先創建一個遵守系統所有規則的交易。這些規則中的大多數都是顯而易見的,例如「你不能花費比你擁有還多的錢」,但其他規則則更加微妙和富有技術性,特別是那些描述數字簽名應符合甚麼格式的規則。但是,如果加密貨幣是去中心的,誰設定了這些所謂的驗證規則?

大家共同設定驗證規則!

系統的規則是大家一起決定的,軟體負責執行。如果一個參與者試圖欺騙並創建一個能花費他沒有的錢的交易,那麼其他參與者的軟體將簡單地拒絕該交易。

負責執行驗證規則的軟體將始終需要發展。需要不斷進行更改以提高性能,添加功能,提高安全性等。但是,必須保證驗證規則是不變的。

那麼,當新版軟體中的意外編程錯誤導致交易被認為有效,而所有之前版本的軟體都將其視為無效時,會發生甚麼?結果是「分叉」,這意味著只有升級了軟體的交易者才會接受相關交易。並且由於交易和區塊被連接在一起,因此兩個陣營在隨後的每個交易上都不一致。如果沒有開發人員的快速處理,及時更新兩者的交易,兩個陣營將再也無法達成一致。此時,加密貨幣會被撕裂成兩種互不兼容的貨幣。

在權衡這些漏洞的潛在影嚮時,時機起著至關重要的作用。如果有99%的人沒有更新軟體,那這一分叉會被放棄,不過如果50%的人都更新了軟體。事情就會變得複雜。

我在比特幣現金最近更新的軟體中發現了這一錯誤,已經有近一半用戶更新了這一軟體。

發現經過

因為Bitcoin Core是免費的開源軟體,所以新生加密貨幣經常借鑒其作為基礎。比特幣現金的主要軟體Bitcoin ABC(比特幣現金的軟體開發應用),就是基於Bitcoin Core開發的。

由於大量的通用代碼,衍生項目通常具有類似的錯誤。但是,期望一種加密貨幣的開發者積極主動地與其他開發者分享是不現實的,因此,我已經養成了一個習慣,每隔幾個月去檢查一下其他加密貨幣軟體的更新,以尋找可能的與Bitcoin Core相關的錯誤修正。

在今年早些時候查看Bitcoin ABC(比特幣現金的軟體開發應用)的變更日志時,我註意到交易驗證中一個關鍵部分已經被重構。這些變更立即吸引了我的註意力,因為這些變更似乎是沒有必要的。出於對這些變更的好奇,我看了一下公眾對這些變更的評論。 除了「封裝」之外,沒有任何理由能解釋。這個變更只有兩個審核人,審核持續一周後代碼即被接受。

大型重構是非常常見的,通常是特定軟體開發中的良好實踐。但是,修改加密貨幣的驗證代碼是極具風險的,極有可能會在無意中引入了一個鏈分叉錯誤。

在看到評論很少而變更很大後,我認為一個漏洞很有可能已經產生,所以我就去查看了一下。 找到SIGHASH_BUG花了不到10分鐘。

匿名披露

我在上面提到我的披露是匿名的。我想解釋一下這個原因。

在確認該漏洞可被人利用後,我開始通知Bitcoin ABC(比特幣現金的軟體開發應用)的開發人員,但很快意識到我遇到了一個大問題。這是公開可用的開源軟體中的一個bug,可能已經有人發現了這個bug。在完全部署修複程序之前,沒有甚麼可以阻止其他人發現並利用這個bug。

那麼在最糟糕的情況下,會怎麼樣呢?假設我以我的名義以非公開的形式披露了這個bug,而其他人也找到了這個漏洞並在第二天匿名利用了這個漏洞。因為我使用我的名字進行披露,所以會有足夠的證據證明我有攻擊比特幣現金網路的知識和手段。我無法證明我不是攻擊者。然而,如果漏洞被利用,可能會造成數十億美元的損失。所以匿名是非常重要的,我認為這對我的安全是必要的。

在試圖弄清楚是否可以完全匿名披露時,我開始懷疑它是否值得我花費這麼多精力。畢竟,我沒有義務報告任何事情。但是,如果有人在比特幣核心中發現了一個同樣嚴重的bug,我會很希望這個人以盡可能謹慎和安全的方式引起我們的註意。所以我決定這樣做:假設這個bug是比特幣核心的bug,創建我想要閱讀的報告,按照我想要的標準來寫這個報告。

第一步顯而易見,我需要找到Bitcoin ABC(比特幣現金的軟體開發應用)的披露方針。 如今,處理這類問題的政策很常見,並且是任何項目的必備條件。 遺憾的是,我在其網站或代碼庫中找不到此類政策。 在向github問題跟蹤器提交錯誤時,它顯示了我能找到的最接近的內容:

呃,這沒有幫助。 然後我開始嘗試尋找已知的Bitcoin ABC(比特幣現金的軟體開發應用)開發人員發布的加密密鑰。 將消息加密將確保沒有其他人可以查看到。 雖然我無法真正驗證密鑰持有者的身份,但這種方法仍然相當安全,並且比沒有加密要好得多。

但是,我再次碰壁了。 公共PGP密鑰伺服器上沒有任何開發人員發布的祕鑰,並且他們的代碼存儲庫中也沒有密鑰。 此時,除了通過在線渠道匿名請求密鑰之外別無選擇,我使用Tor盡可能地屏蔽我的身份。

我在4月25日首次創建了一個一次性的Github帳戶,並通過那裡呼叫了一些Bitcoin ABC(比特幣現金的軟體開發應用)開發者:

謝天謝地,這起了作用! 我在大約5個小時後收到了一個密鑰,很快用它來加密詳細的問題披露。 然而,當我第二天回來檢查答複時,Github已經標記了我的一次性帳戶,可能是因為我使用了Tor。 因此,無法通過那裡進行聯繫。

通過手裡的加密密鑰,我決定嘗試最後一條大道,向Bitcoin ABC(比特幣現金的軟體開發應用)的bug追蹤器提交加密消息,再次使用Tor和一次性賬戶。 六個小時後,還是沒有收到回覆,我在他們的bug追蹤器上做了最後一次請求:

4月27日,在等了48小時之後,一次更新修複了這個bug,很顯然,他們收到了我的消息。

一點思考

我發現的比特幣現金漏洞已成功披露,且目前已經得到修補,最終沒有對比特幣現金造成明顯影嚮。但是,如果整個加密貨幣生態系統沒有從對這種bug的分析中受益,那將是一種遺憾。作為加密貨幣開發者,有必要先後退一步,重新評估我們可以使用的工具,以及我們實施的政策和程序。我們可能無法消除這些bug的威脅,但我們可以從中學習並做好準備,以便將來好好的應對。

 

原文鏈接:https://medium.com/mit-media-lab-digital-currency-initiative/http-coryfields-com-cash-48a99b85aad4