3月19 日凌晨,有社羣使用者反饋 Filecoin 主網存在雙花風險,幣安、OKex 等交易所均已關閉 Filecoin 主網代幣 FIL 的充值功能,Cobo Custody 也第一時間暫停了 FIL 的充值和提幣。
Cobo Custody 技術團隊對此次 Filecoin 安全事件保持高度關注並進行了詳細覆盤:
Filecoin 「雙花」始末
據 Filfox 和 FileStar 的 Filecoin 礦工反饋,週三幣安遭遇了價值數百萬美元的FIL雙花充值攻擊。
起因為有一筆61,000 FIL(約合460萬美元)的交易所入賬花費了太長時間,於是Filfox 和 FileStar 礦工為了加速而發起了一筆 RBF 交易。而該筆 RBF 交易導致幣安賬戶兩次入金,最終入賬 120,000 FIL。事後,Filfox和FileStar開發者迴應稱,Filecoin 的 RPC 程式碼裡存在“嚴重的漏洞”。該漏洞導致幣安在看到兩筆有衝突的交易後,選擇了同時入賬。
FilFox和FileStar開發者已經第一時間聯絡了幣安,並在第一時間通知了Filecoin官方。
幣安、OKex 等交易所均已關閉 Filecoin 主網代幣 FIL 的充值功能,Cobo Custody 也第一時間暫停了 FIL 的充值和提幣。
技術細節覆盤
交易所和中心化錢包等中心化託管機構會依據鏈上的轉賬行為給使用者入賬,因此如何高效、準確、及時的解析鏈上的轉賬行為是非常關鍵的,常見的做法是先獲取某個區塊內的所有交易ID,然後基於交易ID獲取對應的交易內容和交易執行結果。
Filecoin lotus 節點提供了多個API用於鏈上交易的獲取,例如 ChainGetBlockMessages 可以獲取指定區塊內的所有交易內容,StateGetReceipt 可以獲取指定交易ID對應的執行結果,此次被攻擊的交易所就是採用這兩個 API 來進行鏈上轉賬行為的解析,並基於此為使用者入賬。
不過他們沒有注意到,StateGetReceipt 介面有個比較不符合常規邏輯思維的設計,就是在獲取指定交易ID的執行結果時,如果這筆交易已經被 RBF(replace by fee),則會返回最終 RBF 成功的那筆交易的執行結果,並且在返回值裡沒有任何的提示表明這筆是 RBF 後的交易的執行結果。
假設攻擊者首先傳送了 TX1,對應的交易ID 為 TXID1,隨後攻擊者對 TX1 進行了 RBF,生成 TX2,對應的交易ID 為 TXID2,最終 TX2 上鍊成功。此時透過 StateGetReceipt 對 TXID1 和 TXID2 分別查詢,都能得到執行正確的結果。
攻擊行為發生後,Filecoin 官方開發人員對 API 進行了補充說明,明確了 StateGetReceipt 的返回邏輯,並將在 v1 版本後廢棄此 API
https://github.com/filecoin-project/lotus/pull/5838/files
Cobo Custody 技術團隊在對接 Filecoin 的過程中已經發現了上述問題,因此沒有采用 ChainGetBlockMessages 和 StateGetReceipt 來獲取鏈上的轉賬行為,而是採用 ChainGetParentMessages 和 ChainGetParentReceipts 來獲取已經成功上鍊的交易,從而從根本上避免了被雙花充值的風險,因此未受此次雙花充值攻擊的影響。
在使用 ChainGetParentMessages 和 ChainGetParentReceipts 的過程中,Cobo Custody 技術團隊發現 lotus 節點的一些返回值也並不是很符合常規邏輯思維,例如對於空塊的處理是有一些問題的。Cobo Custody 技術團隊對此做了妥善的安全處理,在此也提示其他中心化託管機構需要仔細檢查相關的對接程式碼,避免其他的雙花充值攻擊行為。
雙花(Double-spending)即使用上一次交易的代幣,再次進行交易,進而導致產生虛假交易。
2018 年比特幣黃金 (BTG) 就曾受到一名礦工的惡意攻擊,該礦工臨時控制了 BTG 區塊鏈,在向交易所充值後迅速提幣,再逆轉區塊,成功實施雙花攻擊。此次攻擊者竊取超過 388200 個 BTG,價值高達 1860 萬美元,也是區塊鏈史上最著名的雙花攻擊之一。