漏洞描述
在2018年4月26日上,Bitcoin-ABC 的開發(fā)者被不明身份的人告知牧牢,當前
Bitcoin-ABC 0.17.0
版本存在漏洞。如果被利用,這個漏洞會導致 Bitcoin Cash 網(wǎng)絡意外分裂录平。
對于此漏洞的描述大致如下:
攻擊者會構造一個被
Bitcoin-ABC 0.17.0
版本所接受并且能夠打包進 block 的惡意交易。 這個 block 將被其他相互兼容版本的 Bitcoin Cash 實現(xiàn)拒絕缀皱。 惡意交易的 signature hash 類型中的0x20的比特標志位會被設置斗这。
漏洞分析
在 commit c3804927eb8a中,他們重構sighash類型測試來檢查交易簽名中可能存在的每個值啤斗。
通過上圖表箭,我們可以分析得出:之前是& 0x1f
, 但是構造出個交易的sighash是0x20就會不通過钮莲。
在 /src/script/interpreter.h
文件中有如下定義:
/** Signature hash types/flags */
enum {
SIGHASH_ALL = 1,
SIGHASH_NONE = 2,
SIGHASH_SINGLE = 3,
SIGHASH_FORKID = 0x40,
SIGHASH_ANYONECANPAY = 0x80,
};
通過分析他們的測試用例免钻,我們可以猜想到:寫這個程序時之前假設了sighashtype的范圍是0~0x1f, 但現(xiàn)在實際現(xiàn)在可能出現(xiàn)的是0~0xff崔拥, 有可能是后來情況擴展了极舔。基于前一個假設時链瓦,像判斷一個sig hash的基本類型拆魏, 之前是用的sighash & 0x1f。但是如果一個sighash是0x21時會被判定為是SIGHASH_ALL
慈俯,可以猜想到這個地方只想過濾出0x01, 0x02, 0x03這三種情況渤刃。
從二進制的層次我們繼續(xù)分析:0x1f = 0b00011111、0x21 = 0b00100001肥卡、0x3f = 0b00111111溪掀。右邊數(shù)第6位&0x1f每次都會是0,如果左邊的3位無效了步鉴, 實際應該是被過濾掉的揪胃。同理0x20的sig hash也會有問題璃哟。在0.17.0 版本時,校驗位是 0x1f喊递,在 0.17.1 版本更新為 0x3f随闪,以前0x21 & 0x1f = 1, 0x01 & 0x1f也是1。但改成3f骚勘, 0x21 & 0x3f就不在有效范圍內(nèi)了铐伴, 被過濾掉了。所以 0.17.1 這個版本主要修復了0x20的問題俏讹。
abc team對此漏洞的處理
在分析了漏洞和可能的響應后当宴, Bitcoin-ABC 開發(fā)人員為此漏洞準備了一個補丁,并發(fā)布了一個私有版本泽疆,以便直接分發(fā)給礦池運營商户矢。 由于挖礦社區(qū)的分散性,不可能直接與每個人取得聯(lián)系殉疼。 提供此版本是為了驗證Bitcoin Cash礦工在升級后轉發(fā)給值得信賴的礦工梯浪。
我們建議任何比特幣ABC 0.17.0用戶盡快升級到最新版本。
致謝
冰山瓢娜,隸屬 Meowww Security挂洛,比特大陸安全風控技術負責人。
余弦眠砾,慢霧科技聯(lián)合創(chuàng)始人虏劲。
本文由比特大陸風控部&慢霧科技
聯(lián)合編寫!
家境清寒荠藤,整理不易伙单。