Back to Blog

安全性檢查:EVM相容鏈是否經得起考驗?

Code Auditing
January 4, 2024
6 min read

2023 年 11 月,BlockSec 行政總裁周亞金教授受邀參加了由 DRK Lab 主辦的首屆 Web3 學者峰會(Web3 Scholars Summit)。會上,周教授分享了 BlockSec 在檢測 EVM(以太坊虛擬機)漏洞方面的工作與成果。他還介紹了 BlockSec 專門為確保 EVM 兼容鏈安全而設計的自動化差異模糊測試(Differential Fuzzing)工具。本文總結了此次演講的內容。

引言

根據 Defillama 的數據統計,目前存在 238 條 L1 和 L2 公鏈,其中 144 條兼容 EVM。然而問題隨之而來:這些 EVM 兼容鏈在實作過程中是否存在安全隱患?經過研究,我們的答案是肯定的。針對這一擔憂,BlockSec 推出了自動化差異模糊測試安全工具。讓我們一起踏上探索這些 EVM 兼容鏈背後真相的旅程。

虛擬機中的漏洞

圖 1:以太坊虛擬機 (EVM) 工作流程圖
圖 1:以太坊虛擬機 (EVM) 工作流程圖

以以太坊虛擬機 (EVM) 為例,它採用了基於堆疊的架構,其中包括虛擬 ROM、程式計數器、堆疊、記憶體和世界狀態(持久化)。

虛擬機是負責解釋和執行智能合約編譯後的二進位代碼的引擎。許多區塊鏈平台的核心組件都是虛擬機,其中以太坊虛擬機 (EVM) 最為著名。因此,虛擬機在執行智能合約、處理交易以及確保區塊鏈完整性方面發揮著關鍵作用。

我們知道 EVM 本身也是由程式設計師編寫的軟體程式。然而,我們如何確保 EVM 沒有問題呢?畢竟,人類編寫的任何代碼都可能存在漏洞。

一旦 EVM 出現漏洞,將對區塊鏈生態系統造成毀滅性的後果。事實上,EVM 在過去曾遭遇過許多嚴重的漏洞。

例如,2020 年曾發生過一起由預編譯合約(即 CVE-2020-26241)引起的漏洞事件 [1]。Geth 中的 dataCopy 預編譯合約(位於 0x00...04)在調用過程中執行了淺拷貝(shallow copy),即複製大量數據時僅複製了指標而非完整數據。這使得惡意智能合約能夠修改本不應被修改的數據,導致不同版本的虛擬機在執行同一智能合約時出現數據不一致。另一個例子發生在 2021 年,當時某些 EVM 兼容鏈未隨以太坊進行升級。在舊版本的 Geth 中存在一個漏洞(CVE-2021-39137)[2],預編譯合約調用中的輸入和輸出數據記憶體區域出現重疊。攻擊者利用此漏洞,導致了鏈分叉。

BlockSec 的應對措施

如何及時發現 EVM 中的漏洞?面臨的挑戰有哪些?

  1. 首先,由於虛擬機的設計錯綜複雜,很難找到能夠完全理解其運作邏輯的工具。每個專業領域都需要專門的知識,許多開發者可能無法投入足夠的精力去理解其運作邏輯並採取有效的預防措施。

  2. 此外,許多新的 L1/L2 公鏈會自定義 EVM 虛擬機,這可能會引入新的安全問題。

顯然,僅依靠人工審計來識別 EVM 虛擬機上的這些問題是非常困難的。

適應並做出相應應對!鑑於這些挑戰,BlockSec 開發了一套自動化系統來正面解決這些問題!

差異模糊測試 (Differential Fuzzing)

在 BlockSec,我們的專家團隊採用了一種巧妙的方法,稱為差異模糊測試。透過在不同版本的虛擬機上執行相同的測試案例,並比較輸出結果,我們可以揭示潛在的漏洞和不一致之處。這種方法使我們能夠有效地識別常規測試方法可能忽略的細微差別,從而增強系統的整體安全性。

圖 2:差異模糊測試工作流程
圖 2:差異模糊測試工作流程

基本工作原理:

為了進行差異模糊測試,我們需要準備相同的輸入作為測試案例。然後將這些測試案例輸入到差異模糊測試引擎中。透過比較在不同版本的虛擬機上執行相同測試案例的輸出,我們可以識別潛在問題。

具體實作步驟:

差異模糊測試的測試案例需要包含兩部分:交易元數據(Transaction metadata)和前置狀態(Pre-state)。但是我們如何產生這些交易呢?我們採用了兩種方法來應對這一挑戰。

  1. 重用歷史交易:我們可以檢索區塊鏈上已發生的歷史交易,並透過差異模糊測試引擎在不同版本的虛擬機上運行它們。然而,僅依賴此方法有其侷限性。歷史交易往往太過「正常」,而安全測試則需要揭示邊界情況(Corner cases)——即那些極端場景。這就是為什麼我們提出了第二種方法。
  2. 覆蓋率引導的模糊測試(Coverage-guided fuzzing):我們從頭開始產生不常見的位元組碼和歷史上從未見過的交易,然後對交易和智能合約代碼進行突變,並將其輸入到虛擬機中。我們從多個維度確保了測試案例的有效性和全面性。

一旦產生了這些交易,它們就會被送入差異模糊測試引擎,然後比較結果。

結果的比較不僅僅是簡單的數值比較,還綜合考量了虛擬機中持久化和非持久化存儲的數據一致性。本文將不再贅述。

案例研究

圖 3:Aurora VM 中預編譯合約 *ModExp* 問題的示例
圖 3:Aurora VM 中預編譯合約 ModExp 問題的示例

我想分享一個我們透過差異模糊測試在 Aurora VM 中發現的虛擬機漏洞案例。具體而言,它涉及 ModExp 預編譯智能合約的一個問題。

當計算數字 x 的 y 次冪的模指數運算時,我們知道此操作需要計算資源。在正確的實作中,Gas 計算會考慮迭代次數,因為模指數運算涉及多次迭代。然而,有一種特定情況下的 Gas 計算可能會出現問題:當指數 y 等於 0 時,即零階冪運算。在這種情況下,迭代次數變為零,導致 Gas 值極小。但實際上,該計算仍然需要資源。

結論

目前,BlockSec 推出的差異模糊測試工具支援在各種區塊鏈虛擬機環境中執行,包括 rbpfubpfAurora-engineneon-evmMoonbeamrevm、EvmOS、fevmPolygon-zkevm,並且正在持續擴展中。

利用該工具,我們已經發現了 14 個新的漏洞,申請了 2 個 CVE:CVE-2021–46102CVE-2022–23066,並獲得了超過 130 萬美元的漏洞賞金。

目前,BlockSec 提供的全面 EVM 鏈安全解決方案(審計服務 + 差異模糊測試工具)已獲得 EOS 和 FileCoin 的認可並採用,將為其生態系統的安全與健康發展做出貢獻。

參考文獻

[1] Shallow copy in the 0x4 precompile could lead to EVM memory corruption

[2] RETURNDATA corruption via datacopy

關於 BlockSec

BlockSec 是一家領先的區塊鏈安全公司,由一群全球傑出的安全專家於 2021 年創立。公司致力於增強新興 Web3 世界的安全性與易用性,以促進其大規模應用。為此,BlockSec 提供智能合約與 EVM 鏈安全審計服務、用於安全開發與主動威脅防禦的 Phalcon 平台、用於資金追蹤與調查的 MetaSleuth 平台,以及協助 Web3 建設者在加密世界中高效航行的 MetaDock 擴充套件。

迄今為止,公司已服務超過 300 家知名客戶,如 MetaMask、Uniswap Foundation、Compound、Forta 和 PancakeSwap,並獲得了包括經緯創投(Matrix Partners)、Vitalbridge Capital 和分佈式資本(Fenbushi Capital)等頂尖投資者兩輪數千萬美元的融資。

✉️業務諮詢:[email protected]

BlockSec Twitter 帳號:https://twitter.com/BlockSecTeam

Phalcon Twitter 帳號:https://twitter.com/Phalcon_xyz

Best Security Auditor for Web3

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

BlockSec Audit