最近,我們的漏洞檢測系統在 Solana 的 rBPF(即所有 Solana 去中心化應用程式所運行的虛擬機:https://github.com/solana-labs/rbpf)中發現了一個嚴重問題。經過仔細調查,我們發現這是一個整數溢位漏洞,該漏洞可被利用來導致整個 Solana 網路崩潰。我們已向 Solana 安全團隊回報此漏洞,該團隊隨即採取行動確認並修復了該漏洞。截至本文撰寫時,幾乎所有驗證者節點都已收到補丁並升級至最新版本,這意味著現在進行公開披露是安全的。
eBPF 與 rBPF
擴展 Berkeley 封包過濾器(eBPF[1])最初是為在核心中過濾封包而開發的。由於 eBPF 的安全性、效率和可擴展性,它現在被用於網路、追蹤、性能分析等 多個領域[2]。考慮到 eBPF 的強大能力,Solana 也選擇將其作為智慧合約的執行引擎。為了在 Solana 上構建去中心化應用程式(dApps),開發者需要使用 Rust 開發其智慧合約,隨後會將其編譯為 eBPF 位元組碼。
為了託管 Solana 的去中心化應用程式,需要一個精確的 eBPF 虛擬機。在這種情況下,Solana 使用了 rBPF,這是一個用 Rust 編寫的 eBPF 虛擬機。然而,該虛擬機(即 rBPF)是否健壯、安全且精確尚不清楚。一旦 rBPF 內部存在安全問題,所有包含 rBPF 的驗證者都可能受到影響,從而對整個 Solana 網路造成巨大損失(例如 DDoS 攻擊)。
漏洞根源
我們開發了一種用於定位 rBPF 漏洞的工具。該工具目前仍在積極開發中。在此過程中,我們在 rBPF(版本 0.2.16)中發現了一個嚴重的問題,它可能會導致整個網路癱瘓。
具體而言,檔案「elf.rs」中的函式「load」用於解析並驗證 ELF 檔案(智慧合約)。首先,「load」函式會讀取 ELF 結構並呼叫「relocate」函式來設定被呼叫者的偏移量。然而,在「relocate」函式中,屬性「sym.st_value」是直接從 ELF 檔案 中檢索的。如果「st_value」足夠大,在計算「addr」(即「sym.st_value」與「refd_pa」的總和)時就可能會觸發整數溢位。

在這種情況下,攻擊者可以建立一個惡意的 ELF 檔案作為智慧合約,從而觸發整數溢位。隨後,每個驗證者都會執行該目標 ELF 檔案,而 rBPF 將會因「add with overflow」錯誤而恐慌(panic)。

此時,rBPF 將會卡住,後續的交易將無法執行,從而導致拒絕服務(DoS)攻擊。我們觀察到,由於在載入 ELF 檔案時發生了整數溢位,節點卡在了「Finalizing transaction」(結束交易)階段,如下所示。

此問題是在 https://github.com/solana-labs/rbpf/pull/200 中引入的,這意味著 rBPF 從 0.2.14 版本開始就存在此漏洞。我們發現了此問題,並於 2021 年 12 月 6 日向 Solana 安全團隊回報。Solana 在我們回報後的幾小時內,透過使用安全數學(safemath)機制修復了此問題。修復內容位於 https://github.com/solana-labs/rbpf/pull/236。在本文撰寫時(2021/12/30),超過 86% 的驗證者已經升級到最新版本。
[1] https://en.wikipedia.org/wiki/Berkeley_Packet_Filter
[2] https://ebpf.io/
時間軸
- 2021/12/06:向 Solana 安全團隊回報問題
- 2021/12/06:漏洞已修復
- 2021/12/30:發布此漏洞的相關資訊
- 2022/01/28:分配了 CVE-2021–46102 編號



