Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

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

Slide 3

Slide 3 text

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

Slide 4

Slide 4 text

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

Slide 5

Slide 5 text

Fuzzing とは 1

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

Go と Fuzzing 2

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

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

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

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

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

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

Slide 22

Slide 22 text

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

Slide 23

Slide 23 text

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

Slide 24

Slide 24 text

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

Slide 25

Slide 25 text

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

Slide 26

Slide 26 text

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