前言
正如我們之前的文章中所介紹的( Numen|零知識證明引論Part1 ),ZKP(零知識證明)的本質是一個證明系統,證明者(Prover)和驗證者(Verifier)雙方需要在一系列邏輯電路的基礎上對原問題的解構造證明和進行驗證。
隨著越來越多的Layer 2 協議(zkSync、Scroll等)、基於交易見證的特殊公鏈(Filecoin、Aleo等)選擇構建在ZKP之上,再加上此前各類基於ZKP的匿名幣項目,區塊鏈在於ZKP相結合的過程,由於其係統的複雜性,將產生越來越多的不安全因素。
本文旨在從安全角度出發,總結ZKP與區塊鏈相結合的過程中可能產生的漏洞,從而希望為ZKP項目的安全服務提供參考。
ZKP的特性
在了解一個系統的安全性之前,我們需要對該系統的特性進行分析,所有的安全服務都應該是先確保系統特性的滿足。
一個零知識證明系統,需要同時滿足證明系統的完備性(completeness)、可靠性(soundness)以及本身的特點——零知識性(zero knowledge)。
1.完備性:對於真實的陳述,證明者總能成功地向驗證者證明其正確性。
2.可靠性:對於錯誤的陳述,惡意證明者無法欺騙驗證者。
3.零知識性:在驗證過程中,驗證者不會獲得證明者關於數據本身的任何信息
如果一個證明系統不滿足完備性,則說明系統有可能在一些極端條件下無法通過正確的證明,從而產生拒絕服務的狀態。
如果一個證明系統不滿足可靠性,攻擊者就可以輕易的偽造證明或構造特殊的證明結構來欺騙驗證者,從而可能產生非常嚴重的權限繞過問題。
如果一個零知識證明系統不滿足零知識性,那麼有可能在交互的過程中洩露原始參數,從而導致攻擊者可以基於洩露的數據構造攻擊證明,或導致證明者作惡。
所以零知識證明系統的三個性質,是決定該系統是否安全有效的關鍵,在安全服務的過程中需要特別注意。
具體安全關注點
針對基於ZKP協議的區塊鏈項目,主要需要關注以下關鍵的安全方向:
1. 零知識證明電路
項目中使用的ZKP電路,需要確保其安全性、有效性、可擴展性等方面滿足需求。關注點包括電路設計、密碼學原語實現、隨機性保障等。
電路設計錯誤:由於目前沒有很好的檢查工具,在設計ZKP電路時,可能會出現一些邏輯錯誤,導致證明過程不符合零知識、完全性或可靠性等安全屬性。
比如在2018年,Zcash的開發團隊在其Sapling升級中引入了一個新的zk-SNARK證明系統。在升級過程中,他們發現了一個電路設計錯誤,該錯誤可能導致無限制偽造ZEC代幣。儘管該漏洞並未被利用,但它凸顯了電路設計錯誤的嚴重性。
密碼學原語實現錯誤:ZKP電路依賴於一系列密碼學原語(例如哈希函數、加密算法等)。如果這些原語的實現存在錯誤,可能導致整個證明系統的安全性受損。
這一類的案例比較多,不僅可能出現在零知識證明系統中,BNB Chain跨鏈橋的merkle tree 任意構造漏洞就是在實現merkle tree驗證原語的過程中產生出錯誤,直接導致了586,000,000美元的損失。
隨機性缺失:零知識證明通常依賴於隨機數生成器(RNG)生成隨機數。如果隨機數生成過程存在問題,可能導致證明的安全性受損。
比如2018年,Dfinity的開發團隊在審計其基於zk-SNARK的隱私方案時,發現了一個隨機數生成漏洞。該漏洞可能導致攻擊者通過特定輸入破解電路的零知識特性。
2. 合約安全
該項主要是針對Layer2或者通過智能合約實現的隱私幣項目而言。智能合約的安全性不言而喻,除了常見的重入、注入、溢出、權限繞過等漏洞外, 對於ZKP項目,智能合約在資產跨鏈、驗證proof等方面起到至關重要的作用,在跨鏈消息驗證和proof驗證方面的漏洞,會直接導致可靠性失效。
例如今年早些時候發現的Circom的Verify合約漏洞,直接導致可輸入假名實現雙花的攻擊。
3. 數據可用性
檢查項目如何解決數據可用性問題,確保鏈下數據能夠在需要時被安全、有效地訪問和驗證。關注數據存儲、驗證機制、傳輸過程等方面。
2019年,Plasma鏈上發生了一起數據可用性問題。由於Validator在某段時間內無法訪問鏈下數據,用戶在這段時間內無法提交交易或提取資金。這個案例表明了數據可用性問題對Layer 2項目的潛在影響。
除了使用數據可用性證明來重新構建數據可用性外,我們也可以在主機防護,數據狀態監控方面加強保護。
4. 經濟激勵
評估項目中的激勵機制,確保其可以刺激驗證者、用戶等參與方合理參與並維護整個系統的安全性和穩定性。關注激勵模型設計、獎勵分配、懲罰機制等方面。
5. 隱私保護
如果項目涉及隱私保護,審計其隱私方案的實現。確保用戶數據在傳輸、存儲和驗證過程中得到充分保護,同時維持系統的可用性和可靠性。
雖然零知識性的證明需要引入模擬、倒帶等複雜的概念,我們仍然可以基於協議通信的流程,來推斷是否有證明者的隱私被洩露,對於惡意驗證者,我們也可以通過驗證者的交互數據內容,來推算是否有重新構建證明者只是的可能性。
6. 性能優化
評估項目中的性能優化策略,例如交易處理速度、驗證過程效率等。審計代碼實現中的優化措施,以確保項目能夠滿足性能需求。
7. 容錯和恢復機制
審計項目在面對意外情況(如網絡故障、惡意攻擊等)時的容錯和恢復策略。確保在可能的情況下,系統能夠自動恢復並維持正常運行。
8. 代碼質量
審計項目代碼的整體質量,關注代碼的可讀性、可維護性和健壯性。評估代碼中是否存在不規範編程實踐、冗餘代碼、潛在錯誤等問題。
Numen可以為ZKP項目做什麼
Numen在ZKP項目的安全服務方面,可以為項目方和用戶提供全方位的安全保護。
我們除了具備豐富的智能合約代碼審計經驗外,也具備對電路編碼邏輯的審計,能夠同時採用人工和自動化的方式審計約束條件和見證(Witness)生成的正確性,尤其對欠缺約束計算漏洞具有深刻的理解和捕捉能力,我們針對重要的邏輯,會通過手動組裝自定義邏輯見證的方式來模擬多種攻擊行為進行測試。
針對Sequencer/Prover代碼和驗證合約,我們也具備Fuzz和安全測試能力,能夠同時對節點實體和節點數據提供防護能力。
除了安全服務,我們的兩個安全產品也可以在項目上線後,為項目提供實時的保護:
ImmunX是Numen研發的Web3鏈上安全監控和防護系統,目前已經具備鏈上安全態勢感知、風險告警、鏈上追踪等能力,如果與Sequencer合作,也可以實現我們在Layer1區塊鏈中的攻擊阻斷服務。目前我們與Binance已達成合作協議,幫助其實現BNB Chain的風險感知。
Leukocyte是一個具備CWPP(Cloud Workload Protection Platform)和ASA(Adaptive Security Architecture)能力的主機安全防護產品,應用場景覆蓋雲主機,物理主機和虛擬機,可以提供針對服務器層面的資產,風險,威脅和響應閉環管理,有效保障服務器安全可靠運行。
總結
當我們在談論ZKP項目安全的時候,我們首先要明確該項目將ZKP用於何處,對於Layer2、隱私幣、公鏈的安全側重點是不一樣的。但無論如何,都要確保ZKP的三個性質:完備性、可靠性和零知識性的有效性。
更多詳情請查閱當我們在談論零知識證明安全的時候,我們在談論什麼