toplogo
Inloggen

Crux:適用於 Rust 和其他語言的精確驗證器


Belangrijkste concepten
Crux 是一種用於 Rust 和其他語言(如 C/LLVM)的跨語言驗證工具,它建立在與成熟的 SAW-Cryptol 工具鏈相同的框架之上,但提供了一個以符號單元測試形式表達證明的介面,旨在驗證對人類而言難以確保正確性的程式碼,例如加密模組和序列化/反序列化器對。
Samenvatting

Crux 概述

Crux 是一種跨語言驗證工具,旨在驗證人類難以確保正確性的程式碼,例如加密模組和序列化/反序列化器對。Crux 建立在與成熟的 SAW-Cryptol 工具鏈相同的框架之上,但提供了一個以符號單元測試形式表達證明的介面。

Crux 的目標

Crux 的目標是驗證那些複雜、高度優化且封裝在具有精確演算法規範的介面後面的程式碼。這些特性描述了幾種重要且對安全性至關重要的系統類別,特別是加密模組(如 AES、SHA、ECDSA 等)以及序列化/反序列化器(如在網路介面中找到的那些)。

Crux 的優勢

Crux 的主要優勢在於其組合了符號測試介面(如 CBMC 和其他工具中所見)和組合符號模擬(如 SAW-Cryptol 中所見)以及跨語言的擴展等價性證明。

Crux-MIR

Crux-MIR 是 Crux 的 Rust 前端,它是一個位精確的驗證工具,可以推理安全和不安全的 Rust 程式碼。Crux-MIR 的證明介面非常新穎,它結合了符號測試介面(如 CBMC 和其他工具中所見)和組合符號模擬(如 SAW-Cryptol 中所見)以及跨語言的擴展等價性證明。

Crux 的應用

Crux-MIR 已被用於 Amazon Web Services 的工業部署中,作為 Shardstore(一種鍵值儲存節點實現)的保證過程的一部分。Crux 被用來證明反序列化程式碼的無恐慌性。

Crux 的案例研究:SHA1 和 SHA2

Crux-MIR 已被用於驗證 ring crate 中的 SHA1 和 SHA2 的 Rust 實現,並根據從 Cryptol 和 hacspec 標準化規範檔案庫中提取的通用(即非 Rust 或 ring 特定)規範進行驗證。

Crux 的未來方向

Crux 的未來方向包括支援 SAW-Core 項重寫,這對於處理最複雜的目標是必要的。

edit_icon

Samenvatting aanpassen

edit_icon

Herschrijven met AI

edit_icon

Citaten genereren

translate_icon

Bron vertalen

visual_icon

Mindmap genereren

visit_icon

Bron bekijken

Statistieken
Citaten

Belangrijkste Inzichten Gedestilleerd Uit

by Stuart Perns... om arxiv.org 10-25-2024

https://arxiv.org/pdf/2410.18280.pdf
Crux, a Precise Verifier for Rust and Other Languages

Diepere vragen

Crux 如何與其他 Rust 形式驗證工具(如 Prusti 和 Kani)進行比較?

Crux 與 Prusti 和 Kani 等其他 Rust 形式驗證工具,在目標、方法和驗證能力上有所不同。以下是一些關鍵差異: 目標和用例: Crux 主要針對 複雜、經過高度優化且封裝在具有精確演算法規範的介面背後的程式碼,例如加密模組和序列化/反序列化器。它專注於驗證這些程式碼的 位元精確性 和 功能正確性。 Prusti 旨在驗證 Rust 程式碼的 安全性和功能正確性,重點關注 證明 Rust 程式碼中沒有執行時錯誤,例如 panic 和記憶體安全違規。 Kani 是一種 基於模型檢查 的驗證器,專注於查找 Rust 程式碼中的 錯誤和反例。它擅長於 探索程式碼的狀態空間 並查找可能導致錯誤的執行路徑。 方法: Crux 使用 組合符號模擬,將 Rust 程式碼轉換為符號表示,並使用 SMT 求解器驗證其屬性。它支援 組合推理,允許將大型驗證任務分解為更小的、更易於管理的子任務。 Prusti 使用 基於規則的推理,將 Rust 程式碼轉換為分離邏輯中的公式,並使用 SMT 求解器驗證其正確性。它利用 Rust 的類型系統和借用檢查器來簡化驗證過程。 Kani 使用 符號執行 來探索程式碼的狀態空間,並使用 SMT 求解器檢查斷言和其他屬性。它支援 有界驗證,允許使用者指定要探索的程式碼狀態空間的大小。 驗證能力: Crux 擅長於驗證 位元精確的屬性 和 與可執行規範的等價性。它支援 跨語言驗證,允許使用 Cryptol 或 hacspec 等規範語言來指定程式碼的預期行為。 Prusti 擅長於驗證 Rust 程式碼的安全性,例如沒有 panic、記憶體安全違規和整數溢位。它還支援驗證 功能正確性,但其重點是證明沒有錯誤,而不是證明與規範的等價性。 Kani 擅長於查找 程式碼中的錯誤和反例。它支援驗證各種屬性,包括斷言、迴圈不變量和函數後置條件。 總結: Crux 適用於驗證 複雜、效能至關重要的程式碼,這些程式碼需要位元精確的推理和與可執行規範的等價性證明。 Prusti 適用於驗證 Rust 程式碼的安全性,並提供一定程度的功能正確性驗證。 Kani 適用於 查找程式碼中的錯誤和反例,並支援驗證各種屬性。

Crux 在驗證非加密程式碼(如作業系統或資料庫系統)方面的有效性如何?

雖然 Crux 主要針對驗證加密程式碼而設計,但它在驗證其他類型的程式碼(如作業系統或資料庫系統)方面也可能有效,特別是當這些程式碼包含 複雜、效能至關重要的模組,並且需要 位元精確的推理 時。 優勢: 位元精確性: Crux 的位元精確模型允許它驗證依賴於底層資料表示的屬性,這對於驗證作業系統或資料庫系統中的低階程式碼非常重要。 組合推理: Crux 的組合推理能力允許將大型驗證任務分解為更小的子任務,這對於處理作業系統或資料庫系統的複雜性至關重要。 跨語言驗證: Crux 支援使用 Cryptol 或 hacspec 等規範語言,這對於指定作業系統或資料庫系統的複雜行為非常有用。 挑戰: 無界資料結構和迴圈: Crux 主要針對有界程式碼,這意味著它可能難以處理作業系統或資料庫系統中常見的無界資料結構和迴圈。 並行程式設計和並發性: Crux 目前對並行程式設計和並發性的支援有限,這對於驗證作業系統或資料庫系統中的並行程式碼可能是一個挑戰。 外部環境互動: Crux 主要關注驗證封閉系統,這意味著它可能難以處理作業系統或資料庫系統與外部環境的複雜互動。 總結: Crux 可以用於驗證作業系統或資料庫系統中的某些元件,特別是那些具有複雜、效能至關重要的程式碼,並且需要位元精確推理的元件。但是,它需要進一步發展才能有效地處理這些系統中常見的無界資料結構、並行程式設計和外部環境互動。

Crux 的設計如何隨著 Rust 語言的發展而演變?

Crux 的設計必須隨著 Rust 語言的發展不斷演變,以適應新的語言特性、編譯器更新和標準庫變更。以下是一些 Crux 必須應對的關鍵挑戰: MIR 版本變更: Rust 的中介表示 (MIR) 會隨著每個編譯器版本而變化,這需要 Crux 的 MIR 解析器和分析器不斷更新。 新的語言特性: Rust 語言不斷發展,添加了新的語言特性,例如 const generics、async/await 和 trait aliases。Crux 必須適應這些新特性,並擴展其驗證能力以支援它們。 標準庫更新: Rust 標準庫也在不斷發展,添加了新的功能和優化。Crux 必須跟上這些更新,並確保其對標準庫的支援保持最新。 為了應對這些挑戰,Crux 團隊採取了以下措施: 持續維護: Crux 團隊積極維護該工具,定期發布更新以適應新的 Rust 版本和語言特性。 模組化設計: Crux 採用模組化設計,允許獨立更新和擴展其各個元件,而不會影響其他元件。 與 Rust 社群合作: Crux 團隊與 Rust 社群密切合作,及時了解即將發生的變化和新興需求。 具體來說,Crux 已經進行了以下調整以適應 Rust 語言的發展: 支援新的 MIR 版本: Crux 團隊不斷更新其 MIR 解析器和分析器,以支援新的 MIR 版本。 處理 const 評估: Crux 已經調整其處理方式,以適應 Rust 編譯器在編譯時進行更多 const 評估的變化。 擴展標準庫支援: Crux 團隊不斷擴展其對 Rust 標準庫的支援,包括更新現有定義和添加對新功能的支援。 隨著 Rust 語言的繼續發展,Crux 的設計也將繼續演變。Crux 團隊致力於確保該工具與 Rust 生態系統保持同步,並為 Rust 開發人員提供強大的驗證功能。
0
star