SP1 可靠性缺陷使 Succinct 主網 Prover Network 暴露於無效證明風險
重點速覽
- •這項可靠性缺陷位於 SP1 的原生 Rust 驗證器中,該驗證器僅參考每個張量的大小標籤而未確認其與儲存內容相符,因此帶有偽造標籤的攻擊者可以讓偽造的證明通過驗證。
- •sp1_hypercube、sp1_prover 與 sp1_sdk 的 6.0.0 至 6.8.0 版本受影響,Core 與 Compressed 證明僅在直接發送至原生 Rust 驗證器時暴露於風險。
- •Groth16 與 Plonk 檢查(包括鏈上 Solidity 檢查器)未受影響,因為它們依賴形狀固定的包裝證明,且從不觸及由證明者控制的張量格式。
- •Succinct 於 9 月 24 日在 6.8.1 版本中發布修復,比 10 月 11 日的公告早了 17 天,並已將其部署至主網 Prover Network,這意味著其使用者無需採取行動,而接受不受信任證明的自建營運者則必須升級。
- •研究人員 Vitalis Salis 發現該缺陷並透過 Immunefi 的漏洞賞金計畫回報,為今年披露的一系列證明系統可靠性問題再添一例。

SP1(Succinct 的零知識證明系統)中一項高嚴重性的可靠性缺陷,使該公司自己的主網 Prover Network 暴露於無效證明風險。SP1 是一個零知識虛擬機(zkVM),旨在讓開發者無需重新執行程式即可證明程式的正確執行,而可靠性——即驗證器只接受確實如宣稱般發生的執行之證明的保證——是所有建立在這類證明之上的應用所依賴的性質。根據 10 月 11 日發布的一份 GitHub 安全公告,Prover Network 是 Succinct 所知唯一受影響的部署。
這份編號為 GHSA-p7v2-jjv3-8p8f 的公告指出,惡意證明者可以提交一份針對無效執行的證明,而網路的驗證器會予以接受。Prover Network 接受來自第三方證明者的證明,這意味著其驗證器必須將每一筆提交視為潛在的敵意輸入——這使得該缺陷與其運作直接相關,因為可靠的驗證正是區分真正工作與偽造結果的關鍵。
僅限原生 Rust 驗證器路徑可被利用
只有當證明直接發送至 SP1 的原生 Rust 驗證器時,該缺陷才可能被利用。Core 與 Compressed 證明在該路徑上暴露於風險。
Groth16 與 Plonk 檢查未受影響,因為它們依賴形狀固定的包裝證明,且從不觸及位於問題核心、由證明者控制的張量格式。用於鏈上 Plonk 與 Groth16 驗證的 Solidity 檢查器同樣安全。呼叫 verify_sp1_proof 函式來驗證 Compressed 證明的應用程式,只有在證明聚合最終產生 Groth16 或 Plonk 證明時才受到保護。
根據公告,sp1_hypercube、sp1_prover 與 sp1_sdk 的 6.0.0 至 6.8.0 版本受影響。Succinct 於 9 月 24 日在 6.8.1 版本中發布修復,比公告公開早了 17 天,隨後將其部署至主網 Prover Network——這樣的時序意味著在缺陷的技術細節公開之前,可用的修復方案便已到位。
張量標籤不一致未被檢查
該缺陷位於 SP1 的原生 Rust 驗證器中,即負責判定證明是否有效的元件。
SP1 將多維資料儲存在稱為 Tensor 的構中。Tensor 結合了儲存值的緩衝區與描述其形狀的宣告維度,兩者必須一致才能進行可靠的驗證:儲存元素的數量必須等於宣告維度的乘積。
每筆證明資料都帶有標示其大小的標籤,但驗證器從未確認標籤與實際內容相符,僅參考標籤本身。因此,攻擊者可以提交帶有偽造標籤的資料。驗證過程的不同部分隨後會讀取同一緩衝區的不同區段,這意味著偽造的證明可能通過驗證。
6.8.1 版本在反序列化過程中加入了長度檢查。任何儲存元素數量不等於其宣告維度乘積的張量都會被拒絕。
誰需要升級
從主網 Prover Network 請求證明的使用者無需在其端進行任何變更。營運自己的原生 Rust 驗證器並接受來自不信任證明者之證明的營運者必須升級至 6.8.1。由於 Succinct 的公告只能涵蓋其所知的部署,自建營運者正是需要檢查自身設置是否落在受影響範圍內的一方,並以公告所列的受影響版本作為參考。
披露與相關事件
根據公告,研究人員 Vitalis Salis 發現了該缺陷,並透過 Immunefi 的漏洞賞金計畫回報。
這次披露加入了今年以來一系列證明系統可靠性問題的行列。Cryptopolitan 先前曾報導過 Zcash Orchard 隱私資金池的可靠性缺陷,以及 Foom.Cash 遭攻擊事件,後者中攻擊者因驗證器配置錯誤而偽造了 zkSNARK 證明。