top of page

GCCおよびLLVM向けRISCVファザー

  • 執筆者の写真: Rajeev Gadgil
    Rajeev Gadgil
  • 4月13日
  • 読了時間: 5分

更新日:4 日前

GCCやLLVMなどのRISC-Vコンパイラのファジングは、このアーキテクチャに基づくソフトウェアエコシステム全体の正確性とセキュリティを確保するために不可欠な手法です。目的は、コンパイルされたコードの脆弱性を見つけることではなく、誤ったコード生成、予期しない動作、さらには悪用可能なセキュリティ脆弱性につながる可能性のあるコンパイラ自体の欠陥を明らかにすることです。


コンパイラファジングが特別な課題となる理由

コンパイラファジングは、一般的なアプリケーションにおけるファジングとは異なります。プログラムにランダムなデータを入力するのではなく、ランダムだが構文的には正しいソースコードを生成し、それをコンパイラに渡します。バイト列を変更するだけの単純なファジングツールでは、解析すら不可能なコードをすぐに生成してしまい、より深刻なエラーを見逃してしまう可能性があります。

コンパイラ ファジングの主な目的は、主に 2 種類のエラーを検出することです。


コンパイラファジングが特別な課題となる理由

  1. クラッシュとパニックアタック:ファジングツールは、コンパイル中にクラッシュ、ハング、または重大なコンパイラエラーを引き起こすコードを生成します。これは、修正が必要なコンパイラのバグを示しています。

  2. ミスコンパイル:これは最も危険なタイプのエラーです。コンパイラはテスト対象のコードを正常にコンパイルしますが、生成されたマシンコード(RISC-Vアセンブラ)には欠陥があります。これは、検出されないデータ破損、セキュリティ上の脆弱性、または予測できないプログラム動作につながる可能性があります。このようなエラーを見つけるには、差分ファジングと呼ばれる手法が必要です


RISC-Vコンパイラの差分ファジングのパフォーマンス

差分ファジングは、RISC-Vコンパイラのコンパイルエラーを見つけるための非常に強力な手法です。その仕組みは以下のとおりです。


RISC-Vコンパイラの差分ファジングのパフォーマンス

  1. ファジング ツールは、多くの場合、有効な C または C++ コード (csmith など) を生成するプログラムであり、一意のプログラムを生成します。

  2. このプログラムは、少なくとも2 つの異なるコンパイラ(GCC と LLVM など) によってコンパイルされているか、異なる最適化フラグ(-O0 と -O3 など) を使用してコンパイルされています。

  3. 次に、コンパイルされたバイナリが実行され、その出力が比較されます。

  4. 出力が一致しない場合は、少なくともいずれかのコンパイラにコンパイルエラーがあることを意味します。ファジングツールは、この特定のソースコードを開発者による分析のためのテストケースとして保存します。

この方法は基本的に「テストオラクル」を使用し、事前に正しい出力を知る必要なくエラーを自動的に特定します。これが、GCCとLLVMの両方で多くのコンパイラエラーが発見されている主な理由です。



RISC-Vコンパイラのファジングのための重要なツールとリポジトリ

前述の汎用ファザーの多くは (AFL++ など) コンパイラのソース コードをファジングするために使用できますが、有効な RISC-V 固有のコードを効果的に生成してテストするには、専用のツールが必要になることがよくあります。

  • csmith:これはCプログラム用のよく知られたランダム化テストケースジェネレータです。GCCやLLVMなどのCコンパイラの差分テストに最適な、複雑で妥当なCコードを生成します。RISC-V専用ではありませんが、あらゆるCコンパイラのRISC-Vバックエンドのファジングワークフローにおいて不可欠な要素です。

  • RISCV-DV: RISC-Vコミュニティによってメンテナンスされているこのツールは、主にRISC-Vプロセッサの設計検証に使用されますが、コンパイラバックエンドのテスト用の複雑な命令シーケンスを生成するためにも使用できます。高度な設定が可能で、特定のISA拡張に対応できます。

  • IRFuzzer: LLVMバックエンドに特化したファジングツールです。C/C++ソースコードを生成する代わりに、LLVM中間表現(IR)を生成します。これにより、フロントエンドのエラーを気にすることなく、バックエンドのコード生成を直接テストできます。これは、LLVMのRISC-Vコードジェネレータにおける問題を発見するための、非常に的を絞ったアプローチです。

    • GitHub:研究ツールとしてのリソースは、arXivや大学のウェブサイトでよく見つかります。GitHubで「IRFuzzer」を検索すると、関連プロジェクトが見つかります。


  • RISC-V Vector Intrinsic Fuzzing (RIF): RISC-V Vector Extension (RVV) の組み込み関数を用いてランダムコードを生成する特別なファジングツールです。GCCやLLVMなどのコンパイラが、RISC-V ISAのこの複雑かつパフォーマンスクリティカルな部分を正しく実装しているかどうかを検証するために不可欠です。

  • Patrick-rivos/compiler-fuzz-ci:このGitHubリポジトリは、RISC-Vコンパイラのファジングのための継続的インテグレーション(CI)環境の優れた例を提供しています。csmithなどのツールとCIパイプラインを組み合わせて、自動的にファジングを行い、GCCとLLVMにエラーを報告する方法を実証しています。

RISC-Vコンパイラのファジングは、現在進行中の重要なタスクです。これにより、ソフトウェア開発者は、基盤となるハードウェアに確実かつ安全に、そして正しくコンパイルすることができ、RISC-Vエコシステム全体の強化につながります。



コメント


bottom of page