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

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

09923d8b0c79423a289b7d5dc31a59e4?s=47 mururu
April 24, 2021

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

Go Conference 2021 Spring

09923d8b0c79423a289b7d5dc31a59e4?s=128

mururu

April 24, 2021
Tweet

Transcript

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

    Spring
  2. Copyright Kanmu, Inc. All right reserved. 2 伊藤 友気 CTO

    at Kanmu, Inc. @mururu @mururururu 自己紹介
  3. Copyright Kanmu, Inc. All right reserved. 3 バンドルカードつくってます

  4. Copyright Kanmu, Inc. All right reserved. 4 Fuzzing とは Go

    と Fuzzing 継続的な Fuzzing の実例と課題 1 2 3 アジェンダ
  5. Fuzzing とは 1

  6. Copyright Kanmu, Inc. All right reserved. Fuzzing とは 6 1

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

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

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

    9 1 テキストを入れたり。テキストを入れたり。テキストを入れた り。テキストを入れたり。テキストを入れたり。テキストを入 れたり。テキストを入れたり。テキストを入れたり。 • fuzz の生成方法 • テスト対象やそれに応じた fuzz の与え方 • 商用 / OSS • 有名どころ ◦ AFL ◦ libfuzzer
  10. Go と Fuzzing 2

  11. Copyright Kanmu, Inc. All right reserved. Go と Fuzzing 11

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

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

    dvyukov/go-fuzz 13 2 テキストを入れたり。テキストを入れたり。テキストを入れた り。テキストを入れたり。テキストを入れたり。テキストを入 れたり。テキストを入れたり。テキストを入れたり。 • Fuzz 関数を定義して対象の関数を呼びだす • go-fuzz-build でビルドして go-fuzz で実行するだけ
  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
  15. 継続的な Fuzzing の実例と課題 3

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

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

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

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

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

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

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

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

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

    24 3 • go-fuzz / libfuzzer が macOS 未サポートのため mac で開発していると素直にローカルで実行できない • 初期値として用いる corpus の管理、更新、最適化を いい感じにやりたい
  25. Copyright Kanmu, Inc. All right reserved. 25 • Fuzzing は大量のデータを自動生成してシステムに入

    力することにより不具合を検出するテスト手法 • Go で Fuzzing をするのは現状でも結構簡単 まとめ
  26. Go製のネットワーククライアントに対 する継続的Fuzzing 伊藤 友気 2021.4.24 Go Conference 2021 Spring