目錄(5 節)
Google DeepMind 研究團隊在 libsignal 重現一項已修復缺陷:新 session 解密失敗、改用舊 session 成功後,程式仍儲存新 session 尚未確認的狀態,包含簽署預密鑰秘密副本。AlphaProof Code 對缺陷版本產生 Lean 證明,核對結果顯示它違反指定安全定理。這項結果只針對特定程式與性質,並不代表整個 Signal 應用沒有漏洞。詳見研究論文。
研究團隊產生約 650 萬行 Lean 證明。這類證明如何連到實際程式,又有哪些限制?
AlphaProof Code 的重點,是把特定程式的安全性質寫成數學規格,再由證明檢查器驗算程式是否符合。一般程式代理的任務差異可參考科研程式代理的比較方式。
AlphaProof Code 驗證 Signal,證明連到哪一層程式?
AI 代理協助建立 Lean 規格與證明,再由 Lean 核心檢查證明是否符合核准規格。DeepMind 驗證的是特定 libsignal 命令列程式的 AArch64 機器碼及列明的安全性質。
形式化驗證是把程式要求寫成數學命題,再證明程式符合命題。Lean 是檢查數學證明的程式語言與證明器。人員核准規格後,代理協助產生證明,Lean 核心負責檢查;證明成立不代表規格正確。
研究者將 Rust libsignal 編譯為 Linux AArch64 執行檔,以 Lean 描述指令和程式執行,證明模型中的協定行為符合二進位程式。驗證性質包括訊息機密性、真實性、前向保密及遭入侵後安全性;符號模型另涵蓋特定 PQXDH 握手的量子攻擊機密性。
驗證範圍是 libsignal-cli 一對一訊息流程和特定 AArch64 Linux 執行檔,未涵蓋群組訊息;部分低階密碼及輸出函式以合約描述。Android、iOS 是否符合相同結論,還取決於編譯、連結與作業系統介面。
形式化驗證補上哪些程式審查缺口?
測試與程式碼審查能發現實際缺陷;形式化證明則針對已定義性質,檢查模型條件下的所有執行路徑。它提供特定規格範圍內的保證,不能取代其他檢查。
測試執行選定案例,弱點掃描尋找已知模式,人工審查判斷程式和威脅模型。形式化證明則檢查符合前提的執行路徑是否都滿足命題,例如遭入侵後的協定安全性。
| 方法 | 主要檢查方式 | 結果如何解讀 |
|---|---|---|
| 測試 | 執行選定案例 | 僅回報已測情況 |
| 弱點掃描 | 搜尋已知模式 | 提供待調查線索 |
| 人工審查 | 閱讀程式與設計 | 判斷規格與情境是否合理 |
| 形式化驗證 | 證明模型內程式符合規格 | 結論限於已建模範圍與假設 |
DeepMind 論文呈現兩種缺陷。其一,舊 session 解密成功後,程式仍儲存新 session 未確認的狀態及簽署預密鑰秘密副本;Lean 證明該版本違反安全定理。
其二,PQXDH 回應端未拒絕格式錯誤的 X25519 基底金鑰,攻擊者可藉修改編碼建立共用秘密相同的第二個 session。Lean 證明該版本違反安全定理;兩例都限於論文設定的 Signal 範圍。
seL4 團隊以機器檢查證明微核心 C 程式符合規格,部分設定也證明處理器執行的二進位碼具完整性與機密性等性質。官方文件限定這些結果適用於特定平台與設定。seL4 證明範圍
CompCert 是 INRIA 與 AbsInt 團隊開發的 C 編譯器,將 CompCert C 編譯為多種處理器的組合語言。團隊以 Coq 證明產生的程式與來源程式語義等價,降低編譯轉換引入錯誤的疑慮;結果不涵蓋來源程式本身,且限於 CompCert C 支援範圍。CompCert 官方文件
DeepMind 論文提到,seL4 約投入 20 人年,AlphaProof Code 團隊五人用四週驗證 Signal;兩案範圍不同,不能直接比較成本。延伸閱讀:Lean 證明檢查重點。
DeepMind 論文指出,若假設過強或安全性質定義過弱,有缺陷的程式仍可能符合定理。Lean 核對命題與證明是否相符,不替組織判斷安全需求是否完整。

為什麼證明成立,仍可能沒有回答真正的安全問題?
Lean 能檢查證明是否由核准規格推出,卻不會判斷規格是否符合真實威脅、假設是否過強或模型是否漏掉重要環境。規格偏弱時,證明成立仍可能沒有回答實際安全疑問。
規格可能限制攻擊者能力,或只要求較弱的結果。DeepMind 安排人員審閱規格,也以可滿足性與變異測試檢查規格是否空洞;規格品質仍須由熟悉協定、實作與威脅情境的人判斷。
DeepMind 論文描述,使用者會在撰寫證明前審閱、修改並核准規格。這項責任決定證明所代表的安全保證。
研究以 Lean 模型描述 AArch64 指令和部分 Linux 系統呼叫,以合約代表外部函式;硬體、核心與密碼原語也有信任假設。模型和模擬器及實際執行的對照,不等同涵蓋所有環境。程式或環境變更後,團隊須重新確認證明適用性。
部署前應確認規格涵蓋的資料、攻擊者與狀態,哪些函式以合約抽象化,二進位檔和環境是否符合產品,以及改版後誰維護並審核證明。
哪些大型系統值得投入形式化驗證?
當安全性質可明確規格化、失效代價高、程式範圍可界定,且團隊能長期維護時,形式化驗證較值得評估。需求常變或責任分散時,先釐清規格與治理。
Signal 案例有既有協定模型、明確的程式和訊息流程,也有專家補足握手與後量子 ratchet 的組合規格。導入仍需協定、Rust、Lean、機器碼和環境等專業,以及明確的假設核准責任;其他系統不能直接套用其結論或工時。
成本包括規格審核、外部程式庫合約、改版追蹤和跨團隊協作。先挑關鍵性質與最小範圍試行,再評估是否擴大。

導入前可以用哪些問題判斷是否合適?
先寫清楚保證性質、程式與環境範圍、依賴假設,以及規格審核和改版維護責任。若無法回答,先縮小範圍再估工具和工時。
- 定義失效情境:列出要防止的錯誤或攻擊,以及保證成立的前提。
- 劃定程式邊界:列明程式、編譯產物、外部函式與環境,標示合約和假設。
- 審查規格:由安全與工程人員確認命題涵蓋真實攻擊,並以反例或變異測試檢查。
- 估算維護工作:指定規格、證明審查與改版維護責任人,估算人力及驗證成本。
- 小範圍試行:先選失效代價高、邊界明確的程式,確認證明能回答決策問題再擴大。
AlphaProof Code 顯示 AI 代理可協助證明工程,Lean 提供機器檢查。投入前先確認證明目標、涵蓋範圍與維護責任。
- AlphaProof Code 的 Signal 案例把指定安全性質連到特定
libsignal編譯後機器碼,範圍不等於完整 Signal 應用。 - AI 代理產生證明,Lean 核心檢查證明;人員仍須定義、審核規格及信任假設。
- 導入前應盤點程式邊界、執行環境、外部合約、責任人與改版維護成本。
常見問題
Q1:AlphaProof Code 是否證明 Signal 完全沒有漏洞?
沒有。研究驗證特定 libsignal 命令列程式及明列的安全性質,並依賴規格、密碼原語與執行環境等假設,不能解讀為整個 Signal 產品不存在漏洞。
Q2:Lean 核心檢查通過,代表 AI 代理寫的內容都可信嗎?
Lean 會檢查證明是否符合核准規格;這不表示代理草擬的規格本身正確,也不替團隊確認規格符合實際安全需求。規格仍須人工審核。
Q3:形式化驗證可以取代測試和程式碼審查嗎?
不宜取代。測試、弱點分析、程式碼審查與形式化驗證處理的問題不同;形式化證明只涵蓋已寫入規格和模型的範圍,其他方法仍可補足不同風險。