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