Fuzzing testがacceptされた。 ここらでGoにおけるFuzzingの現状をまとめておく。


Fuzzingとは

自動生成した入力値(テストケース)に対してテスト対象のプログラムが正常に処理できるか判定する手法。

似た手法としてProperty Based Testingがある。こちらは単に正常終了するかどうかだけでなく、出力された結果に対して期待する性質(仕様)を満たしているかのチェックまでやったり、エラーを起こすパターンから無関係な要素を排したり(=Shrink)する。したがってFuzzingよりも高度な手法になる。

今GoでFuzzingするには

github.com/dvyukov/go-fuzzがデファクトスタンダードになっている。

加えてGoogleが開発しているOSS-Fuzzという継続的にFuzzingを行うためのツールがあり、go-fuzzのlibFuzzer互換モードと組み合わせて利用できる。

本体にどんな感じで統合されそうか

まだacceptされた段階なのでわからないが、コーパスの設定やFuzzingの実行関数がtesting.Fとして提供される見込み。 go-fuzzよりも手軽に使い始められそう。

どう活用するか(まだつかめてない)

Fuzzが素朴なバイト列であることから、structを受ける関数に対してどう渡すかのイメージがまだつかめてない。

Exampleは入力がバイト列である何らかのエンコーダやプロトコルの実装であることが多い。

参考にしたもの

Design Draft: First Class Fuzzing

Integrating a Go project - OSS-Fuzz

ymotongpooさんのGo Conference 2020の動画&資料。

脆弱性対策:ファジング:IPA 独立行政法人 情報処理推進機構