比特幣最嚴重的漏洞是如何發(fā)現(xiàn)的?
Bitcoin Unlimited是比特現(xiàn)金的主要客戶之一,該公司的一名匿名開發(fā)者透露,他是如何在過去八年中發(fā)現(xiàn)比特幣最嚴重的漏洞的。
作為證據(jù),他發(fā)現(xiàn)了這個漏洞,Awemany時間戳了哈希(如圖),并進一步與PGP密鑰簽署了協(xié)議,用于對比特幣核心和其他項目進行負責的披露。我們會在下文詳細引述有關部分:“我當時正在努力在Bitcoin Unlimited客戶機上實現(xiàn)新的CHECKDATASIG/-VERIFY操作碼,該操作碼將在11月啟動比特幣(Cash)。我一直在研究這些工具的潛在的巧妙的用例,并且有動機去完成這項工作。
大約中午時分(9月17日,星期一),我注意到在ABC的簽名運算和比特幣無限的(BU)的數(shù)字運算方式上存在著很大的分歧。早些時候,我和BU團隊達成了一致,我將把大部分CDS/-V文件從ABC移植過來,但我感到不堪重負。我的想法是:好吧,這是可行的,但這需要更多的分析,也需要更多的訪客來評論。而且需要更長時間。嘆氣。同時,我在ABC代碼庫中偶然發(fā)現(xiàn)了這個注釋:
//檢查重復的輸入 —注意這個檢查很慢,所以我們在檢查快中跳過它。
我的第一反應有點兒,呃,怎么回事?還在說那個評論嗎?然后,我查找了ABC中CheckRegularTransaction的用法,它是在Core(核心)中重命名的CheckTransacTIon的變體(但是我當時不知道。我翻遍了代碼,試圖理解其中的邏輯。
我注意到,塊驗證跳過了這個測試,因為它被假定已經(jīng)在內(nèi)存池入口發(fā)生。我的下一個想法是有點下沉的感覺和一個‘啊哦,我真的希望ABC的人們已經(jīng)考慮了記憶池和塊傳輸之間的區(qū)別,并且這些是進入系統(tǒng)的獨特方式。這里可能有問題!”然后我想出了一個測試這個的方法。我修補了一個ABC節(jié)點,使其在-regtest模式下即使被請求并連接了一個未匹配的和一個補丁的節(jié)點,也不中繼交易,并創(chuàng)建一個帶有重復輸入的交易(上面的測試跳過了這個交易)。
哇!斷言(),中止…
我打開了致deadalnix(BitcoinABC維護者)的電子郵件,開始想到:‘好吧,實際上,這些東西是從哪里來的,什么時候從哪里來的,他們把它引入到代碼中,我們可能很幸運,但這還沒有發(fā)布嗎?’
然后我注意到這些東西是來自核心的。我已經(jīng)寫了一份披露報告,重新檢查了核心是否也很脆弱。
再一次,哇!斷言(),中止…
作為一個負責任的公民,我隨后給Wladimir(比特幣核心維護者)、sickpig(Bitcoin Unlimited開發(fā)者)和其他一些人寫了一封加密的公開郵件,附上了ABC和核心補丁的一個變體來利用這個問題來揭露我的信息?!?/p>
根據(jù)以上,只要看一眼代碼就能發(fā)現(xiàn)這個錯誤,BU開發(fā)者似乎從看12PM到在2018年9月17日下午14:47PM發(fā)郵件給其他開發(fā)者。
因此,一系列事件似乎表明,取消雙重支出檢查是一件相當大的事情,而且?guī)缀跏橇⒏鸵娪啊?/p>
即使是一個非程序員,你可能也會想到一些東西,這就提出了一個問題:當5個比特幣核心的開發(fā)者批準這個錯誤時,他們到底在想什么?
這是因為這個錯誤并不微妙或復雜,但它是如此的簡單,只要看一眼就可以看出,根據(jù)上面的描述,取消雙倍支出檢查是一個相當大的問題。
這就提出了一個問題,即這個錯誤是如何精確地把比特幣打印出來的,而比特幣本來可以被礦工用稀薄的空氣進行打印的,但它最終卻被寫入了代碼。
據(jù)我們所知,這也對Blockstream可能存在的利益沖突提出了問題,即地雷問題。提出這個明顯錯誤的開發(fā)人員當時正在為Blockstream工作,而批準它的兩個開發(fā)人員也是如此。
對于比特幣核心的代碼是否正在接受充分的審查,還需要提出進一步的問題。這是因為,如果非比特幣Core的開發(fā)者對漏洞一目了然,但仍然能夠進入,那么很明顯,評審過程已經(jīng)失敗了,而且非常糟糕。
值得慶幸的是,現(xiàn)在存在一些競爭,比特幣核心的科里·菲爾茲(Cory Fields)之前在ABC上發(fā)現(xiàn)了一個漏洞,這是個嚴重的問題,但比這嚴重得多,因為它沒有考慮到“有效”的雙倍支出。
在辯論最激烈的時期,一些比特幣公司的態(tài)度不那么友善,做出了非常不負責任的行為,這導致了比特幣無限使用的漏洞。
Awemany并沒有回報他的支持,而是進行了非常負責任的披露,這導致比特幣生態(tài)系統(tǒng)的大部分快速升級。
到目前為止,礦商和企業(yè)可能已經(jīng)升級,但在編寫本文時,仍有數(shù)千個節(jié)點仍然容易受到通脹風險的影響。
在這種情況下,會向節(jié)點發(fā)送警報,要求它們快速升級。這樣的警報系統(tǒng)被刪除了,即使它只是在節(jié)點屏幕的角落說一些類似于你應該升級的東西,就像你已經(jīng)發(fā)現(xiàn)了一個錯誤一樣,可以在一些鏈接中讀到更多的內(nèi)容。
警報本身不會以任何方式干擾代碼節(jié)點的運行,如果發(fā)出了錯誤的警報,其他開發(fā)人員可能會將其覆蓋。所有的警報都是通知節(jié)點操作員,然后節(jié)點操作員就可以自己作出決定。
現(xiàn)在,節(jié)點操作員必須檢查加密媒體或crypto twitter,如果他們在新聞發(fā)布期休假,那么他們可能會認為它們的bugy節(jié)點沒有什么問題。
由于Awemany的披露,對于那些已經(jīng)升級的人來說,這是一個更安全的節(jié)點。為此,在撰寫本文時,他獲得了價值200美元的0.03BTC捐款。比特幣現(xiàn)金支付者已經(jīng)慷慨了很多,給他寄去了將近36BCH的捐款,價值17000美元。
然而,這些開發(fā)者不應該依賴他人的善意,因為考慮到風險有多大,應該會有漏洞獎金。然而,比特幣核心和比特幣現(xiàn)金的客戶似乎都沒有這樣的漏洞獎勵,這可能意味著開發(fā)者并沒有太多動力來揭露這些漏洞,因此這也許是為什么比特幣在直播代碼中保留了兩年的原因。