返回部落格

Solana 網路重大漏洞的發現與即時修復過程

Code Auditing
2022年6月7日
閱讀約 6 分鐘

四月,我們的漏洞檢測系統在 Solana 的 rBPF(即所有 Solana 去中心化應用運行的虛擬機:https://github.com/solana-labs/rbpf)中發現了一個問題。經過仔細調查,我們發現這是一個可能導致合約執行路徑錯誤的安全漏洞。我們已向 Solana 安全團隊報告了該錯誤,團隊立即確認並修復了此漏洞。此外,他們還授予我們團隊價值 80,000 美元的 SoL 代幣獎勵。

該漏洞存在於較新版本的 rBPF(0.2.26 至 0.2.27)中。在我們報告該問題時,主網上使用的驗證器尚未升級到受影響的版本。我們的系統在受影響的版本合併之前就檢測到了該問題,這使得主網的驗證器免受此漏洞的影響。

我們在下文中詳細闡述了此漏洞的細節。

1. eBPF 與 rBPF

eBPF(擴展柏克萊封包過濾器)最初是為在核心(kernel)中過濾封包而開發的。由於 eBPF 的安全性、效率和可擴展性,它現在被廣泛應用於網路、追蹤、剖析 多個領域。考慮到 eBPF 強大的功能,Solana 將其用作智慧合約的執行引擎。為了在 Solana 上構建去中心化應用,開發人員使用 Rust 開發智慧合約,並將合約編譯為 eBPF 位元組碼。

Solana 使用 rBPF(一個用 Rust 編寫的虛擬機)來執行編譯後的 BPF 位元組碼。然而,該虛擬機(即 rBPF)是否強大、安全且精確尚不可知。如果 rBPF 內部存在安全問題,所有包含 rBPF 的驗證器都可能受到影響,從而導致整個 Solana 網路的巨大損失(例如,資金損失)。

2. 根本原因

我們開發了一種工具,可以自動定位 rBPF 的實現錯誤並定期掃描其代碼。在掃描過程中,我們在 rBPF(0.2.26 版本)中發現了一個嚴重的問題,這可能會導致合約出現錯誤的執行路徑。

具體來說,sdiv 指令是用作有符號除法指令的,這是 rbpf 0.2.26 中預設啟用的功能。sdiv 支援 32 位元(即 sdiv32)和 64 位元(即 sdiv64)運算元的除法。對於 sdiv32 指令,計算結果存儲在 BPF 暫存器中,這是一個 64 位元的暫存器。然而,如果 sdiv32 指令之後的指令將計算結果讀取為 64 位元,則結果可能會有所不同。這是因為 rBPF 在 JIT 編譯 期間沒有將 sdiv32 的計算結果正確擴展為 64 位元的值。

例如,如果用正數(即 12)除以負數(即 -4)並使用 sdiv32,正確的結果在 32 位元和 64 位元下都應為 -3。下方的程式碼是一個範例。

在 JIT 和直譯(Interpreted)兩種模式下運行並追蹤後,我們觀察到了它們之間的差異:

2.1 直譯模式

0 [0000000000000000, 0000000400000000, 0000000000000000, 0000000000000000, 0000000000000000, 0000000000000000, 0000000000000000, 0000000000000000, 0000000000000000, 0000000000000000, 0000000200014000]    29: lddw r5, 0x10000000c
 1 [0000000000000000, 0000000400000000, 0000000000000000, 0000000000000000, 0000000000000000, 000000010000000C, 0000000000000000, 0000000000000000, 0000000000000000, 0000000000000000, 0000000200014000]    31: sdiv32 r5, -4
 2 [0000000000000000, 0000000400000000, 0000000000000000, 0000000000000000, 0000000000000000, FFFFFFFFFFFFFFFD, 0000000000000000, 0000000000000000, 0000000000000000, 0000000000000000, 0000000200014000]    32: jslt r5, 0, lbb_7
 3 [0000000000000000, 0000000400000000, 0000000000000000, 0000000000000000, 0000000000000000, FFFFFFFFFFFFFFFD, 0000000000000000, 0000000000000000, 0000000000000000, 0000000000000000, 0000000200014000]    36: exit

2.2 JIT 模式

0 [0000000000000000, 0000000400000000, 0000000000000000, 0000000000000000, 0000000000000000, 0000000000000000, 0000000000000000, 0000000000000000, 0000000000000000, 0000000000000000, 0000000200014000]    29: lddw r5, 0x10000000c
 1 [0000000000000000, 0000000400000000, 0000000000000000, 0000000000000000, 0000000000000000, 000000010000000C, 0000000000000000, 0000000000000000, 0000000000000000, 0000000000000000, 0000000200014000]    31: sdiv32 r5, -4
 2 [0000000000000000, 0000000400000000, 0000000000000000, 0000000000000000, 0000000000000000, 00000000FFFFFFFD, 0000000000000000, 0000000000000000, 0000000000000000, 0000000000000000, 0000000200014000]    32: jslt r5, 0, lbb_7
 3 [0000000000000000, 0000000400000000, 0000000000000000, 0000000000000000, 0000000000000000, 00000000FFFFFFFD, 0000000000000000, 0000000000000000, 0000000000000000, 0000000000000000, 0000000200014000]    33: lddw r0, 0x1
 4 [0000000000000001, 0000000400000000, 0000000000000000, 0000000000000000, 0000000000000000, 00000000FFFFFFFD, 0000000000000000, 0000000000000000, 0000000000000000, 0000000000000000, 0000000200014000]    35: exit

在直譯模式下,暫存器 r5 被設定為 0xFFFFFFFFFFFFFFFD(在 32 位元和 64 位元模式下均為 -3),而在 JIT 模式下,r5 被設定為 0x00000000FFFFFFFD。在這種情況下,對於接收 64 位元值的 jslt 指令,r5 將被辨識為一個正數(即 0x00000000FFFFFFFD)。之後,執行路徑將完全錯誤。

3. 影響

這種錯誤的實現可能導致合約的執行路徑不正確,並可能引發嚴重的問題。

例如,如果智慧合約中的重要操作依賴於 sdiv32 指令的結果,這可能導致不正確的執行結果並被攻擊者濫用。

此問題是在 https://github.com/solana-labs/rbpf/pull/283 中引入的,這意味著 rBPF 從 0.2.26 版本開始就存在漏洞。我們發現了此問題,並於 2022 年 4 月 28 日向 Solana 安全團隊報告。該團隊快速回應了我們的報告,並透過為 sdiv32 指令增加符號擴展(sign-extend)操作,在數小時內修復了該問題。該修復位於 https://github.com/solana-labs/rbpf/pull/310。由於我們團隊的及時檢測與報告,主網的驗證器並未受到此漏洞的影響。

此問題被歸類為協議活躍度(protocol liveness)錯誤,並獲得了 Solana 頒發的 80,000 美元漏洞獎勵。

時間軸

  • 2022/04/28:我們向 Solana 安全團隊報告了該問題
  • 2022/04/29:漏洞已修復
  • 2022/05/09:分配了 CVE-2022-23066 編號
  • 2022/06/01:獲得漏洞獎勵

關於 BlockSec

BlockSec 團隊致力於區塊鏈生態系統的安全,並與領先的 DeFi 專案合作以保護其產品。該團隊由來自學術界和工業界的頂尖安全研究人員和經驗豐富的專家組成。他們在著名的會議上發表了多篇區塊鏈安全論文,報告了多起 DeFi 應用程式的零時差攻擊(Zero-day attack),並發布了關於高影響力安全事件的詳細分析報告。

推特:[BlockSecTeam]

Medium:https://blocksecteam.medium.com

網站:https://www.blocksec.com

訂閱最新動態
超越智能合約:Web3中的網域與DNS營運安全
Security Insights

超越智能合約:Web3中的網域與DNS營運安全

合約審計止步於合約本身。我們針對 DefiLlama TVL 前 100 名背後的 100 個網域,執行了八項基於 SEAL 的 DNS 與註冊商檢查——共 800 項檢查,僅有一個網域全數通過。以下是大多數專案缺失的四項關鍵控制,以及它們在用戶入口點的重要性。

Web3攻擊面:滲透測試概覽

Web3攻擊面:滲透測試概覽

加密機構保留所有傳統攻擊面,並疊加資金處理鏈。本文為測試人員提供系統的實用抽象:四組件模型——應用、授權與簽名、區塊鏈互動、基礎設施,說明各組件職責、代表性實現及繼承的攻擊面。並將web3特有範疇分為五大攻擊面:生產與自動化運維、簽名意圖、審批與提款鏈、資金邏輯、鏈上交易與已部署合約。

損失約2,300萬美元:Cosmos EVM、Moonwell 遭利用 | BlockSec Weekly
Security Insights

損失約2,300萬美元:Cosmos EVM、Moonwell 遭利用 | BlockSec Weekly

報告期間(2026/08/22 - 2026/08/30)內,共涵蓋5起區塊鏈安全事件,損失約2,270萬美元;Tectonic遭抽走約7,400萬至1.195億美元,其中大部分因Cronos回滾至攻擊前狀態而消除。重點事件為橫跨六條鏈的Cosmos EVM漏洞系列(實際損失約570萬美元),於TAC Chain追蹤發現,一個共享餘額同步漏洞串聯下溢與上溢攻擊,抽乾質押池。報告亦分析Moonwell的抵押品計算與預言機價格操縱組合攻擊、Tectonic針對低流動性抵押品的預言機價格與憑證代幣匯率操縱組合攻擊、Ajna清算業務邏輯漏洞,以及Solana上的Rain Card合約漏洞系列,涉及Ed25519簽名驗證繞過(Avici、Tria等)。

Web3 最佳安全審計方

在上線之前驗證設計、程式碼與業務邏輯,對標業內最高安全標準。

BlockSec 審計
Solana 網路重大漏洞的發現與即時修復過程