上級
ベース実行ファイル Go ターゲット¶

テスト対象はインストゥルメンテーションされていない、またはベース実行ファイルの Go ターゲットでしょうか? このレッスンでは、Mayhem でベース実行ファイル Go ターゲットをコンパイルし、テストする方法を手順を追って説明します。
学習時間の目安: 15 分
このレッスンを終了すると、以下のことができるようになります。
- 到達可能なアサーションの欠陥があるベース実行ファイル Go ターゲットをコンパイルし、ファジングする。
 - インデックス境界外の欠陥があるベース実行ファイル Go ターゲットをコンパイルし、ファジングする。
 
レッスンを駆け足で
始める前に前提条件を確認します。
- 
go-base-executable.tgz をダウンロードし、
go-base-executableDocker イメージをビルドし、指定された Docker レジストリにプッシュします。docker build -f Dockerfile -t <DOCKERHUB_USERNAME>/go-base-executable . docker push <DOCKERHUB_USERNAME>/go-base-executabledocker build -f Dockerfile -t $MAYHEM_DOCKER_REGISTRY/forallsecure/go-base-executable . docker push $MAYHEM_DOCKER_REGISTRY/forallsecure/go-base-executable 
2.Mayhem UI または Mayhem CLI で次の Mayhemfile を使用して go-base-executable Docker イメージに対して Mayhem ランを実行します。
```{.yaml .freemium linenums="1"}
image: <DOCKERHUB_USERNAME>/go-base-executable:latest
duration: 90
project: mayhem-examples
target: go-base-executable
cmds:
- cmd: /go/mayhemit @@
```
```{.yaml .enterprise linenums="1"}
image: $MAYHEM_DOCKER_REGISTRY/forallsecure/go-base-executable:latest
duration: 90
project: mayhem-examples
target: go-base-executable
cmds:
- cmd: /go/mayhemit @@
```
以下が必要です。
- Docker がインストールされていること
 - 有効なインターネット接続 (Docker Hub ベース イメージをプルするため)
 
ワン クリック テスト¶
次のボタンをクリックし、Create New Run フローの最後で Start Run をクリックしてベース実行ファイル Go ターゲットのテストを開始します。Mayhemfile はすでに用意されているため、何も設定する必要はありません。
Mayhem ランが始まると、次のようなラン ページが表示されます。
すばらしい! Mayhem によるベース実行ファイル Go ターゲットのテストを確認したので、次に、たった今実行した Mayhem ランの go-base-executable ターゲットをコンパイルし、ファジングする方法を順を追って説明します。
ベース実行ファイル Go ターゲットのコンパイルとテスト¶
ファイル: go-base-executable.tgz
上記の go-base-executable.tgz をダウンロードして展開し、次のバグのある mayhemit.go プログラムを見てみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34  |  | 
注目するべき 2 つの関数 main および mayhemit があるのがわかります。main 関数はプログラムへのファイル入力を処理し、行 33 で mayhemit 関数を呼び出して入力テスト ケースが "bug" であるかをチェックします。テスト ケースが "bug" である場合、panic() 関数の行 16 で起こる到達可能なアサーション エラーによってプログラムがクラッシュします。
次に、このプログラムがどのようにコンパイルされるかを見てみましょう。go-base-executable ターゲットの Dockerfile は次のとおりです。
1 2 3 4 5 6 7  |  | 
- 行 1: 必要な go 依存関係を用意するため、
golang:1.13.3-busterベース イメージがインポートされています。 - 行 2: Docker コンテナーに 
mayhemit.goソース コードがコピーされています。 - 行 3:  
go buildコマンドを使用してmayhemit.goソース コードがmayhemit実行ファイルにコンパイルされています。 - 行 7: ビルドされた Docker コンテナーのデフォルト実行ファイルとして 
/go/mayhemit @@実行ファイルが設定されています。 
次に、go-base-executable フォルダーにいることを確認し、次の docker コマンドを使用して <DOCKERHUB_USERNAME>/go-base-executable Docker イメージをビルドし、Docker Hub レジストリにプッシュします。
次に、go-base-executable フォルダーにいることを確認し、次の docker コマンドを使用して forallsecure/go-base-executable Docker イメージをビルドし、Mayhem Docker レジストリにプッシュします。
docker build -f Dockerfile -t <DOCKERHUB_USERNAME>/go-base-executable .
docker push <DOCKERHUB_USERNAME>/go-base-executable
docker build -f Dockerfile -t $MAYHEM_DOCKER_REGISTRY/forallsecure/go-base-executable .
docker push $MAYHEM_DOCKER_REGISTRY/forallsecure/go-base-executable
情報
mayhem login コマンドを使用して内部的な Mayhem Docker レジストリの URL を検索し、次のコマンドを使用して DOCKER_REGISTRY 環境変数を設定できます:
export DOCKER_REGISTRY=tutorial.forallsecure.com:5000
DOCKER_REGISTRY 環境変数に自身の Mayhem Docker レジストリ URL を設定する必要があります。
次に、Mayhem UI に移動し、<DOCKERHUB_USERNAME>/go-base-executable Docker イメージを検索します。Mayhemfile が次のようになっていることを確認します
次に、Mayhem UI に移動し、forallsecure/go-base-executable Docker イメージを検索します。Mayhemfile が次のようになっていることを確認します。
1 2 3 4 5 6  |  | 
1 2 3 4 5 6  |  | 
新規ラン作成フローの最終確認ページに到達するまで [Next] をクリックし、[Start Run] をクリックして Mayhem ランを実行します。次のようなラン ページが表示されます。
Mayhem が到達可能なアサーションの欠陥を発見できたことがわかるはずです。ベース実行ファイル Go ターゲットのコンパイルとテストが成功しました。
⚡ 現実的な演習: mayhemit-out-of-bounds ベース実行ファイル Go ターゲットのコンパイルとテスト¶
ベース実行ファイル Go ターゲットのビルドおよびテスト方法がわかったところで、ソース コードを修正して到達可能なアサーションの欠陥ではなくインデックス境界外の欠陥を検出できるかどうかやってみましょう。
ファイル: mayhemit-out-of-bounds-unsolved.zip
手順
mayhemit.goソース コードを変更し、次の最大長の制約およびインデックス境界外欠陥を追加します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14  |  | 
docker buildコマンドを使用して Dockerfile を再ビルドし、結果の Docker イメージを<DOCKERHUB_USERNAME>/go-base-executable-mayhemit-out-of-boundsとしてタグ付けします。docker pushコマンドを使用して内部的な Mayhem Docker レジストリに<DOCKERHUB_USERNAME>/go-base-executable-mayhemit-out-of-boundsDocker イメージをプッシュします。- Mayhem UI または Mayhem CLI を使用して 
<DOCKERHUB_USERNAME>/go-base-executable-mayhemit-out-of-boundsDocker イメージをファジングします。Mayhemfileが適切に設定されていることを確認します。 
docker buildコマンドを使用して Dockerfile を再ビルドし、結果の Docker イメージをgo-base-executable-mayhemit-out-of-boundsとしてタグ付けします。docker pushコマンドを使用して内部的な Mayhem Docker レジストリにgo-base-executable-mayhemit-out-of-boundsDocker イメージをプッシュします。- Mayhem UI または Mayhem CLI を使用して 
go-base-executable-mayhemit-out-of-boundsDocker イメージをテストします。Mayhemfileが適切に設定されていることを確認します。 
🔍 確認mayhemit-out-of-bounds ベース実行ファイル Go ターゲットのコンパイルとテスト¶
解答
模範解答: mayhemit-out-of-bounds-solved.zip
まず、mayhemit 関数をファジングしたとき、入力テスト ケース "bug" がインデックス境界外エラーを発生させるよう、最大長の制約 len(content) < 5 および誤った呼び出し content[10] を追加します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40  |  | 
次に、Dockerfile と同じディレクトリで docker build コマンドを実行し、結果の Docker イメージに <DOCKERHUB_USERNAME>/go-base-executable-mayhemit-out-of-bounds というタグを付けます。
次に、Dockerfile と同じディレクトリで docker build コマンドを実行し、結果の Docker イメージに $MAYHEM_DOCKER_REGISTRY/go-base-executable-mayhemit-out-of-bounds というタグを付けます。
docker build -f Dockerfile -t <DOCKERHUB_USERNAME>/go-base-executable-mayhemit-out-of-bounds .
docker build -f Dockerfile -t $MAYHEM_DOCKER_REGISTRY/go-base-executable-mayhemit-out-of-bounds .
次に、<DOCKERHUB_USERNAME>/go-base-executable-mayhemit-out-of-bounds Docker イメージにタグを付けてパブリックな Docker Hub レジストリにプッシュします。
次に、$MAYHEM_DOCKER_REGISTRY/go-base-executable-mayhemit-out-of-bounds Docker イメージにタグを付けてプライベートな Mayhem Docker レジストリにプッシュします。
docker push <DOCKERHUB_USERNAME>/go-base-executable-mayhemit-out-of-bounds
docker push $MAYHEM_DOCKER_REGISTRY/go-base-executable-mayhemit-out-of-bounds
Note
この例では、go-base-executable-mayhemit-out-of-bounds Docker イメージを tutorial.forallsecure.com Mayhem デプロイメントのポート 5000 にあるプライベートな  Mayhem Docker レジストリにアップロードしています。Docker イメージを正常にアップロードするには、URL を自身の Docker レジストリに変更する必要があります。
別の方法として、付属の Makefil を使用し、MAYHEM_DOCKER_REGISTRY` 環境変数を設定して次のコマンドを実行することで、簡単に結果の Docker イメージをビルドし、プッシュすることもできます。
make build
make push
Mayhem UI または Mayhem CLI を使用して、アップロードされた go-base-executable-mayhemit-out-of-bounds Docker イメージに対して Mayhem ランを実行します。Mayhemfile は次のようになっているはずです。
Mayhem UI または Mayhem CLI を使用して、アップロードされた go-base-executable-mayhemit-out-of-bounds Docker イメージに対して Mayhem ランを実行します。Mayhemfile は次のようになっているはずです。
1 2 3 4 5 6  |  | 
1 2 3 4 5 6  |  | 
最終的なラン ページは次のように表示されるはずです。
おめでとうございます! Mayhem がインデックス境界外の欠陥を発見しました。スクラッチからベース実行ファイル Go ターゲットをビルドし、Mayhem を使用してバグを検出できました。
✏️ まとめと振り返り¶
このレッスンでは、Mayhem でベース実行ファイル Go ターゲットをコンパイルし、テストする方法を学びました。
学習内容
1. 到達可能なアサーションの欠陥があるベース実行ファイル Go ターゲットをコンパイルし、テストする。
- 
ソース コードには次の欠陥が含まれているはずです:
1 2 3 4 5 6 7 8 9 10 11 12 13
func mayhemit(bytes []byte) int { content := string(bytes) if len(content) >= 3 { if string(content[0]) == "b" { if string(content[1]) == "u" { if string(content[2]) == "g" { panic("found a bug!") } } } } return 0 } - 
ベース実行ファイル Go ターゲットをファジングするには、次の
DockerfileおよびMayhemfileを使用して Go 実行ファイルを含む Docker イメージをビルドし、Mayhem でファジングを実行します。1 2 3 4 5 6 7
FROM golang:1.13.3-buster as go-target COPY mayhemit.go . RUN go build -o mayhemit -a mayhemit.go # Set to fuzz! ENTRYPOINT [] CMD /go/mayhemit @@1 2 3 4 5 6
image: <DOCKERHUB_USERNAME>/go-base-executable:latest duration: 90 project: mayhem-examples target: go-base-executable cmds: - cmd: /go/mayhemit @@1 2 3 4 5 6
image: $MAYHEM_DOCKER_REGISTRY/forallsecure/go-base-executable:latest duration: 90 project: mayhem-examples target: go-base-executable cmds: - cmd: /go/mayhemit @@ 
2. インデックス境界外の欠陥の欠陥があるベース実行ファイル Go ターゲットをコンパイルし、ファジングする。
- 
ソース コードには次の欠陥が含まれているはずです:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
func mayhemit(bytes []byte) int { content := string(bytes) if len(content) >= 3 && len(content) < 5 { if string(content[0]) == "b" { if string(content[1]) == "u" { if string(content[2]) == "g" { var x = content[10] fmt.Println(x) } } } } return 0 } - 
ベース実行ファイル Go ターゲットをファジングするには、次の
DockerfileおよびMayhemfileを使用して Go 実行ファイルを含む Docker イメージをビルドし、Mayhem でファジングを実行します。1 2 3 4 5 6 7
FROM golang:1.13.3-buster as go-target COPY mayhemit.go . RUN go build -o mayhemit -a mayhemit.go # Set to fuzz! ENTRYPOINT [] CMD /go/mayhemit @@1 2 3 4 5 6
image: <DOCKERHUB_USERNAME>/go-base-executable-mayhemit-out-of-bounds:latest duration: 90 project: mayhem-examples target: go-base-executable-mayhemit-out-of-bounds cmds: - cmd: /go/mayhemit @@1 2 3 4 5 6
image: $MAYHEM_DOCKER_REGISTRY/go-base-executable-mayhemit-out-of-bounds:latest duration: 90 project: mayhem-examples target: go-base-executable-mayhemit-out-of-bounds cmds: - cmd: /go/mayhemit @@ 

