GitLab Protocol Fuzzer Community Editionの導入からチュートリアルまで

# はじめに
ブラックボックスファジングに興味があったので、2021年3月にオープンソース化された[GitLab Protocol Fuzzer Community Edition](https://gitlab.com/gitlab-org/security-products/protocol-fuzzer-ce)を触ってみました。
本記事ではGitLab Protocol Fuzzer Community Editionの導入からチュートリアルまでの手順を記述します。

# 導入
ソースからビルドするのがやや面倒だったため、[issue](https://gitlab.com/gitlab-org/security-products/protocol-fuzzer-ce/-/issues/2)にて提供されていたDockerfileを利用してDockerイメージをビルドしました。
Dockerfileは[こちら](https://github.com/vanhauser-thc/peachpro)から入手できます。
```bash
$ git clone https://github.com/vanhauser-thc/peachpro.git
$ cd peachpro
$ docker image build -t peach ./ 
```

# Hello World
`doc/samples/`にいくつかサンプルファイルがあったので、ひとまず`HelloWorld.xml`を実行します。
```bash
$ docker container run -it --rm --entrypoint "bash" --name peach-container peach
root@xxx# ./peach ./doc/samples/HelloWorld.xml 
```
上記コマンドを実行したところ、ターミナルに様々な文字列が出力され続けました。（Ctrl-Cで中断できます）

# Tutorials (Dumb Fuzzing)
GitLab Protocol Fuzzer Community Editionの前身である[Peach Fuzzer](https://peachtech.gitlab.io/peach-fuzzer-community/)の[Tutorials (Dumb Fuzzing) ](https://peachtech.gitlab.io/peach-fuzzer-community/v3/TutorialDumbFuzzing.html)を参考に、実際にファジングを行ってみます。
具体的には、画像表示ソフト`feh`に対して様々な`.png`ファイルを読み込ませるファジングを行います。
なお、以降の`xml`ファイルについての解説は調査中により推測も含みますので、誤りがありましたらご指摘いただけると幸いです。

## Creating the data model
[こちらのページ](https://peachtech.gitlab.io/peach-fuzzer-community/v3/TutorialDumbFuzzing/CreateDataModel.html)の`template.xml`に相当するファイルが`peach/`内に見つからなかったので、`HelloWorld.xml`をひな形にしてTutorialを進めます。
```bash
root@xxx# cd /peach/pits/
root@xxx# cp ../doc/samples/HelloWorld.xml ./png.xml
```
DataModelエレメントでは、ファジング用のデータ生成に使用するデータの形式を指定します。
`Number`、`Blob`、`String`などを指定できますが、今回は`Blob`を指定します。
```png.xml
（中略）
<DataModel name="TheDataModel">
    <Blob />
</DataModel>
（中略）
```

## Creating the state model
StateModelエレメントでは、ファジング用のファイルを読みだす`output`、ファイルを閉じる`close`、起動するアプリケーションを指定する`call`を記述します。
```png.xml
（中略）
<StateModel name="TheState" initialState="Initial">
    <State name="Initial">
        <Action type="output">
            <DataModel ref="TheDataModel"/>
            <Data name="data" fileName="/peach/doc/samples/samples_png/*.png"/>
        </Action>
        <Action type="close"/>
        <Action type="call" method="LaunchViewer" publisher="Peach.Agent"/>
    </State>
</StateModel>
（中略）
```

## Configuring a publisher
前節で設定した`publisher`を呼び出します。
```png.xml
（中略）
<Test name="Default">
    <Publisher />
</Test>
（中略）
```

## Adding an agent and monitor
調査中

最終的に`png.xml`は以下の内容になります。
```png.xml
<?xml version="1.0" encoding="utf-8"?>
<Peach xmlns="http://peachfuzzer.com/2012/Peach" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://peachfuzzer.com/2012/Peach ../peach.xsd">

	<DataModel name="TheDataModel">
		<Blob />
	</DataModel>
	
	<StateModel name="TheState" initialState="Initial" >
		<State name="Initial"  >
			<Action type="output" >
				<DataModel ref="TheDataModel"/>
				<Data name="data" fileName="/peach/doc/samples/samples_png/*.png"/>
			</Action>
			<Action type="close"/>
			<Action type="call" method="LaunchViewer" publisher="Peach.Agent"/>
		</State>
	</StateModel>

	<Agent name="LinAgent">
		<Monitor class="LinuxDebugger">
			<Param name="Executable" value="feh"/>
			<Param name="Arguments" value="fuzzed.png"/>
			<Param name="CpuKill" value="true"/>
		</Monitor>
	</Agent>

	<Test name="Default">
		<Agent ref="LinAgent" platform="linux"/>
		<StateModel ref="TheState"/>
		<Publisher class="File">
			<Param name="FileName" value="fuzzed.png"/>
		</Publisher>

		<Strategy class="Random"/>

		<Logger class="Filesystem">
			<Param name="Path" value="logs" />
		</Logger>
	</Test>

</Peach>
```

## ファジングの実行
コンテナ内で以下のコマンドを実行します。
```bash
# fehをインストール
root@xxx# apt install feh

# fehに対してファジングを実行
root@xxx# peach png.xml
```

ファジングが正しく実行されれば以下のような画面になります。
![fuzzing.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/471917/c7b4e13f-0e00-7815-93d1-cfe649047a2c.png)

# あとがき
本記事ではGitLab Protocol Fuzzer Community Editionの導入とチュートリアルの解説を行いました。
チュートリアルに関してはまだ理解が不足していますので、後々追記していきたいと思います。

# 参考文献
[IoT診断とファジング - ラック・セキュリティごった煮ブログ](https://devblog.lac.co.jp/entry/20210712)
[Peach Fuzzer](https://peachtech.gitlab.io/peach-fuzzer-community/)
[IPA ファジング実践資料](https://www.ipa.go.jp/files/000057628.pdf)
# 環境
Ubuntu 20.04