[論文レビュー] Verified Low-Level Programming Embedded in F*
この論文では、F∗に埋め込まれた検証済みの低レベルプログラミング言語Low∗を提示する。Low∗は形式的検証を伴う効率的でメモリ安全なシステムプログラミングを可能にし、CompCert風のメモリモデルとF∗の依存型および検証機能を組み合わせることで、効率的で側面チャネル耐性のあるCコードにコンパイルされる。その結果、検証されていないCライブラリと同等のパフォーマンスを達成しながら、機械検証された証明によって正しさとセキュリティを保証する。
We present Low*, a language for low-level programming and verification, and its application to high-assurance optimized cryptographic libraries. Low* is a shallow embedding of a small, sequential, well-behaved subset of C in F*, a dependently-typed variant of ML aimed at program verification. Departing from ML, Low* does not involve any garbage collection or implicit heap allocation; instead, it has a structured memory model à la CompCert, and it provides the control required for writing efficient low-level security-critical code. By virtue of typing, any Low* program is memory safe. In addition, the programmer can make full use of the verification power of F* to write high-level specifications and verify the functional correctness of Low* code using a combination of SMT automation and sophisticated manual proofs. At extraction time, specifications and proofs are erased, and the remaining code enjoys a predictable translation to C. We prove that this translation preserves semantics and side-channel resistance. We provide a new compiler back-end from Low* to C and, to evaluate our approach, we implement and verify various cryptographic algorithms, constructions, and tools for a total of about 28,000 lines of code, specification and proof. We show that our Low* code delivers performance competitive with existing (unverified) C cryptographic libraries, suggesting our approach may be applicable to larger-scale low-level software.
研究の動機と目的
- 高水準で形式的検証されたコードと低水準で高パフォーマンスなシステムコードの間のギャップを埋める。
- バッファオーバーフローなどのメモリ安全違反によって引き起こされる暗号ソフトウェアのセキュリティ脆弱性に対処する。
- 検証済みの実装を可能にし、未検証のCコードと同等のパフォーマンスを達成する暗号化アルゴリズムの効率的で検証済みの実装を提供する。
- 高水準な仕様から効率的で安全なCコードに至る検証済みのコンパイルパイプラインを提供する。
提案手法
- F∗にCに類似した低レベルのサブセットを埋め込むために、CompCertにインspiredされた構造化メモリモデルを用いた浅い埋め込みを採用する。
- F∗の依存型とリファインメント型を用いて正確な仕様を表現し、機能的正しさとメモリ安全を証明する。
- Low∗コードを効率的で予測可能なCコードに変換するためのカスタムコンパイラ後端、KreMLinを実装する。
- 抽出時に証明と仕様を消去することで、最適化され、生産環境向けのCコードを生成する。
- コンパイルプロセスとメモリモデルの形式的検証を通じて、側面チャネル耐性を確保する。
- FFIを介してF∗プログラムとLow∗コードを統合し、検証済みの高パフォーマンスなシステムを構築可能にする。
実験結果
リサーチクエスチョン
- RQ1F∗のような高水準で形式的検証された言語に、安全で正しさを保ったまま効率的なシステムプログラミングを可能にする低レベルサブセットを拡張することは可能か?
- RQ2直接メモリとポインタを操作する低レベルコードにおいて、メモリ安全と側面チャネル耐性を形式的検証で保証することは可能か?
- RQ3検証済みの低レベルコードは、未検証のC実装と同等のパフォーマンスを達成できるか?
- RQ4F∗における浅い埋め込みを用いて、検証済みで効率的かつポータブルな低レベルプログラミング言語を構築することは可能か?
- RQ5形式的検証とコンパイルをどのように組み合わせることで、高水準な仕様から安全で高パフォーマンスなシステムコードを生成できるか?
主な発見
- F∗の型システムと構造化メモリモデルのおかげで、Low∗プログラムは構築段階からメモリ安全であることが保証される。
- Low∗からCへのコンパイルパイプラインは、形式的証明により機能的正しさと側面チャネル耐性の両方を保持している。
- Low∗によって生成されたCコードのパフォーマンスは、既存の未検証C暗号ライブラリと同等であり、同等の実行時間を達成している。
- FFIを介したF∗プログラムとのシームレスな統合により、検証済みのコンponentsから高機能で検証済みのシステムを構築できる。
- 28,000行のコード(仕様と証明を含む)の実装は、このアプローチが実世界の暗号システムにスケーラブルであることを示している。
- KreMLinをバックエンドコンパイラとして使用することで、形式的保証を伴う予測可能で効率的なCコード生成が可能になった。
より良い研究を、今すぐ始めましょう
論文の読解から最終レビューまで、研究時間を劇的に削減しましょう。
クレジットカード登録不要
このレビューはAIが作成し、人間の編集者が確認しました。