Slide 1

Slide 1 text

2022/09/07 Let’s Go Talk #3 TOC Goで学ぶ Fuzzing

Slide 2

Slide 2 text

- TOC - コネヒト株式会社 - バックエンドエンジニア - 主にPHP - Go は趣味で勉強中 自己紹介

Slide 3

Slide 3 text

- 入力されうるテストケースを大量に入力し、挙動を確認するテスト手法 - 意図しないデータが入力されたときに、挙動を調べることで不具合・脆弱 性の確認を行う - 想定外のデータを`ファズ`というらしい - テストをする立場だと、自分に都合のいいテストデータを選びがちである が、バイアスのかからないテストデータを利用できる Fuzzingってなに?

Slide 4

Slide 4 text

- 元々 go-fuzz というツールがあったが、Go 1.18 から標準で機能として追 加された - go-fuzz は今まで334個のバグを見つけている(すごい!) - 既存のツールよりも簡単に、ユニットテストと同じように書けることを目指し た - ref. Design Draft: First Class Fuzzing Go 1.18 で追加されたFuzzing

Slide 5

Slide 5 text

実際のコード例 - seed corpus と呼ばれる 「種になるデータ」を入れる。未 指定もできるがパターンがわ かっているなら指定した方が信 頼できそう。 - テスト部分はユニットテストと 同様にはできない場合がある (=入力を予測できない)。元 に戻せるテストだったり、エ ラーが起きたかどうかで確認 する。

Slide 6

Slide 6 text

ユニットテストと比較

Slide 7

Slide 7 text

go-fuzz を使うと - func Fuzz(data []byte) int でテストデータ生成したり - `$ go-fuzz-build` したり - `$ go-fuzz` したり と特有の処理、コマンドがあるっぽい

Slide 8

Slide 8 text

実際に実行すると - IDE だと GUI 上で -fuzz フ ラグをつけられて便利 - execs: 入力数。大量に実行 されていることがわかる - interesting: コードカバレッ ジが変化するような入力値。数 の増加は時間と共に鈍化。 実行

Slide 9

Slide 9 text

実際に実行すると - 失敗したテストケースは別 ファイルと記録される - 次回テストするときのテスト データとして用いられる - これも個別実行できるので デバッグに便利!

Slide 10

Slide 10 text

- Go 標準の Fuzzing は既存のユニットテストっぽく書けるので学習コスト が小さそう - 自身のバイアスに囚われない、信頼できるテストケースを見つけられそう - Design Draft: First Class Fuzzing で思想を知るのは面白いので、他 のも見てみたい まとめ

Slide 11

Slide 11 text

- Design Draft: First Class Fuzzing - Go1.18から追加されたFuzzingとは - フューチャー技術ブログ - Go Fuzzingによるファジングテスト/ランダムテスト - 絶対に落とせない!友人の結婚式の余興用アプリケーションをエラーゼロ で突破した - M3 Tech Blog 参考