zzufを使ったファズテスト

 ソフトウェアにランダムな入力を与えてバグを見つけだすファズテスト(fuzz testing)は、ITセキュリティにおいてかなり前から非常に大きな関心事になっていた。だが、zzufという小さいながらも素晴らしいプログラムのおかげで、今では迅速かつ容易に自前でファズテストを実行できるようになっている。

 ファズテストが大いにもてはやされているのは、注意力に乏しいユーザのせいだ。そう、金額を入力すべきところに日付を入れたり、名前の欄に数字を入力したり、社会保障番号(SSN)の欄に郵便番号を入れたりするユーザのことである。彼らによる不適切な操作は、直ちにプログラムの異常終了につながることが多い。セグメンテーションフォールト、バッファオーバーランなどあらゆる種類のクラッシュを引き起こす。そうしたクラッシュの中には、悪用にうってつけで、悪意のある人物によるシステムやデータへのアクセスを許してしまうものもある。たとえば、昨年の今頃行われたBlackHatでほぼ明らかになったWi-Fiの脆弱性は、予期せぬデータを用いたWi-Fiドライバのファズテストによって見つかったものだ。

 ファズテストでは、一定のサイズ、種類、フォーマットの入力が想定されているアプリケーションに対して、ありとあらゆる入力を放り込んだり、ときには何も入力しなかったりする。現在の多くのプログラムが比較的安定していてセキュアなのは、隠れた欠陥がファズテストによって見つかっているからだ。

 zzufプロジェクトのホームページによると、zzufはVLCメディアプレーヤのバグを見つけだすためのツールとして誕生したという。その後、より広い用途に使えるように拡張されてきた。

 zzufは簡単にインストールできる。プロジェクトのページからzzuf-0.9.tar.gzをダウンロードしたら、tarballを展開して、それによってできるzzuf-0.9サブディレクトリに入って./bootstrapスクリプトを実行する。続いて、標準的な./configuremakesudo make installの実行手順に従う。なお、私が今回zzufをインストールした先は、Ubuntu Feisty Fawnである。

 ビルドにより、zzufの実行ファイルのほか、zzcatという別のプログラムとtestsuite.shというスクリプトも作成される。このスクリプトを実行すると、200種類以上のテストが実行された。プログラムの作者であるDebian Project LeaderのSam Hocevar氏は次のように説明している。

zzufのテストスイートには、リグレッションテストスイートとしての役割と、zzufが使用中のオペレーティング上で正しく動作するかどうかのチェック機構としての役割がある。このテストスイートにより、いくつかの既存のプログラム(cat、sed、grep)とzzcat(ランダムバイトの読み込み、不正な位置のシーク、ファイルのmmap()など、ファイル記述子の何種類もの動作を実行するカスタムプログラム)がさまざまなテストファイル上でzzufを介して実行される。すべてのプログラムで同じ結果が出れば、重要なライブラリ呼び出しがすべてzzufによって適切にとらえられたことになる。

テストでの使用

 以下に、非常に簡単なzzufの使用例を示す。Hocevar氏がオンラインで公開しているzuffの説明資料から借用したものだ。zuffがどのように動作するかを確かめるために、単純なテキストファイルの内容を画面にダンプするcatへの入力テキストをランダム化してみよう。

 次のようなデータを含むtest.txtという名のテキストファイルがあるとする。

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

 普通にcat test.txtというコマンドを入力すると、上記のテキストデータがそのままコンソールに表示される。ここで、代わりにzzuf cat test.txtというコマンドにすることで、catへの入力データをランダム化すると出力結果は次のようになる。

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXZXXXXXXXXXXXXXZYXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXxXXXXXXXXXXXXXXXXXXXXXXXXXXXXXxXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXZXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

 このコマンドは何度か繰り返し実行しても、出力結果が毎回まったく同じになることに注意してほしい。これがzzufの重要な点である。特定の結果をもたらすテストを正確に再現できるのだ。テストの内容がどんなに複雑になっても、探し求めている検出と補足が困難なバグを繰り返し発現させることができる。

 もちろん、zzufではこのcatを使った例よりもずっと複雑なテストが行える。説明書や入門書は用意されていないが、インストール中に作成されたmanページにzzufの使い方に関する情報が記されている。また、-hオプションを付けてzzufを実行すると、各種機能について簡単に説明したヘルプページが表示される。

 Xineをテストするために初めて私がzzufを試したときには、以下のエラーメッセージが出て、それ以上先に進めなかった。

Xlib: connection to ":0.0" refused by server
Xlib: No protocol specified

 Googleで調べたところ、この問題への対処法が得られた。zzufテストの実行前にxhost local:rootというコマンドが必要なだけだった。不思議なことに、このコマンドによってzzufは私のUbuntu環境で動作しているXサーバに接続できるようになった。

 zzufはまだベータ版だが、ファズテストに関心があって自分の好きなアプリケーションで使ってみたいなら、今すぐ試すとよいだろう。まだファズテストに興味がない人には、ぜひ興味を持ってほしい。というのも、zzufはアプリケーションのクラッキング手法としても使えるからだ。あなたのコードから悪用可能な脆弱性を見つけ出すのは、あなた自身か、それとも他の誰かかもしれない。

Linux.com 原文