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





