
dtls-fuzzer は、DTLSサーバのプロトコル状態ファジングを実行するJavaツールです。具体的には、以下の機能をサポートしています:
dtls-fuzzer は [TLS-Attacker][tlsattacker] を使用して、DTLSメッセージの生成/解析と状態の維持を行います。
そのために、TLS-Attacker はDTLSサポートのために拡張されています。
dtls-fuzzer は、DTLS拡張を実装した TLS-Attacker の[バージョン3.0b][tlsattackerver] に依存しています。
アーティファクトには以下が含まれます:
dtls-fuzzer のルートディレクトリで最も重要なフォルダは:
'experiments/results' には実験結果が含まれており、これが作業の主な出力です。特に、
出力フォルダは実験構成に基づいて命名されています。すなわち:
例として、フォルダ名 'jsse-12_rsa_cert_none_rwalk_incl' は、JSSE 12のDTLS実装での実験を示し、RSAハンドシェイクを実行するための入力を含むアルファベットを使用し、クライアント証明書認証は無効で、テストアルゴリズムはランダムウォーク、再送信が含まれています。
出力フォルダには以下が含まれます:
評価者は、たとえば 'included' 内の実験結果が表4に表示されているものと一致すること、または表2でテストされた構成が 'all_ciphers' にも現れることを確認できます。 論文に登場するモデルは大幅な枝刈り/トリミングの結果であるのに対し、出力フォルダに現れるモデルは未変更であることに注意してください。
dtls-fuzzer を評価するためには、以下の手順を実行する必要があります:
この評価セクションの後には、dtls-fuzzer の主なユースケースを紹介する使用方法ガイドがあります。
dtls-fuzzer は Ubuntu 18.04 および Debian 9 のLinuxディストリビューションでテストされています。 最近のLinuxディストリビューションであれば動作するはずです。 他のプラットフォームのサポートはテストされていません。 このガイドでは、Debianベースのディストリビューション('apt-get' があるもの)を使用することを前提としています。
Java 8 JDK(Java Development Kit)仮想マシン(VM)が必要です。 実験の実行に使用されたバージョンは1.8.0_222ですが、それ以降のJava 8バージョンでも動作するはずです。 このツールはJava 9以降ではビルドできないことに注意してください。 また、依存関係管理/デプロイのために maven('mvn' ユーティリティ)にも依存しています。
十分に強力なマシンを使用することをお勧めします。そうしないと、応答待機時間などのタイミングパラメータが低すぎて、論文で得られたものと異なる出力が生成される可能性があります。 さらに悪い場合、学習実験が失敗する可能性があります。 元の実験はマルチコアサーバで実行されましたが、i7プロセッサを搭載したデスクトップでも学習が可能であると期待されます(徹底的にはテストされていませんが)。 タイミングパラメータを適切に調整すれば、より弱いシステムでも学習は可能です。 最後に、.dotモデルを.pdfにエクスポートして可視化するには、[graphvizライブラリ][graphviz]のインストールが必要です。 graphvizが提供する 'dot' ユーティリティがシステムのPATHに配置されていることを前提とします。
要約すると、推奨される前提条件は次のとおりです:
dtls-fuzzer にはJava 8 JDK(Java Development Kit)が必要です。 Javaがインストールされていない場合は、OpenJDK実装を(Ubuntuでは 'apt-get' 経由で)インストールします。このサブセクションの残りはスキップできます。
> sudo apt-get install openjdk-8-jdk
Javaのバージョンがインストールされている場合、次のコマンドでバージョンを確認できます:
> java -version
バージョンコードは1.8で始まる必要があります(例:1.8.0_242)。仮想マシンは「Server VM」である必要があります(フルJDKがインストールされていることを示し、ランタイム環境のみではないことを示します)。 そうであれば、Javaに関しては完了です。 そうでない場合は、Java 8 JDKがプラットフォームにインストールされているが現在選択されていない可能性があります。インストールされているJava VMをリスト表示するには、次のコマンドを使用します:
> update-java-alternatives --list
Java 8 JDKが表示される場合は、同じコマンドを使用してJava 8 JDKをデフォルトのJava実装として構成できます。
> sudo update-java-alternatives --set java-1.8.0-openjdk-amd64
それ以外の場合は、冒頭で示した完全なインストールを実行する必要があります。 残念ながら、'update-java-alternatives' が成功しない場合があり、「error」メッセージが表示されます。 そのような場合は、'update-alternatives' を使用して、'java'(インタプリタ)と 'javac'(コンパイラ)で選択されるJava VMを対話的に構成できます。
> sudo update-alternatives --config java
> sudo update-alternatives --config javac
Java 8が設定されたら、他の依存関係(maven、graphviz、およびいくつかの一般的なSUT依存関係)をインストールします。 次に、dtls-fuzzer のリポジトリを選択したフォルダにクローンし、アーティファクトブランチをチェックアウトします。 最後に、そのフォルダを現在のディレクトリにします。
> sudo apt-get install maven graphviz autotools-dev automake libtool
> git clone -b usenix20-artifact https://github.com/assist-project/dtls-fuzzer.git ~/dtls-fuzzer
> cd ~/dtls-fuzzer
まず 'prepare.sh' スクリプトを実行します。これにより、dtls-fuzzer が依存するライブラリ(2つのローカル.jarとTLS-Attacker 3.0b)がインストールされます。 次に、ツール自体をインストールします。 POSIXシステムでの結果のコマンドは次のようになります:
> bash prepare.sh
> mvn clean install
これらの手順の後、'dtls-fuzzer.jar' を含む 'target' というディレクトリが構築されているはずです。 これが実行可能なライブラリです。 この時点以降、コマンドは dtls-fuzzer のルートディレクトリから実行されることを前提としています。
PSK(事前共有鍵)のみを使用してOpenSSL 1.1.1bのモデルを生成するとします。 dtls-fuzzer のクイックランは次のように進みます。
まず、'setup_sut.sh' スクリプトによって自動的にSUTをセットアップします。
> bash setup_sut.sh openssl-1.1.1b
次に、'args/openssl-1.1.1b' フォルダから引数ファイルを選択します。 いくつかの引数ファイルから選択できることに注意してください。具体的には:
learn_openssl-1.1.1b_all_cert_none_rwalk_incl
learn_openssl-1.1.1b_all_cert_nreq_rwalk_incl
learn_openssl-1.1.1b_all_cert_req_rwalk_incl
learn_openssl-1.1.1b_psk_rwalk_incl
対象の引数ファイルは 'learn_openssl-1.1.1b_psk_rwalk_incl' です。ファイル名がPSKを示しているためです。 したがって、それを選択し、ファザーを実行します。 さらに、学習時間を短縮するために、テスト数を200に制限します。 最後に、OpenSSLの場合、LD_LIBRARY_PATH を実装のディレクトリ ('suts/openssl-1.1.1b/') に設定する必要があります。 学習を実行する前に、セットアップが機能していることを確認するために簡単なテストを実行するとよいでしょう。 適切なテストは、ハンドシェイクを完了することです。 引数ファイルと、'examples/tests' からの対応するテストをパラメータとして指定します。
> LD_LIBRARY_PATH=suts/openssl-1.1.1b/ java -jar target/dtls-fuzzer.jar @args/openssl-1.1.1b/learn_openssl-1.1.1b_psk_rwalk_incl -test examples/tests/psk
すべてがうまくいけば、サーバは「This is a hello message」と出力するはずです。これはハンドシェイク完了後に送信するメッセージです。 セットアップが機能していることがわかったので、次のコマンドで学習を開始できます:
> LD_LIBRARY_PATH=suts/openssl-1.1.1b/ java -jar target/dtls-fuzzer.jar @args/openssl-1.1.1b/learn_openssl-1.1.1b_psk_rwalk_incl -queries 200
実験の出力ディレクトリ 'output/openssl-1.1.1b_psk_rwalk_incl/' が作成されたことに気づくでしょう。 このディレクトリを 'ls' して、実験の現在のステータス(生成された仮説の数など)を確認できます。
> ls output/openssl-1.1.1b_psk_rwalk_incl/
すべてがうまくいけば、20〜30分後に出力ディレクトリに 'learnedModel.dot' ファイルが含まれているはずです。 graphvizの 'dot' ユーティリティを使用してファイルを可視化し、.pdfにエクスポートして、お気に入りの.pdfビューアで開きます。
> dot -Tpdf output/openssl-1.1.1b_psk_rwalk_incl/learnedModel.dot > output/openssl-1.1.1b_psk_rwalk_incl/learnedModel.pdf
> evince output/openssl-1.1.1b_psk_rwalk_incl/learnedModel.pdf
最後に、'trim_model.sh' を使用して、より良い/トリミングされたバージョンのモデルを生成できます。次のように実行します:
> bash trim_model.sh --output output/openssl-1.1.1b_psk_rwalk_incl/nicerLearnedModel.dot output/openssl-1.1.1b_psk_rwalk_incl/learnedModel.dot
> dot -Tpdf output/openssl-1.1.1b_psk_rwalk_incl/nicerLearnedModel.dot > output/openssl-1.1.1b_psk_rwalk_incl/nicerLearnedModel.pdf
> evince output/openssl-1.1.1b_psk_rwalk_incl/nicerLearnedModel.pdf
これで、モデルを仕様と照合してシステムの適合性を判断できます...