Fiat-Shamir 攻擊不是誤用,是協議本身不安全
GKR 這類真實部署的協議,在標準 Fiat-Shamir 下可被證明假命題為真;這不是實現疏忽,是變換本身的問題。
原視頻在 YouTube 上放不出來,用音頻聽:
核心論點 · 點時間戳可跳到原聲
人工構造的反例騙了所有人
在 Ron 與 Lev、Dmitry 的工作之前,學界早就知道存在「安全交互協議 + Fiat-Shamir = 完全崩潰」的例子,但那些協議是理論家刻意造出來證明 Fiat-Shamir 不總成立的,看起來極不自然。業界的典型反應是「我們真實的協議不會做那種蠢事」。Ron 自己幾年前也做過一個半人工的例子,其中一個組件是虛構的,這讓他一直對安全性存疑。轉折點是 Ethereum Foundation 研究 Poseidon 安全性時設的 bug bounty,最後一檔獎勵是「用 Poseidon 對你選擇的任意協議發起 Fiat-Shamir 攻擊」。Ron 沒有去領賞,而是建議把條款改成「非虛構的協議」,這直接促成了對真實部署協議的排查。
— Ron RothblumGKR 的省數據特性成了攻擊面
真正被攻破的是實踐中廣泛使用的 GKR 協議,Polyhedra 的 Expander 系統就在用它。攻擊利用的是 GKR 的一個真實特性:它允許「記錄更少的數據」,表面上少記,但隱式地確認了這些數據——這正是人們想用 GKR 的原因,也正是這個特性讓攻擊成為可能。攻擊成立的關鍵條件是:所證明電路(scheme)的深度至少要和 Fiat-Shamir 所用哈希函數的深度一樣深,而當時的實現對此沒有任何限制。Polyhedra 做了修改並支付了賞金。
— Ron Rothblum緩解辦法只是把哈希鏈拉深
緩解手段很樸素:讓哈希函數的深度比被證明電路的深度略深一點。具體做法是把多個 Poseidon 串成鏈,做 10 次 Poseidon,電路自然就深 10 倍,期望沒有取巧的辦法繞開。Polyhedra 就是這麼改的。但 Ron 明確強調這只是緩解——我們演示不出攻擊,但也不知道攻擊是否真的不存在。這跟常見的 Fiat-Shamir 漏洞不同:那些通常是實踐中的誤用,比如忘記把證明者發的某些消息納入哈希;而這次是在按規範正確使用 Fiat-Shamir 的前提下依然不安全。
— Ron Rothblum對角化:讓程序把自己當輸入
Ron 給了一個極端人為的協議來說明攻擊原理:證明者發一條消息 M,驗證者把 M 當程序代碼運行,輸入也是 M,等它輸出 100 位字符串,再和 100 個隨機比特比對,相同才接受。交互式下這協議幾乎不可能被接受,因為 M 一旦發出,M(M) 就完全確定,撞上 100 位隨機數的概率是 2 的負 100 次方。但套上 Fiat-Shamir 後,隨機數變成 H(M),證明者只需找到滿足 M(M) = H(M) 的 M——取 M 就是哈希函數 H 本身即可,因為 M(M) = H(H) = H(M)。這類技巧叫對角化,本質是強迫程序嵌套自身。
— Ron Rothblum換掉 Reed-Solomon 就能換出速度
Blaze、Tensor Switch、Bolt 都是基於哈希的多項式承諾方案,共同點是依賴糾錯碼。FRI、STIR、WHIR 都建立在 Reed-Solomon 碼上,而這三個項目試圖用更好的糾錯碼換取更好的 PCS。Bolt 用的是一種叫 sketched code 的碼:先對消息做一個非密碼學的「摘要」,只對摘要做 Reed-Solomon 編碼,整體碼字 = 摘要的編碼 + 原始消息。好處是 Reed-Solomon 只作用在約十分之一大小的數據上,編碼成本降一個數量級。代價可能是證明體積變大,但在不需要所有人讀證明的場景下,證明時間更重要。Ron 指出這條線專注證明效率,而 WHIR 那條線專注驗證和證明體積,兩者可以通過證明組合(proof composition)共存:用 Bolt 拿到極快的證明,再用 WHIR 遞歸證明其驗證器,繼承高質量驗證。
— Ron RothblumVeil 讓哈希證明自帶零知識
Veil 是把某類基於哈希的證明系統變成零知識(Ron 不喜歡 ZK ZK 這個叫法)的方法。傳統上在 SP1 裡實現零知識,是把簡潔證明與 Groth16 遞歸組合,但 Groth16 不是後量子安全的。Veil 想要的是原生的、基於哈希的零知識方案。已有概念驗證顯示,無論證明時間還是證明體積,資源開銷都相當小,計劃直接實現在 SP1 中。
— Ron RothblumFlock 讓以太坊敢放棄 Poseidon
Flock 是用於布爾電路批量驗證的證明系統,由 Ron 與 Benedict 及其學生 William Lang 把理論發展推向實用。Ron 認為它給行業帶來了一股「第二春」,更重要的是催生了大量新想法和後續研究。一個直接後果是 Ethereum Foundation 決定從 Poseidon 轉向某種布爾哈希。在 Flock 出現之前,並不清楚能否高效做到這一點,Flock 加上 Binius 的重要先行影響證明了可行。Ron 把這次轉變歸因於兩件事同時發生:一是新攻擊讓人們對 Poseidon 的信心動搖,二是一年前還顯得意外的是,傳統哈希函數在證明裡用起來效率相當不錯。
— Ron Rothblum換證明者不破壞可靠性,只威脅完備性
snark.fast 由 Zcash、Igalia Labs(主導)、Ethereum Foundation 和 Espresso 合作,思路是保持 Plonk 驗證器不變,只替換證明者,看能快多少。Ron 區分了兩個性質:可靠性(soundness)意味著假命題沒人能說服你接受,所以無論做出多快的證明者,假命題都證不出來,從這個意義上沒有安全問題;完備性(completeness)意味著真命題必須可證,這更難保證,snark.fast 只保證隨機輸入下證明仍被接受。更雄心勃勃的做法是證明改動不改變證明者的輸入輸出行為,這正是 ZK-Golf 和 Kobe 等人追求的目標,有更強的完備性保證。Ron 也擔心這些完全由 AI 驅動、缺乏監督的項目,可能被 AI 往證明者裡塞惡意代碼。
— Ron RothblumAI 發現 Mac 上有個沒用的 GPU
Ron 原本預期這種大規模眾包 AI 能帶來 10-20% 的工程提升,實際結果是 2.5 到 3 倍,而且純屬工程優化,協議沒有任何改動。一個有意思的插曲是 AI 很早就注意到測試跑在 Mac 上,且 Mac 有塊沒被用起來的 GPU——不是不知道它存在,而是之前試著用效果不好,AI 顯然更會用,這對成功貢獻顯著。另一個意外是後來出現的 x86 版本,比如 Intel 服務器上不用 GPU 執行 SNARK,比他們的 Falcon 實現還快 3 倍以上。優化的具體手段之一是內存掃描:如果算法需要掃兩遍內存做兩件事,改成一遍同時做完就能省大量工作,他們知道該這麼做,但 AI 做得更好。
— Ron Rothblum有 AI 為參賽造了塊處理器模擬器
snark.fast 針對特定硬件(大概是 M3 處理器),沒有這塊處理器的人就參與不了。於是有 AI 造了一個該處理器的模擬器,好讓自己的工作能被接受。Ron 甚至一度擔心某個 AI 黑進了 snark.fast 網站偽造數據,因為那正是它被編程要做的事。評估機制本身是這套方法能成立的關鍵:有人提交更快的證明者,就在大量隨機輸入上跑它,看能否讓六月的原始 Flock 驗證器接受,接受即算有效,再測大量實驗的耗時,更快就是新榜首。這部分由 Igalia Labs 在 Yukon 平臺上管理。ZK-Golf 則走另一條路:不改證明者工程,而是改方案本身,用基於 Lean 的 DSL(Clean)表達方案並驗證其可靠性與完備性,已經有人把二進制域和 Flock 形式的方案加進去,相對原始 Flock 論文裡的方案有大幅百分比提升。
— Ron Rothblum證明哈希只比算哈希慢 200 倍
Ron 長期目標是「證明和計算一樣快」,2020 年就寫過一篇叫 Proving as Fast as Computation 的文章。用 Flock 實測,證明一堆哈希相對直接計算哈希只慢約 200 倍——聽起來很多,但比過去認為的快得多。他提醒這個數字的含義需要小心解讀。下一步是借 snark.fast、ZK-Golf 和 Flock V2 的新想法繼續壓低這個倍數,目標是逼近 1 倍。如果真能做到,意味著世界上所有計算都變得可驗證:你的 agent、別人的 agent、任何人的任何操作,都能以極低成本對照基線驗證是否正確完成,包括機器學習的訓練和推理。Ron 也提到,也許宇宙存在某個固有極限讓證明無法和計算一樣快,能證明這一點同樣很酷。
— Ron Rothblum原話 · 已逐字校驗
And when I told people about this, their typical reaction was, "Well, you know, our real protocols don't do anything stupid that would break them."
當我把這件事告訴別人時,他們的典型反應是:「我們的真實協議不會做那種會把自己搞崩的蠢事。」
Ron Rothblum13:09
So it's worth noting that this is just a mitigation, so we can't demonstrate the attack, but we also don't know if it doesn't exist.
值得注意的是這只是一個緩解措施:我們演示不出這個攻擊,但我們也不知道它是否真的不存在。
Ron Rothblum17:09
The reason people want to use GKR is that it allows for less data to be captured. Of course. That is, you seem to be recording less data, but you are implicitly confirming it without necessarily actually recording it. And this is a feature of GKR. This is the reason why you want to use GKR. Mhm. And it was this feature that made it possible to carry out our attack.
人們想用 GKR 的原因是它允許記錄更少的數據。也就是說,你表面上記錄的數據更少,但你隱式地確認了這些數據,而不必真的記錄它們。這是 GKR 的一個特性,也正是你想用 GKR 的原因。而正是這個特性讓我們的攻擊成為可能。
Ron Rothblum18:10
It could be the function H itself. Oh. H, so think about it, if M is the function H itself, then M of M is just H of H. And H of M is also H of H, so they're the same.
它可以是函數 H 本身。想想看,如果 M 就是函數 H 本身,那麼 M(M) 就是 H(H),而 H(M) 也是 H(H),所以它們相同。
Ron Rothblum22:10
I claim that, you know, it's night outside, even though it's actually day, and I can give you proof that my false claim is true, and you'll accept it with probability one.
我聲稱外面是黑夜,儘管實際上是白天,而我能給你一個證明說我這個假命題為真,你會以概率一接受它。
Ron Rothblum23:10
So, Plonk correctness generally means that if you have a false statement, no one should be able to convince you to accept it. Good. Yes? In particular, neither Snark.fast nor Snark.faster nor Snark.fastest—no one should be able to convince you of something that is false.
Plonk 的可靠性大體上意味著:如果你有一個假命題,沒有人應該能說服你接受它。特別是,無論是 Snark.fast、Snark.faster 還是 Snark.fastest,都不應該有人能讓你相信一件假的事情。
Ron Rothblum44:12
I thought it was pretty obvious that using such massive crowdsourcing AI would yield better engineering than what we had with our agent and a small number of tokens. And I was expecting, you know, 10-20% or something like that. They actually achieved two and a half or three times better results.
我原以為很明顯,用這種大規模眾包 AI 會比我們自己的 agent 加少量 token 做出更好的工程結果。我預期是 10-20% 之類的提升。他們實際上做到了 2.5 到 3 倍更好的結果。
Ron Rothblum45:12
What it means is that all computations in the world become verifiable. Anything that anybody, your agent, anybody else's agent, anything that anybody does -- yeah, that you can compare to a baseline to very cheaply verify that it was done correctly.
它意味著世界上所有計算都變得可驗證。任何人、你的 agent、別人的 agent、任何人做的任何事,你都能以極低成本對照基線驗證它是否被正確完成。
Ron Rothblum59:15
數字與實體
| Fiat-Shamir 攻擊中隨機比特串長度 | 100 位 | 20:10 |
| 交互式協議被接受的概率 | 2 的負 100 次方 | 20:10 |
| sketched code 中摘要相對原消息的規模 | 約十分之一 | 32:11 |
| snark.fast 相對原實現的工程提升 | 2.5 到 3 倍 | 45:12 |
| Intel 服務器無 GPU 版本相對 Falcon 實現的提升 | 3 倍以上 | 46:12 |
| Flock 證明哈希相對計算哈希的慢速倍數 | 約 200 倍 | 57:15 |
| Nvidia 在 GPU 中加入二進制域支持的時間 | 今年五月 | 56:15 |
術語
- Fiat-Shamir菲亞特-沙米爾變換
- 把交互式協議變成非交互式的變換,用哈希函數替代驗證者的隨機擲幣。
- GKRGKR 協議
- 一種用於證明電路正確性的交互式協議,因允許少記錄數據而被廣泛使用。
- diagonalization對角化
- 讓程序把自身作為輸入嵌套運行、從而構造出滿足特定等式輸入的技巧。
- polynomial commitment scheme多項式承諾方案
- 用極小的承諾捕獲大多項式,之後可證明對該多項式的計算,是 SNARK 的核心組件。
- sketched code草圖碼
- 先對消息取短摘要、只對摘要做 Reed-Solomon 編碼的糾錯碼,編碼更快。
- binary fields二進制域
- 以 0/1 為元素的有限域,Binius 推動其用於證明系統,Nvidia GPU 已加入支持。
收聽指南
做 ZK 證明系統、SNARK 或 ZKVM 的工程師,以及關心 Fiat-Shamir 安全性和 AI 輔助工程優化的研究者。
開頭關於理論家與從業者差異的閒聊(約 3:00-6:00)可跳過。