แนวคิดหลัก
Cruxは、RustやC/LLVMなどの言語に対応した、複雑なコードの正確性を検証するためのツールであり、特に暗号化モジュールやシリアライザ/デシリアライザペアなどの、人間にとってエラーを起こしやすいコードの検証に適しています。
บทคัดย่อ
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の有効性を示します。
多くの種類のシステムを検証できますが、本稿では、特に、複雑で高度に最適化され、正確なアルゴリズム仕様を持つインターフェースの背後にカプセル化されたシステムに関心があります。これらの特性は、いくつかの重要かつセキュリティクリティカルなシステムカテゴリ、特に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仕様のサポート、複雑で境界が明確なコードのビット精度検証とを組み合わせている点にあります。