越來越扁的比特幣 ( Bitcoin):何謂交易延展性?

比特幣( Bitcoin)最近幾個星期的狀況相當不妙。Mt. Gox 因為交易延展性的問題而停止提現作業。據稱,過去也曾有人利用同樣的漏洞從 Silk Road 2.0 深層全球網路 (Deep Web) 市集洗劫了 4,000 多個比特幣 (市值約 270 萬美元)。這次的事件,再加上其他一些原本就已動搖比特幣社群信心的事件,讓比特幣的價格狂跌到將近 600 美元,比高峰時期的 1,200 多美元大幅暴跌。

地下經濟/美金/錢

所以,何謂交易延展性?為何它會對比特幣造成這麼大的影響?

假設,我要付你一張面額 25 美元支票,支票號碼為:700。若你知道我都是用支票號碼來記帳,你也能對我發動所謂的交易延展性攻擊。

當你收到我的支票時,您可以修改支票號碼,例如在末尾加一個「1」,此時號碼就變成了「7001」(為了舉例說明,我們假設銀行不會發現)。更改支票號碼本身並不會影響交易的金額。接下來你就等著兌現,然後跟我說你沒收到支票。

如果我現在去查看銀行帳戶,我會看到一張號碼為 7001 (而非 700) 的支票。若我又寄一張新的支票給你,那你就多賺到一張支票,等於可以兌現兩次。就算我不寄新的支票給你,你還是握有舊的支票,照樣可以兌現。

這就是比特幣交易延展性漏洞的基本概念。

現在假設有兩個人:Alice 和 Evan。Alice 打算支付 Evan 一些比特幣。但 Evan 想利用比特幣來詐騙 Alice。當 Alice 將交易送到比特幣網路時,這筆交易會使用一個雜湊碼來作為識別。雜湊碼當中有個欄位叫作 ScriptSig

這個簽章欄位用於驗證該交易中花掉該比特幣的來源端。此類簽章是以一種叫作 DER的格式編碼。這是一種相當簡單的格式,包含類型、長度、資料內容。其中一種類型是「0」或是空白或者無資料。如果駭客在 DER 中多加了一個或幾個「0」,這交易的簽章仍然合法,但交易的雜湊值將會不同。

Evan 先查看比特幣網路來查詢Alice 給他的交易。當他找到時,他便複製並加以編輯,讓雜湊值改變。由於Alice 對網路發出了多次這筆新的交易。如果幸運的話,Evan 所修改過的交易就會取代合法的交易,成為交易區塊鏈 (block-chain) 上的區塊。Evan 一旦得逞,Alice 的交易就會遭到退回,因為該比特幣已經被花掉了。

如果 Alice 僅用交易代碼來記帳,那她就會看到她的交易失敗,此時若有自動化系統再重新送出一次交易,接下來會發生的事你已經知道。如果 Evan 並未得逞,他就僅獲得最初的比特幣,但若是得逞,他就會獲的雙倍的金額。

儘管這聽來相當嚇人,但還比不上一套精心設計的支付追蹤系統。這個漏洞並不在比特幣本身,而是在於交易所與商家的付款記帳方式。雜湊碼不應當成比特幣使用者唯一的交易識別方式,因為它很可能遭到篡改。儘管如此,某些交易所和商家已經做了一些修正來確保簽章值的唯一性。

切記務必等候交易確認之後再認定交易完成,以免發生類似前述「重複付款」的情況。除了根據交易雜湊碼來確認交易之外,還需參照交易的來源位址。

原文來源:Flattening Bitcoin: What is Transaction Malleability?

作者:Ben April (資安威脅高級研究員)