第一個已知的針對實時 ZK 電路的兩個漏洞剛剛發生,這些漏洞並不是微妙的約束不足的錯誤。 它們是未完成信任設置儀式的 Groth16 驗證器。其中一個被白帽子救回,價值約 150 萬美元,另一個則被抽走了 5 ETH。 🧵
這兩個協議使用了 Circom + snarkjs,這是 Groth16 部署中最常見的技術堆疊。 錯誤是?他們跳過了受信任設置的第二階段:電路特定的貢獻步驟。 沒有這一步,驗證密鑰的 γ 和 δ 參數都被設置為相同的值:G2 的生成元。
為什麼 γ = δ 會破壞一切? Groth16 驗證檢查: e(-A, B) · e(α, β) · e(vk_x, γ) · e(C, δ) = 1 當 γ = δ 時,攻擊者可以設置 C = -vk_x 來抵消兩個項,然後設置 A = α,B = β 來抵消其餘部分。方程變為 1 · 1 = 1。不需要證人。
Foom Protocol (~$1.4M) 是一個在 Base 和 Ethereum 上的抽獎 dApp。由 @duha_real 和另一位獨立的白帽駭客進行的救援行動在惡意行為者之前排空了合約,通過循環偽造證明提取了 99.97–99.99% 的代幣。
Veil Protocol (~$5K) 是在 Base 上的 Tornado Cash 分支。一名攻擊者在一次交易中抽走了整個池子,使用像 0xdead0000 這樣的虛假撤回者進行了 29 次偽造撤回,提取了池子的全部 2.9 ETH 餘額。
這是 snarkjs 按照設計運作。當你運行 groth16 setup 時,它會將 γ 和 δ 初始化為 G2 生成器作為佔位符。你需要運行 zkey contribute 來隨機化 δ。跳過這一步,你的驗證器將接受任何證明。
可怕的是:這並不是一個深層的加密缺陷或微妙的電路錯誤。這是一個部署錯誤:缺少一個 CLI 命令。它在生產環境中運行,真實資金面臨風險。
重點: - 始終檢查部署腳本,而不僅僅是電路代碼 - 檢查你的驗證金鑰:如果 vk_gamma_2 == vk_delta_2,你的證明是可偽造的 - 我們與 @DedaubSecurity 合作,掃描 EVM 鏈以查找其他受影響的合約,未發現高價值合約,但仍有一些存在
4.13K