特定課題研究報告
2017年度卒業生 松井研究室 福山 潤
ファジングツールの構造的解析
A
Structural Analysis of Fuzzing Tools
研究概要
「ファジング」という脆弱性検査手法に着目し、パケットを対象としたファジングツールの構造を理解するとともに、現在使用されているファジングツール3種に対して、それぞれのツールの構造単位でファジングツールの機能比較を実施しました。
ファジングとは
ファジングとは、脆弱性検査手法のうちの一つです。脆弱性検査手法は、現在様々な種別が存在しています。一般社団法人
重要生活機器連携セキュリティ協議会(CCDS)は、これらの脆弱性検査手法を静的に行うものと動的に行うものに分類した後、それぞれの手法がどのような脆弱性の検出に向いているかを一覧にしています。
上図は、CCDSの表をもとに作成したものですが、ファジングは動的検証手法のうち、脆弱性スキャンチェックやペネトレーションテストと違って、唯一、未知の脆弱性の検出ができると評価しています。
また、制御機器のセキュリティ保証に関する認証制度(EDSA認証)の中では、ソフトウェア開発セキュリティ評価の要求項目のひとつとしてファジングが挙げられています。このことからも、ファジングは他の手法に替えることのできない、非常に重要な脆弱性検査手法であると言えます。
それではファジングとはどのような検査手法なのでしょうか。下図はファジングの例としてよく取り上げられるHTTPのファジングを実施した例です。赤枠の部分には、GETレスポンスの後にアルファベット大文字のAが複数回送信されていることがわかります。これはもっとも簡単なファジングの例で、本来送信すべき「/」の文字をアルファベットのAに置き換えて送信しているもので、仮に検査対象であるwebサーバ等のURI処理部分にオーバーフローの脆弱性がある場合、このデータを送信することによって、サーバがエラー処理をうまく行えず、フリーズしたりダウンしたりしてしまうわけです。
このファジングという手法は、対象のプロトコルやレイヤ等によって様々な種類がありますが、今回の調査では、プロトコルを対象としたファジングツールに着目し、調査を行いました。
調査したファジングツール
今回調査したファジングツールは、以前から使用されているPeach, Sulleyと、2016年にリリースされたBoofuzzというファジングツールです。
ファジングの構造
これらのファジングツールは、
@ 診断パターンファイル
A ファジングエンジン(ファジングツール)
B ファズデータ
それぞれの構造に分けることができます。
ファジングの事前準備として、ターゲットを決め、どのようにファジングを行うかを決める必要があります。
ファジングの構想が決まったら、使用するファジングツールが定義する方法で、ユーザが診断パターンファイルを作成します。(@)診断パターンファイルには、ターゲットのIPアドレスや送信するパケットの「どこ」にファズデータを埋め込むか等のルールを記述する必要があります。
次に、作成した診断パターンファイルをファジングエンジンに与えます(A)そうすることで、ファジングエンジンは内部の生成機からファズデータを生成し(B)、検査対象に送り付けた結果、対象がどのような動きをするのかを調査することができます。
診断パターンファイル比較
各ツールに使用する診断パターンファイルは上図のようになっており、その構造は非常に似通っていることがわかります。
ターゲットに対してファジングをすると仮定した場合、まずは、IPアドレスやポート番号等、ターゲットが何なのかを定義するところから始めます。これはTest要素やTarget 要素と呼ばれるところで記述します。
次にState Model要素では、ファズデータの入出力の定義を行います。ここでは、例えばユーザ名を入力する→パスワードを入力する→コマンドを入力する等のターゲットの状態遷移を記述します。
Data Model要素では、作成するパケットのどの部分にファズデータを埋め込むかといったルールを記述します。上記の例であればユーザ名やパスワードは変更せず、コマンドの後に送信する引数にファズデータを埋め込む、等です。
その他の大きな違いは、パターンファイルを記述する言語の違いです。PeachがXMLで記述するのに対し、SulleyやBoofuzzはpythonで記述する必要があります。
実際に診断パターンファイルを作成してわかったそれぞれのパターンファイルの違いは、主にこの言語が原因で、SulleyやBoofuzzは複数のコマンドに対して同様のファズデータを送信する等のサブルーチン呼び出しに柔軟に対応しており、記述が少なくて済むというメリットがあります。
ファジングエンジン比較
診断パターンファイルは、どこにファズデータを埋め込み、どこに送信するかというようなルールが記述されていますが、ファズデータをどのように作成するかというルールはありません。このファジングエンジンはそれぞれのツールに内蔵されており、独自のアルゴリズムでファズデータを生成していることがわかりました。
Peachは26種類のMutatorと呼ばれる生成機を使用して元の値を変化させファズデータを生成します。例えば、対象のビット値を%単位で反転させたり、対象の文字列を複製し、大きな文字列にするものが存在しています。また、Peachはファジング開始時にseed値を付与してテストしますが、このseed値を読み込み、ランダムな値を生成する方法等があります。
またこのseed値は非常に便利で、ターゲットに再度ファジングを行う際に同様のseed値を与えることで、同様のファズデータが生成可能であり、再現性のあるテストが可能となっている点がメリットとして挙げられます。
それとは変わって、SulleyやBoofuzzはそれぞれのファジングツールが持つ個別のファイルにPythonでルールが記述されています。Peachが備える生成アルゴリズムのようなものは無く、記述されたルールにのっとり値を変化させ、ファズデータを生成します。例えば上図のようなバイナリデータやSQL文等です。
どのツールも、ユーザが生成したいファズデータのルールを追記することができますが、SulleyやBoofuzzはすべてのファイルがpythonで記述されていることから、追加。改良が容易な点がメリットとして挙げられます。
ファズデータ比較
これまでの調査の結果、それぞれのファジングツールが使用する診断パターンファイルの記述方法については、それほど差異がなかったものの、ファジングエンジンに大きな違いがあるため、生成されるファズデータは大きく違うものであることがわかりました。
では、その生成したファズデータが、ファジング結果にどのような違いを生じさせるのか、実際に動作させて検証しました。
今回使用したターゲットは、FreeFloat FTP Server(バージョン1.0)を使用しました。ソフトウェアで動作するFTPサーバですが、すでに多数の脆弱性が見つかっており、公式サイトでの配布は中止されています。
動作環境は上図の通りです。FTPサーバは仮想環境のWindowsで動作させて、ホストマシンでファジングツールを動かしてテストを行いました。
作成した診断パターンファイルは、FTPサーバに通常ログインを行った後、各FTPコマンドの後にファズデータを埋め込んでターゲットに送信しその挙動でそれぞれのファジングツールを比較しました。
使用したFTPコマンドは、サーバに何らかの指令を与える45個のコマンドを選択し、それぞれのコマンドごとにファジングを行いました。
ファズデータ生成数
まずは生成されたファズデータの数を比較しました。
Totalが生成したファズデータの総数、Criticalがターゲットのサーバがダウンする等、ファジングツールが脆弱性の攻撃に成功したと判断したファズデータの総数、Percentはその割合を示しています。
この表を見ると、Peachが他のツールと比べて、非常に大量のファズデータを生成していることがわかります。またCriticalなファズデータ生成率も他のツールと比較して非常に高いものとなっていました。
なお、実行に要した時間ですが、作成した診断パターンファイルに記述のdelayパラメータによって変動しますが、Peachは概ね数日間、SulleyやBoofuzzは概ね数時間でファジングを終えることができました。
カテゴライズ
次にカテゴライズの比較を行いました。
生成されたファズデータに関して、PeachはExploitable,
Probably Exploitable, Unknownと、他のツールより詳細にカテゴライズされて出力されます。上票はそれぞれの結果を一覧表示したものですが、Sulley を例に挙げて説明すると、Criticalなファズデータが合計85個生成され、それらが8つのカテゴリ(脆弱性)に分けて出力されたということを表しています。また、一番右は、生成されたCriticalなファズデータの総数と、カテゴライズされた脆弱性の個数の割合を表しています。
この表を見ると、Peachは約23000ものCriticalなファズデータを生成していますが、それらはすべて46件の脆弱性に分類されていることがわかり、不要なファズデータを何度も送信しているということが考えられます。その点、Sulley 、Boofuzzは少ないファズデータの生成数ですが、多くの脆弱性を発見しており、短時間で効率の良いファジングを行っているということが見て取れます。
コマンドごとの結果比較
この表は、ファジングに使用した計45個のFTPコマンドに対するファジング結果を比較したもので、チェックがついている項目は、対応するコマンドに対して脆弱性を発見したことを表しています。
この表を見ると、PeachはSulley やBoofuzzでも発見した脆弱性をカバーしているのと同時に、Sulley, Boofuzzでは発見できなかった脆弱性も発見できていることがわかります。
まとめ
今回の研究ではプロトコルを対象とするファジングツールについて、診断パターンファイル、ファジングエンジン、ファズデータというそれぞれの構造単位での比較・評価を行ってきました。
結果、SulleyやBoofuzzは短時間で多くの脆弱性を発見することが可能であることがわかりました。また、Peachはテストに要する時間はとても長いものの、ファジングの結果は他のツールの結果を内包しており、網羅的なファジングが可能であるということがわかりました。よって、効率的なファジングを実施するためには、ファジングにかける時間と精度によって、ファジングツールを使い分けることによって、効率的なファジングが可能であると言えます。
しかしながら、今回の検証は、一つのFTPサーバに対してのみ検証を行ったもので、診断パターンファイルについても簡潔なもので比較を行っていますので、ファジングツールの機能評価をより正確に行うには、より多くのテストを重ねる必要があります。