技術解析台灣交易所BitoPro駭客攻擊

重演2014年的 Partial Payment 漏洞利用,罪咎誰當?

背景

台灣加密貨幣交易所 BitoPro 於台灣時間2019年4月28日上架 Ripple 瑞波幣(XRP)開放交易,並於台灣時間2019年5月1日遭到駭客利用 Partial Payment 特徵進行漏洞攻擊,可能損失約200萬台幣 (根據 BlockTempo官方說明)

漏洞在哪?

漏洞來自於 Ripple 支付的特別功能

Ripple 早期推出多種有別於傳統支付 (Payment) 的交易格式,包含非默認路徑支付 (NoDirectRipple)、部分支付 (PartialPayment)、限定匯率支付 (LimitQuality),並採用特定的支付標籤 (Transaction Flag) 作為標記:

https://developers.ripple.com/payment.html#payment-flags

部分支付:容易忽略的危險設計

部分支付的目的主要用於回彈所有目的未知的付款 (Bouncing Payments),有點類似於以太坊智能合約常見的 fallback-revert 功能:

function () {
revert();
}

對 Ripple 而言,一般常見的支付交易 (Payment) 格式如下:

{
"TransactionType" : "Payment",
"Account" : "rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn",
"Destination" : "ra5nK24KXen9AHvsdFTKHSANinZseWnPcX",
"Amount" : {
"currency" : "USD",
"value" : "100",
"issuer" : "rf1BiGeXwwQoi3Z2ueFYTEXSwuJYfV2Jpn"
},
"Fee": "12",
"Flags": 2147483648,
"Sequence": 2,
}

上面的 Amount 欄位用來紀錄此筆紀錄總共涉及多少價值。

而特殊的部分交易 (Partial Payment) 格式則會多出一個欄位 delivered_amount,並取代原先 Amount 來紀錄真正涉及的價值。

"delivered_amount": {
"currency": "USD",
"value": "1",
"issuer": "rf1BiGeXwwQoi3Z2ueFYTEXSwuJYfV2Jpn"
}
也就是說,如果交易所或任何機構在接受 Partial Payment 時忘記使用新欄位 delivered_amount,而仍然使用舊的 Amount,就有機會受害…

攻擊發生了

駭客使用部分支付進行攻擊

根據 XRPSCAN 上這筆對 BitoPro 的存入支付,可以看出攻擊者將 Amount 設定在 330,000 XRP (約330萬元台幣),不過實際支付的金額只有右側 Delivered 欄位的 0.003255 XRP (約0.03元台幣),甚至低於此筆支付的手續費 0.005 XRP。

706E3FEC8F44CECB6E85FBE749AD5BC4C9C50BA75A280DCCD211696BE17F64B4

若 BitoPro 接受此轉帳並讀取 Amount 作為存入金額,則駭客將憑空製造330萬元台幣,而這筆錢由誰買單?…就將會是交易所自己。

漏洞無人知曉?

2014年Justcoin交易所遭駭

2014年10月8日挪威的 Justcoin 交易所遭到駭客利用部分支付漏洞攻擊。

Stellar 已改善此功能

源自於 Ripple 設計的恆星幣 Stellar 因具有與 Ripple 同樣的部分支付設計,但在觀察到其帶來的實作風險時,已在Justcoin遭駭後三天內改善此功能

Ripple 持續使用此功能

部分支付是個特徵而不是個錯誤。

“It is not a bug. It’s a feature.”

只能由官網上看到幾篇提醒使用者的說明:[1] 與 [2]。

今後如何預防

作者為大家開設的 Hahow X UC Berkeley 線上區塊鏈課程

來啦現在快半價誒:https://hahow.in/cr/berkeley
以上技術解析如有建議,歡迎大家主動指出。
作者對 BitoPro 是100%支持,也希望他們能夠安全平穩的度過這個難關,台灣的區塊鏈生態大家一起加油!:)