Rust in Peace: Breaking Rust-based blockchains | Luis Quispe Gonzales (Halborn)
三句話摘要
基於Rust的區塊鏈安全審計:區塊鏈架構運作原理與實際漏洞案例分析。 區塊鏈安全審計需在交易生命週期的每個邊界層(Mempool、共識、執行)進行手動審查與Fuzzing,特別要關注Rust巨集、第三方序列化庫等易引發邏輯漏洞的環節。 區塊鏈各層組件邊界是攻擊面:全節點、驗證者各有獨立Mempool和狀態副本,交易在每個邊界都需驗證。許多漏洞源於某層的驗證邏輯不完整(例如沒檢查序號上界),導致後續層無法攔截。
重點整理
重點- 1
區塊鏈各層組件邊界是攻擊面:全節點、驗證者各有獨立Mempool和狀態副本,交易在每個邊界都需驗證。許多漏洞源於某層的驗證邏輯不完整(例如沒檢查序號上界),導致後續層無法攔截。
- 2
虛擬機層執行是模擬而非實時更新:執行層先在沙箱中試運行智能合約代碼,生成根哈希,只有共識層確認所有驗證者根哈希一致才會真實寫入區塊鏈。這保護了安全但也意味著每層都可能引入邏輯漏洞。
- 3
共識層負責交易順序,執行層負責優化執行:共識確定誰是Leader、交易的全局順序;執行層在尊重此順序的前提下,對不同資源的交易並行執行以優化效能。順序攻擊(如在真正付款前領取獎勵)的防線在這裡。
- 4
Rust特性(巨集、FFI、序列化庫)放大漏洞影響:serde反序列化不當會導致驗證者直接崩潰。Rust的巨集展開複雜,錯誤訊息難以調試,但用cargo expand工具可揭露真相。
實用技巧與重點
乾貨- 真實漏洞案例:
- Sui - Change Epoch批次交易繞過(執行層)
- 漏洞:系統交易change_epoch本應只由驗證者執行,但驗證函數只檢查單筆交易類型
- 攻擊方式:將change_epoch包裝在批次交易(batch transaction)中,驗證邏輯失效
- 結果:攻擊者可將儲存費和計算費改為0,導致所有交易免費
- Rollup - 高序號交易免費(Mempool)
- 漏洞:Mempool驗證序號時,只檢查「序號 < 當前序號」會拒絕,但不檢查「序號太高」
- 攻擊方式:發送1000筆序號為1000的交易,驗證者無法在Mempool阻擋,發送到執行層才被丟棄
- 結果:攻擊者0費用發送1000筆交易→驗證者消耗資源計算→DDoS整條鏈
- Sui - 反序列化漏洞(Mempool)
- 漏洞:serde反序列化函數當遇到預期外的字段時,只回傳錯誤但不崩潰;當字段值為true時,觸發panic
- 攻擊方式:在交易結構中加入非預期字段並設為true,發送給驗證者
- 結果:單筆交易導致驗證者停止服務;100筆交易可癱瘓整個區塊鏈
- 工具與技術:
- Rust序列化庫:serde(超過800,000人使用)
- 虛擬機層:Aptos用Move BM、Casper用WebAssembly BM、Sui用Move VM
- 共識機制:Aptos用HotStuff BFT
- 調試工具:cargo expand(展開Rust巨集)
- 測試框架:fuzzing
- 架構組件術語:
- Full Node(全節點):任何人可運行的區塊鏈副本,作為relayer角色
- Validator(驗證者):需質押代幣、參與共識與交易執行的節點
- Mempool:臨時儲存未確認交易的內存池或磁盤存儲
- Merkle Tree:確認交易是否在區塊內的高效驗證結構
- Root Hash:執行層模擬執行後產生的狀態根,驗證者間用此判斷是否達成共識
- Shard(分片):Casper中區塊鏈的切片,各自產生獨立的root hash
結論
結論“區塊鏈安全審計需在交易生命週期的每個邊界層(Mempool、共識、執行)進行手動審查與Fuzzing,特別要關注Rust巨集、第三方序列化庫等易引發邏輯漏洞的環節。”
完整解析
詳細Luis K Gonzalez來自Halor安全公司,擁有13年多語言開發經驗,最近4年專注Web3安全審計。他透過一個虛擬人物Alice的故事,完整講解了基於Rust的區塊鏈交易生命周期。
Alice決定向流動性池投入資金以賺取獎勵。當她提出領取獎勵的交易(第14筆)時,背後經歷了複雜的多層次驗證過程。首先,她的錢包客戶端構建交易,包含公鑰、簽名和交易數據(地址、payload、Gas費用)。交易被發送到全節點,全節點維護區塊鏈的完整副本,任何人都可運行。全節點不直接執行交易,而是先進行基本檢查(語法、餘額、費用),再將交易加入Mempool(臨時儲存區)。
全節點作為relayer角色,將交易轉發給驗證者。驗證者也維護區塊鏈副本,需要質押大量代幣才能參與。驗證者之間透過Mempool共享協議交換交易,最終所有驗證者的Mempool都含有同一筆交易。接著進入共識層,驗證者選舉出該輪的Leader(選舉標準因共識機制而異)。Leader負責決定Mempool中哪些交易進入區塊,以及它們的順序——這個順序至關重要,因為交易的執行結果可能相互依賴,順序錯誤會導致邏輯漏洞(如在實際轉帳前領取獎勵)。
共識達成後,執行層接手。執行層尊重共識層決定的交易順序,但會對作用於不同資源的交易進行並行執行以優化性能。執行層調用虛擬機層(Aptos用Move BM、Casper用WebAssembly)實際運行智能合約代碼,應用所有權驗證等規則。關鍵點是,此時區塊鏈狀態尚未真實更新,而是在沙箱中模擬。虛擬機執行後,執行層將交易雜湊追加到Merkle樹(每個交易一個雜湊,逐級合併直到得到Merkle根),Merkle根被加入區塊頭。更重要的是,執行層生成根哈希(root hash),代表區塊鏈的整體狀態。不同區塊鏈生成方式不同:Aptos只生成一個,Casper為各分片各生成一個。
執行層將根哈希資訊發送回共識層,共識層與其他驗證者的共識層通訊,確認所有驗證者執行後得到相同的根哈希。若一致,共識層信號執行層執行最終的區塊鏈狀態寫入,儲存層永久記錄。此時Alice的獎勵被扣除,代幣從合約轉到她的帳戶。
從安全視角,Alice、她的客戶端、全節點、驗證者任何一方都可能惡意。區塊鏈安全的最後防線是保護驗證者各層組件的完整性。Halor團隊發現的三個真實漏洞揭示了防禦的薄弱環節。第一個是Sui的Change Epoch系統交易繞過:該交易本應由驗證者單獨控制費用參數,但驗證邏輯只檢查單筆交易類型,未考慮批次交易包裝。攻擊者將Change Epoch放入批次交易,驗證邏輯失效,成功將儲存費和計算費改為零。第二個是Rollup的高序號免費交易:Mempool在驗證序號時,只拒絕序號小於當前值的交易,但未檢查序號過高的情況。攻擊者發送1000筆序號為1000的交易,全通過Mempool驗證,在執行層才被丟棄。由於執行是耗資源的,驗證者每筆都要計算,攻擊者0成本導致驗證者資源耗盡(DDoS)。第三個最嚴重的是Sui的反序列化漏洞:serde庫的反序列化邏輯,當交易結構包含預期外的字段時,如果該字段值為true,會觸發panic導致驗證者停止。攻擊者只需單筆交易即可使單個驗證者宕機,100筆交易可癱瘓整條區塊鏈。
關鍵時刻
Pipeline v2帶時間戳的重點,會在逐字稿層級分析上線後產生。目前請先透過原始影片觀看。
事實查核
Pipeline v2說法查證是下一次管線升級的一部分。KeyFrame 只會顯示它真正能驗證的內容。

