Back to Blog

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

Code Auditing
June 7, 2022
6 min read

四月,我們的漏洞檢測系統在 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

Sign up for the latest updates
~$598萬損失:Aztec、Raydium等|BlockSec週報
Security Insights

~$598萬損失:Aztec、Raydium等|BlockSec週報

本週區塊鏈安全報告涵蓋2026年6月8日至15日,分析以太坊和Solana上4起重大事件,總損失約598萬美元。重點事件包括:Aztec Connect因缺少輸入驗證導致rollup證明路徑與L1結算狀態不一致;Raydium因舊版AMM v3程式缺少驗證,攻擊者操縱LP代幣贖回計算並清空四個池。兩個漏洞均存在多年後才被利用。報告涵蓋輸入驗證缺失、整數溢出及治理攻擊等類型。

Zcash Orchard 健全性漏洞分析 | BlockSec 週報
Security Insights

Zcash Orchard 健全性漏洞分析 | BlockSec 週報

2026年6月1日當週,Zcash Orchard隱私池電路被公開披露存在嚴重健全性漏洞。該漏洞由halo2 ECC標量乘法組件缺少等式約束引起,可能導致透過雙重支付在Orchard池中無法被偵測地偽造ZEC。此漏洞自2022年5月Orchard啟用以來已存在逾四年,由研究員Taylor Hornby使用Anthropic Opus 4.8模型進行AI輔助安全審計時發現,並透過緊急網路升級(NU6.2)修補。本報告涵蓋技術根本原因、AI輔助發現過程、緊急應對時間軸及對ZKP生態系統的影響。

通訊 - 2026年5月
Security Insights

通訊 - 2026年5月

2026年5月,DeFi生態發生三起重大安全事件。Echo Protocol因管理員密鑰外洩遭惡意增發eBTC,損失約7,670萬美元;StablR因多簽治理漏洞被非法發行穩定幣,損失約1,280萬美元;Verus-Ethereum Bridge因類型驗證失敗導致攻擊,損失約1,170萬美元。

Best Security Auditor for Web3

Validate design, code, and business logic before launch. Aligned with the highest industry security standards.

BlockSec Audit