關於重複計數漏洞的事後檢討

這篇文章要來談重複計數(multiple counting)的漏洞,其包括了兩個變種。這篇文章的目標是對上述的漏洞提供完整的細節,解釋這是如何被用來攻擊線上服務、商家與交易所,並且 Monero (開發)社群是如何處理這個漏洞。

重複計數漏洞的兩個變種存在於子地址(subaddress)功能中,這功能用了個不同的交易金鑰程式碼架構。第一個漏洞的變種簡單來說就是沒有對重複的公鑰進行檢查,因此攻擊者可以重複將同份交易公鑰包含在交易中,這結果導致了接收者的錢包會回報收到了x倍於其真正收到的的交易數量(x是代表收到幾次交易金鑰的一個整數),所有用來回報收到交易的指令(如show_transfers (CLI), get_transfers (RPC))都被此漏洞影響。但是餘額並沒有受到影響,錢包依舊會回報正常的資金餘額。可惜的是,大多數的交易所都是利用 get_transfers 或 get_payments RPC指令在運作,因此重複的交易公鑰將會導致計算出錯誤的金額。

不幸的是,這個漏洞的變種非常容易被使用,攻擊者可以輕易的利用在 src/cryptonote_core/cryptonote_tx_utils.cpp 中的 add_tx_pub_key_to_extra(tx, txkey_pub) 來附加重複的交易公鑰。實際上的運作如下: 攻擊者在 src/cryptonote_core/cryptonote_tx_utils.cpp 中附加了譬如三次的金鑰,因此在他的交易中就會出現四筆相同的交易公鑰。這導致了當攻擊者將一筆 1 XMR 的交易發送至目標交易所的時候,交易所很有可能就會計帳給攻擊者 4 XMR 的餘額,於是攻擊者就可以領出4 XMR的資金而惡意盜取了交易所 3 XMR 的資金。若交易所沒有進行對餘額與進出交易金額的核對或檢查熱錢包的異常狀況,那麼攻擊者基本上可以重複上述攻擊直到交易所的熱錢包被領空或更慘的是到整個交易所的資金耗盡為止。

本漏洞的第二個變種,在 HackerOne 上有完整的報告,原理是程式碼沒有對假冒的交易公鑰進行檢查。因此攻擊者可以利用變造後的交易公鑰欺騙錢包使其將交易輸出計算為實際收到的兩倍,而與第一個變種類似,錢包餘額並不會受到此漏洞影響。 本漏洞的第一個變種最早是在 GitHub 上被提出並迅速地在這份 PR 中被 moneromooo 修正。 不幸的是,這個漏洞的嚴重性被低估,直到 (i) 一個交易所的 Monero 分叉幣被利用此手法攻擊 (ii) 在 HackerOne 上的一位資安研究員(jagerman)提供了完整報告關於如何利用此漏洞竊取交易所資金。而漏洞的第二變種是由 HackerOne 上的 phiren 所提出,並也被快速的在此份PR中修正。兩份修正都已由 fluffypony 合併在 v0.12.3.0 的發布版本中。

在 v0.12.3.0 定版之後,筆者(dEBRUYNE)與其他開發者們私下地盡可能通知了所有的交易所、線上服務、與商家。但顯然這不是個最好的方法: (i)這不可避免地排除了與我們沒有聯絡管道但又是 Monero 生態中重要的對象。(ii) 這可能導致差別待遇的觀感。此外,這個漏洞消息應該要於公開地郵件列表中發布,但可惜的是並沒有,我們應要能從這樣的疏忽中記取教訓。我們是一個 Monero 的社群,應該要找出一個更順暢的資安弱點處理流程(譬如回報重要漏洞給交易所、線上服務與商家的的流程),一個只提供給交易所、線上服務與商家的”祕密”郵件列表或許符合這個概念。加上需要一些繁瑣的認證程序或許會比公開的郵件列表安全,因為聰明的攻擊者會毫不猶豫地訂閱這份郵件列表。

總而言之,在錢包中的一個重要漏洞,在初期被低估其嚴重性,導致在攻擊者得以在 Monero 生態中的竊取交易所的資金。幸好,這個漏洞僅限於影響錢包軟體中的計帳功能,而在交易協定和貨幣發行量上沒有受到影響。我們必須在此次事件中記取教訓去改進使我們在未來遇到類似漏洞時能夠阻緩其帶來的影響。此外,這個事件也是一個重要的提醒,加密貨幣與其軟體都還是在發展中階段,容易出現(重大)漏洞。因此對於提供服務的單位,盡可能納入完整性檢查是比較好的(替如檢查交易總和是否吻合真實帳戶餘額),此外,Monero 開發社群也正在研究加入這類核對功能至 RPC 錢包中的可行性。

註記: 1. 一份包含著50份相同交易公鑰的交易範例: (01ede13f013833f8aef14a9397b83fd5171833ab55bc480104dd6ba86ca8f13558) 可以在此查看這份交易內容。

本篇消息譯自核心開發團隊網站: https://getmonero.org/2018/09/05/a-post-mortum-of-the-multiple-counting-bug-2018-09-05.html

開發者會議紀錄 DevMeeting 20180826

  • 下次分叉的日期暫訂為2018年的10月18日
  • SChernykh已貼出了CrptoNight-v2最後的更動
    • 即將要合併入程式碼
    • 這將會是分叉後的新Proof of Work協定
  • 最終版的防彈協定即將要合併
    • 不確定是否會納入數個可以加速程式速度的程式碼修正
  • Endogenic 的LightWallet pull request需要幫忙審閱
  • ph4r05 提交了一些初步的程式碼來支援Trezor的硬體錢包
  • 一旦新防彈協定和CryptoNight-v2的合併入主程式碼後,testnet的區塊鏈將會重組並會需要一些測試者
    • 預計下禮拜開始,最早禮拜二。
  • GUI在分叉前可能還是會有個v0.12.4.0的更新發布
  • 讓Monero可進行重現編譯(reproducible builds)的工作持續進行中,正在徵求額外的協助
  • 下次開會時間是2018年9月9日

    繼續閱讀...

開發者會議紀錄 DevMeeting 20180729

  • 已收到所有防彈協定的審查結果了
    • 未發現明顯的問題
    • 並得到一些最佳化上的建議
    • 所有跡象都顯示防彈協定將可以被排入下一次的協定升級中
  • vtnerd 研究msgpack應用在monero上的編碼已有一段時間,預計將可與json做為並行方案
    • msgpack是編碼/解碼速度普遍較純JSON快的二進位通訊編碼
  • vtnerd 將會繼續處理ZeroMQ(0MQ)的實作
  • MoneroMooo 開發出了一個區塊鏈的分析工具來計算交易輸出來源的基數(the cardinal of an output’s ancestry)
  • 還有一大堆GUI的工作仍舊持續在進行中
  • hyc正在測試新的PoW運作方案-randomJS已經用C++改寫,且正在Wownero中測試
  • 下次會議將於8月12日舉行

    繼續閱讀...

開發者會議紀錄 DevMeeting 20180715

  • Monero v0.12.3 CLI命令列介面版本錢包已發布
  • Monero v0.12.3 GUI錢包
    • 已標記發布版本號並由Fluffy編譯發布
    • 此版本將開始原生支援Ledger硬體錢包
    • 0.12.3版發布之後,後續的重要目標將是改善使用者體驗
    • 亦將開始開發安卓和iOS系統原生支援的版本
    • 若任何人對套件打包有興趣,請與dEBRUYNE聯繫
  • rbrunner 持續開發Monero訊息系統中
    • endogenic 表示他們打算做出類似OpenMonero的東西
  • Oneiric 正在處理 Kovri的SSU(加密的UDP封包)
  • endogenic 成功的把Monero原始碼轉譯(transpiling)成Javascript了(透過wasm)
  • vtnerd 預估Lightwallet的起始/測試用伺服器的實作PR將會在今日(7/15)上傳
    • 隨著進度的推展將會有許多次較小的程式碼上傳
  • 可能將會有個小版釋出(0.12.3.1 或 0.12.4)來修正會隨機閃退的問題
  • 若你對學習嵌入式硬體的開發有興趣,請聯繫msvb-lab。該硬體團隊開發出了一款徽章,將會在今年的世界駭客大賽上亮相,這是個很好的入門學習機會。

    繼續閱讀...

開發者會議紀錄 DevMeeting 20180617

開發者會議紀錄 DevMeeting 20180520

繼續閱讀...

開發者會議紀錄 DevMeeting 20180506

  • MRL小組
    • 正在研究退款交易攻擊的迴避方式。
    • Kudelski跟QuarksLabs已開始進行防彈協定的審查工作。Kudelski預計七月中會完成。
    • Benedikt的防彈協定審查預計將於5/21開始並於6/4結束。
  • GUI
    • 已解決Linux使用者會遇到”bad_cast”問題
    • Stoffu改善了一些使用者遇到的頓挫問題
    • Stoffu也提升了一些節點的連線能力與穩定性
    • Windows GUI沒有適當備援圖形庫的問題已解決了
    • dsc正在改善狀態指令與接收款項的頁面
    • 預期v0.12.1版會有妥善的Windows安裝程式
      • 程式安裝位置還在討論中
      • 會加入小圖示來讓使用者較容易找到程式日誌與節點目錄的確切位置
  • Monero硬體/官方硬體錢包
    • 開發者電路板的取貨稍微有些延遲
    • 正式外殼設計的募資上線了
    • 預計可以在DefCon上看到具有NFC功能的測試版本
    • Pursim已找上Monero團隊並開始了進一步的合作-尤其是硬體錢包的團隊
  • v0.12.1版預期會在5/9完成, “可能“會是測試版
    • 會提供更容易使用Ledger 硬體錢包的方式
    • 只要是用CLI產生的錢包,都可以透過GUI在Ledger硬體錢包上存取
  • 付款ID的汰除工作持續進行中。先暫時轉用整合型地址,長遠的目標是以子地址功能取代。

繼續閱讀...

開發者會議紀錄 DevMeeting 20180422

  • v0.12.1 的一些更新項目
    • GUI開發者們正在處理 v0.12.1的(std::bad_cast)的bug
    • GUI錢包重新支援 OpenAlias
    • 將有Linux Wayland 桌面系統的暫時解決方案(強制使用XCB)
    • Windows的GUI將會使用ANGLE與MESA的圖形庫做備援
  • 新的Monero Ecosystem/專案: https://github.com/monero-ecosystem/meta
  • iOS的MyMonero 已經在TestFlight上測試
    • 若你有興趣參與在TestFlight的測試,請聯絡endogenic以加入測試人員排隊名單
  • hyc 正在測試全新Proof of Work演算法的Proof of Concept
  • MoneroMooo在努力提升錢包刷新的效能表現
  • 開發團隊正在想辦法調整錢包來讓使用者更容易就能夠注意到是否在官方的主鏈上
  • Monero官方硬體錢包(開發者版本, “Breakneck”)已經開始測試了
  • 下次開會日期為5月6日

繼續閱讀...

開發者會議紀錄 DevMeeting 20180318

  • 為了讓測試所有新功能的時間更充裕,Monero的發布時間推遲到4月6日附近: https://github.com/monero-project/monero/pull/3424
    • 0.12版版名為”Lithium Luna”
    • 預計會在本周被tag上正式版本號並準備好提供測試
  • 0.12版的重要功能
    • 多重簽名(Multisig)
    • 子地址(SubAddresses)
    • 將預設環簽(Ring)數量從五提升到七
    • 為了對抗ASIC而微調了Proof of Work演算法
    • Ledger硬體錢包的初步功能支援
    • 金鑰映像攻擊緩解措施
  • 官方GUI錢包的暗色系佈景主題應當在本周會完成

繼續閱讀...