Let's Go Talk #3 で LT 登壇した際の資料 https://connehito.connpass.com/event/257000/
2022/09/07 Let’s Go Talk #3TOCGoで学ぶ Fuzzing
View Slide
- TOC- コネヒト株式会社- バックエンドエンジニア- 主にPHP- Go は趣味で勉強中自己紹介
- 入力されうるテストケースを大量に入力し、挙動を確認するテスト手法- 意図しないデータが入力されたときに、挙動を調べることで不具合・脆弱性の確認を行う- 想定外のデータを`ファズ`というらしい- テストをする立場だと、自分に都合のいいテストデータを選びがちであるが、バイアスのかからないテストデータを利用できるFuzzingってなに?
- 元々 go-fuzz というツールがあったが、Go 1.18 から標準で機能として追加された- go-fuzz は今まで334個のバグを見つけている(すごい!)- 既存のツールよりも簡単に、ユニットテストと同じように書けることを目指した- ref. Design Draft: First Class FuzzingGo 1.18 で追加されたFuzzing
実際のコード例- seed corpus と呼ばれる「種になるデータ」を入れる。未指定もできるがパターンがわかっているなら指定した方が信頼できそう。- テスト部分はユニットテストと同様にはできない場合がある(=入力を予測できない)。元に戻せるテストだったり、エラーが起きたかどうかで確認する。
ユニットテストと比較
go-fuzz を使うと- func Fuzz(data []byte) int でテストデータ生成したり- `$ go-fuzz-build` したり- `$ go-fuzz` したりと特有の処理、コマンドがあるっぽい
実際に実行すると- IDE だと GUI 上で -fuzz フラグをつけられて便利- execs: 入力数。大量に実行されていることがわかる- interesting: コードカバレッジが変化するような入力値。数の増加は時間と共に鈍化。実行
実際に実行すると- 失敗したテストケースは別ファイルと記録される- 次回テストするときのテストデータとして用いられる- これも個別実行できるのでデバッグに便利!
- Go 標準の Fuzzing は既存のユニットテストっぽく書けるので学習コストが小さそう- 自身のバイアスに囚われない、信頼できるテストケースを見つけられそう- Design Draft: First Class Fuzzing で思想を知るのは面白いので、他のも見てみたいまとめ
- Design Draft: First Class Fuzzing- Go1.18から追加されたFuzzingとは - フューチャー技術ブログ- Go Fuzzingによるファジングテスト/ランダムテスト- 絶対に落とせない!友人の結婚式の余興用アプリケーションをエラーゼロで突破した - M3 Tech Blog参考