toplogo
Connexion

Rustおよびその他の言語に対応した高精度検証ツールCruxの紹介


Concepts de base
Cruxは、RustやC/LLVMなどの言語に対応した、複雑なコードの正確性を検証するためのツールであり、特に暗号化モジュールやシリアライザ/デシリアライザペアなどの、人間にとってエラーを起こしやすいコードの検証に適しています。
Résumé

Crux: Rustおよびその他の言語に対応した高精度検証ツール

本稿では、RustおよびC/LLVMに対応したクロスランゲージ検証ツールであるCruxについて解説します。Cruxは、人間が正しく実装するのが難しい、境界が明確で複雑なコード、例えば、暗号化モジュールやシリアライザ/デシリアライザペアなどを対象としています。Cruxは、成熟したSAW-Cryptolツールチェーンと同じフレームワーク上に構築されていますが、Cruxでは、証明が記号的なユニットテストとして表現されるインターフェースを提供しています。Cruxは、本番環境での使用を想定して設計されており、すでに産業界で採用されています。

本稿では、Rust向けの検証ツールであるCrux-MIRに焦点を当てます。Crux-MIRは、安全なRustコードと安全でないRustコードの両方をビット精度でモデル化し、Rustコードに関するインラインプロパティと、Cryptolまたはhacspec(Rustの方言)で記述された実行可能な仕様との拡張的な等価性をチェックするために使用できます。特筆すべきは、Crux-MIRが構成的推論をサポートしていることです。これは、ある程度複雑な証明にスケールアップするために必要不可欠です。

本稿では、SHA1とSHA2のRingライブラリ実装を、既存の関数仕様に対して検証することで、Crux-MIRの有効性を示します。

edit_icon

Personnaliser le résumé

edit_icon

Réécrire avec l'IA

edit_icon

Générer des citations

translate_icon

Traduire la source

visual_icon

Générer une carte mentale

visit_icon

Voir la source

多くの種類のシステムを検証できますが、本稿では、特に、複雑で高度に最適化され、正確なアルゴリズム仕様を持つインターフェースの背後にカプセル化されたシステムに関心があります。これらの特性は、いくつかの重要かつセキュリティクリティカルなシステムカテゴリ、特にAES、SHA、ECDSAなどの暗号化モジュールや、ネットワークインターフェースに見られるようなシリアライザ/デシリアライザなどを表しています。いずれの場合も、コードはパフォーマンスとセキュリティの両方の観点から重要であり、エラーが発生すると、コストのかかる結果につながる可能性があります。本稿の目的は、本番環境でこのコードを形式的に検証することです。 最近の研究では、この種の境界が明確で複雑なコードを形式的に検証するためのアプローチとして、構成的記号シミュレーションの有効性が実証されています。このアプローチは、検証ツールであるSAW [19]と、仕様記述言語であるCryptol [18]で構成される、成熟したSAW-Cryptolツールチェーンに具現化されています。この検証アプローチは、相互に関連する3つの部分で構成されています。 ソフトウェア解析ワークベンチ(SAW)によって実行される正確な記号実行。これは、高度に最適化された本番コードを、SMTのような形式で表現された、数学的に等価な記号項に変換します。 プログラムを表す記号項と実行可能な仕様との間の拡張的な等価性の検証。拡張的な等価性とは、(1)コードと仕様が未定義の動作/パニックを生成できないこと、(2)等価な入力が与えられた場合に、等価な出力を生成することの2つを意味します。 構成的推論。これは、複雑なサブ関数を、より単純な仕様関数でオーバーライドできることを意味します。構成的推論は、対象分野におけるある程度複雑な証明にスケールアップするために必要不可欠です。 このアプローチは、大部分が境界の明確なコードを対象としています。ループに静的な上限があり、データ構造が静的に割り当てられており、サイズが固定されている場合は、高度な自動化が可能です。これらの特性が特定の限定的な方法で保持されない場合は、ループ不変条件を使用して検証を可能にするか、任意の入力境界を課すことができます。ただし、後者の場合は、結果として得られる定理の力が低下します。しかし、暗号化プリミティブという対象分野のコードの大部分は本質的に境界が明確であるため、高度な自動化が可能になります。 構成的記号シミュレーションは、産業界の暗号化コードを形式的に検証する上で非常に成功しています。最近では、GaloisとAmazon Web Servicesのチームが、SAW-Cryptolを使用して、s2nおよびAWS-LibCryptoライブラリを検証しました[14,13,16]。これらは、Cとx86アセンブリで記述された、本番グレードの暗号化ライブラリであり、コードを変更せずに検証されました。
Crux4は、構成的記号シミュレーションに代わるインターフェースを提供する新しいツールです。これにより、本番環境の検証ツールとしてSAW-Cryptolを改善することを目指しています。SAW-Cryptolでは、証明を2つのカスタムDSL、SAWスクリプトとCryptolで記述する必要があります。これは、経験豊富な専門家にとっても、習得にかなりの時間を要します。Cruxは、この問題に2つの方法で対処しています。第1に、証明は、SAWスクリプトではなく、ユニットテストの形式で記述されます(この形式で記述された証明は、記号テストと呼ばれます)。第2に、仕様は、Cryptol DSLではなく、ネイティブ言語(この場合はRust)で記述できます。 この証明スタイルは、CBMC [15]などのツールからよく知られており、人気のあるSV-COMP競技[10]の標準インターフェースとなっています。Cruxの新規性は、この証明スタイルと、SAW-Cryptolの利点、すなわち、構成的推論、Cryptol仕様のサポート、複雑で境界が明確なコードのビット精度検証とを組み合わせている点にあります。

Idées clés tirées de

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

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

Questions plus approfondies

Cruxは、Rust以外の言語で記述されたコードとの相互運用性をどのようにサポートしており、異なる言語で記述されたコンポーネントを含むシステムの検証にどのように役立ちますか?

Cruxは、Crucible IRと呼ばれる中間言語と、SAW-Coreと呼ばれる共通言語表現を用いることで、Rust以外の言語との相互運用性を実現しています。 Crucible IR: Crux-MIR (Rust), Crux-LLVM (C/C++), Crux-x86/ARM (アセンブリ)といった異なるフロントエンドは、それぞれ対象言語のコードをCrucible IRに変換します。これにより、異なる言語で書かれたコードでも共通の形式で表現され、解析が可能になります。 SAW-Core: Crucible IRは、さらにSAW-Coreと呼ばれる共通言語表現に変換されます。SAW-Coreは、SMTソルバーへの問い合わせや、Cryptolのような高レベル仕様言語との連携を可能にする、より抽象度の高い表現です。 これらの仕組みによって、Cruxは以下のような形で異なる言語で記述されたコンポーネントを含むシステムの検証を支援します。 クロス言語の等価性検証: 例えば、Rustで実装された関数が、Cryptolで記述された仕様と等価であることを証明できます。これは、異なる言語で書かれたコンポーネント間の整合性を保証する上で重要です。 複数言語で書かれたシステムの段階的な検証: システム全体を一度に検証するのではなく、各コンポーネントを個別に検証し、それらを組み合わせることで、段階的にシステム全体の検証を進めることができます。 Cruxは、Cryptolとhacspecという2つの仕様言語をサポートしており、Rust以外の言語で記述された既存のコードや仕様との連携を容易にすることで、現実的なソフトウェア開発における異言語間検証を支援します。

Cruxは、SMTソルバーの能力に依存していますが、SMTソルバーの制限、例えば、非線形演算や複雑なデータ構造を扱う際の制限は、Cruxの適用可能性にどのような影響を与えますか?

CruxはSMTソルバーの能力に大きく依存しており、SMTソルバーの制限はCruxの適用可能性に直接影響を与えます。非線形演算や複雑なデータ構造を扱う際の制限は、特に以下の様な影響として現れます。 検証可能なコードの範囲の制限: SMTソルバーは非線形演算、特に非線形乗算を含む問題を解くのが苦手です。そのため、Cruxを用いて検証できるコードは、線形演算や単純なビット演算を主体としたものに限定されます。これは、暗号プリミティブなど、Cruxの主なターゲットとなるコードの多くが、比較的単純なビット演算で構成されているため、現状では大きな問題ではありません。しかし、より広範なコードを検証しようとすると、SMTソルバーの能力がボトルネックとなる可能性があります。 検証時間の大幅な増加: 複雑なデータ構造や制御フローを含むコードは、SMTソルバーへの問い合わせを複雑化させ、検証時間を大幅に増加させる可能性があります。Cruxは、合成的な推論を用いることで、この問題をある程度緩和しています。しかし、複雑すぎる問題に対しては、検証が現実的な時間内に行えない可能性があります。 これらの制限を克服するために、Cruxは以下のような対策を講じています。 合成的な推論: 大きな検証問題を小さなサブ問題に分割し、各サブ問題を個別に検証することで、SMTソルバーへの負荷を軽減しています。 抽象化と具体化: 複雑なデータ構造を、SMTソルバーが扱いやすい単純なデータ構造に抽象化したり、逆に抽象的な仕様を具体的な実装に具体化したりすることで、検証を効率化しています。 しかし、これらの対策にも限界があり、SMTソルバーの能力がCruxの適用範囲を根本的に制限している点は否めません。今後のSMTソルバー技術の進歩、特に非線形演算や複雑なデータ構造を扱う能力の向上が、Cruxの適用可能性を大きく広げることが期待されます。

Cruxのような形式検証ツールがソフトウェア開発プロセスに広く統合され、開発の初期段階からコードの正確性を保証できるようになると、ソフトウェア開発のあり方はどのように変化するでしょうか?

Cruxのような形式検証ツールがソフトウェア開発プロセスに広く統合されれば、ソフトウェア開発はより安全で信頼性の高いものへと変化していくでしょう。具体的には、以下のような変化が考えられます。 1. 開発の初期段階でのバグ検出: 形式検証ツールは、開発の初期段階、例えば設計段階やコーディング段階でバグを検出することを可能にします。これは、従来のテストでは発見が難しかった論理的なエラーや、仕様の曖昧さを早期に発見できることを意味します。その結果、手戻りが減り、開発期間の短縮やコスト削減に繋がると期待されます。 2. より安全で信頼性の高いソフトウェア: 形式検証ツールを用いることで、ソフトウェアの重要な性質、例えば安全性やセキュリティに関する性質を数学的に証明することができます。これは、従来のテストでは保証が難しかった、ソフトウェアの信頼性向上に大きく貢献します。 3. ソフトウェア開発者の役割の変化: 形式検証ツールは、ソフトウェア開発者にとって強力なツールとなります。開発者は、形式検証ツールを用いることで、自身のコードの正確性をより高いレベルで保証できるようになります。また、形式検証ツールは、仕様の曖昧さを発見したり、コードの改善点を提案したりするなど、開発者を様々な形で支援してくれる存在となるでしょう。 4. 新しい開発手法の登場: 形式検証ツールを前提とした、新しい開発手法が登場する可能性があります。例えば、仕様を形式言語で記述し、それを元に自動的にコードを生成する、といった手法が考えられます。 しかし、形式検証ツールが広く普及するためには、いくつかの課題も存在します。 ツールの使いやすさ: 現在の形式検証ツールは、専門知識が必要となる場合が多く、誰でも簡単に使えるわけではありません。より使いやすく、直感的に操作できるツールの開発が求められます。 検証コスト: 形式検証には、従来のテストに比べて大きなコストがかかる場合があります。検証コストを削減するための技術開発や、コストに見合った価値を提供できる分野への適用が重要となります。 これらの課題を克服することで、Cruxのような形式検証ツールは、ソフトウェア開発に革新をもたらす可能性を秘めています。
0
star