Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Goで学ぶ Fuzzing

TOC
September 07, 2022

Goで学ぶ Fuzzing

Let's Go Talk #3 で LT 登壇した際の資料
https://connehito.connpass.com/event/257000/

TOC

September 07, 2022
Tweet

More Decks by TOC

Other Decks in Programming

Transcript

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

    View Slide

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

    View Slide

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

    View Slide

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

    - ref. Design Draft: First Class Fuzzing
    Go 1.18 で追加されたFuzzing

    View Slide

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

    View Slide

  6. ユニットテストと比較

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide