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

Go製のネットワーククライアントに対する継続的 / Fuzzing for network client in Go

mururu
April 24, 2021

Go製のネットワーククライアントに対する継続的 / Fuzzing for network client in Go

Go Conference 2021 Spring

mururu

April 24, 2021
Tweet

More Decks by mururu

Other Decks in Programming

Transcript

  1. Go 製のネットワーククライアントに対
    する継続的 Fuzzing
    伊藤 友気
    2021.4.24 Go Conference 2021 Spring

    View full-size slide

  2. Copyright Kanmu, Inc. All right reserved. 2
    伊藤 友気
    CTO at Kanmu, Inc.
    @mururu
    @mururururu
    自己紹介

    View full-size slide

  3. Copyright Kanmu, Inc. All right reserved. 3
    バンドルカードつくってます

    View full-size slide

  4. Copyright Kanmu, Inc. All right reserved. 4
    Fuzzing とは
    Go と Fuzzing
    継続的な Fuzzing の実例と課題
    1
    2
    3
    アジェンダ

    View full-size slide

  5. Fuzzing とは
    1

    View full-size slide

  6. Copyright Kanmu, Inc. All right reserved.
    Fuzzing とは
    6
    1
    テキストを入れたり。テキストを入れたり。テキストを入れた
    り。テキストを入れたり。テキストを入れたり。テキストを入
    れたり。テキストを入れたり。テキストを入れたり。
    予測不可能なデータをインプットとして与えることによりその不具合
    を発見するテスト手法

    View full-size slide

  7. Copyright Kanmu, Inc. All right reserved.
    Fuzzing とは
    7
    1
    テキストを入れたり。テキストを入れたり。テキストを入れた
    り。テキストを入れたり。テキストを入れたり。テキストを入
    れたり。テキストを入れたり。テキストを入れたり。
    ● ブラックボックステスト
    ● 予測不可能な大量のデータ(fuzz)を自動で生成してシステムに
    入力しその挙動を監視することで、不具合、脆弱性を発見する
    ファジングツール
    (fuzzer)
    fuzz

    View full-size slide

  8. Copyright Kanmu, Inc. All right reserved.
    Fuzzing とは - なぜ
    8
    1
    テキストを入れたり。テキストを入れたり。テキストを入れた
    り。テキストを入れたり。テキストを入れたり。テキストを入
    れたり。テキストを入れたり。テキストを入れたり。
    ● あらゆる入力を事前に予測したり、静的に検証したりすることは
    多くの場合容易ではない
    ○ それは思いつかないみたいなコーナーケース
    ● ならば自動で大量にデータを生成して入力してみようという手法
    のテスト手法の一つ
    ファジングツール
    (fuzzer)
    fuzz

    View full-size slide

  9. Copyright Kanmu, Inc. All right reserved.
    Fuzzing とは - バリエーション
    9
    1
    テキストを入れたり。テキストを入れたり。テキストを入れた
    り。テキストを入れたり。テキストを入れたり。テキストを入
    れたり。テキストを入れたり。テキストを入れたり。
    ● fuzz の生成方法
    ● テスト対象やそれに応じた fuzz の与え方
    ● 商用 / OSS
    ● 有名どころ
    ○ AFL
    ○ libfuzzer

    View full-size slide

  10. Go と Fuzzing
    2

    View full-size slide

  11. Copyright Kanmu, Inc. All right reserved.
    Go と Fuzzing
    11
    2
    テキストを入れたり。テキストを入れたり。テキストを入れた
    り。テキストを入れたり。テキストを入れたり。テキストを入
    れたり。テキストを入れたり。テキストを入れたり。
    こんなコード書いてしまったことないですか?

    View full-size slide

  12. Copyright Kanmu, Inc. All right reserved.
    Go と Fuzzing - dvyukov/go-fuzz
    12
    2
    テキストを入れたり。テキストを入れたり。テキストを入れた
    り。テキストを入れたり。テキストを入れたり。テキストを入
    れたり。テキストを入れたり。テキストを入れたり。
    ● dvyukov/go-fuzz
    ○ Go のファジングツールのデファクト
    ○ Go 本体のバグも多く検出している

    View full-size slide

  13. Copyright Kanmu, Inc. All right reserved.
    Go と Fuzzing - dvyukov/go-fuzz
    13
    2
    テキストを入れたり。テキストを入れたり。テキストを入れた
    り。テキストを入れたり。テキストを入れたり。テキストを入
    れたり。テキストを入れたり。テキストを入れたり。
    ● Fuzz 関数を定義して対象の関数を呼びだす
    ● go-fuzz-build でビルドして go-fuzz で実行するだけ

    View full-size slide

  14. Copyright Kanmu, Inc. All right reserved.
    Go と Fuzzing - 余談
    14
    2
    テキストを入れたり。テキストを入れたり。テキストを入れた
    り。テキストを入れたり。テキストを入れたり。テキストを入
    れたり。テキストを入れたり。テキストを入れたり。
    ● Design Draft: First Class Fuzzing : golang.org/s/draft-fuzzing-design
    ● dev branch: https://github.com/golang/go/tree/dev.fuzz

    View full-size slide

  15. 継続的な Fuzzing の実例と課題
    3

    View full-size slide

  16. Copyright Kanmu, Inc. All right reserved.
    継続的 Fuzzing - テスト対象
    16
    3
    ● カード決済に関するメッセージのやりとりをするクライアント
    ● サーバーとは TCP のコネクション張りっぱなしで管理下の
    カードを用いた決済が行われた際にサーバーから
    ISO8583 という規格のフォーマットでメッセージが発行され

    ● この ISO8583 のメッセージのパースを対象としている
    ● 初期値として用いる corpus (fuzz) はもともとのテストデータ
    など

    View full-size slide

  17. Copyright Kanmu, Inc. All right reserved.
    継続的 Fuzzing - テスト対象
    17
    3

    View full-size slide

  18. Copyright Kanmu, Inc. All right reserved.
    継続的 Fuzzing - テスト対象
    18
    3

    View full-size slide

  19. Copyright Kanmu, Inc. All right reserved.
    継続的 Fuzzing - テスト対象
    19
    3

    View full-size slide

  20. Copyright Kanmu, Inc. All right reserved.
    継続的 Fuzzing - テスト方法
    20
    3
    ● テスト対象とする Fuzz 関数を用意
    ● GitHub Actions 上で go-fuzz-build でビルドし libfuzzer
    で Fuzzing、を毎日定時実行
    ● crash する fuzz が見つかれば自動で corpus に追加する
    PR を作成する

    View full-size slide

  21. Copyright Kanmu, Inc. All right reserved.
    継続的 Fuzzing - テスト方法 1
    21
    3

    View full-size slide

  22. Copyright Kanmu, Inc. All right reserved.
    継続的 Fuzzing - テスト方法 2
    22
    3

    View full-size slide

  23. Copyright Kanmu, Inc. All right reserved.
    継続的 Fuzzing - テスト方法 3
    23
    3
    ● crash したらその corpus の追加の PR が自動で作成される
    ● crash した corpus は リグレッションテストのテストケースとしても使
    われ、次回以降通常のCI上でのテストでも使われる

    View full-size slide

  24. Copyright Kanmu, Inc. All right reserved.
    継続的 Fuzzing - 課題
    24
    3
    ● go-fuzz / libfuzzer が macOS 未サポートのため mac
    で開発していると素直にローカルで実行できない
    ● 初期値として用いる corpus の管理、更新、最適化を
    いい感じにやりたい

    View full-size slide

  25. Copyright Kanmu, Inc. All right reserved. 25
    ● Fuzzing は大量のデータを自動生成してシステムに入
    力することにより不具合を検出するテスト手法
    ● Go で Fuzzing をするのは現状でも結構簡単
    まとめ

    View full-size slide

  26. Go製のネットワーククライアントに対
    する継続的Fuzzing
    伊藤 友気
    2021.4.24 Go Conference 2021 Spring

    View full-size slide