特集
» 2007年07月31日 09時00分 公開

Programing Bible:zzufを使ったファズテスト

ファズテストは、ITセキュリティにおいてかなり前から非常に大きな関心事になっていた。だが、zzufという小さいながらも素晴らしいプログラムのおかげで、今では迅速かつ容易に自前でファズテストを実行できるようになっている。

[Joe-Barr,Open Tech Press]
SourceForge.JP Magazine

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

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

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

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

 zzufは簡単にインストールできる。プロジェクトのページからzzuf-0.9.tar.gzをダウンロードしたら、tarballを展開して、それによってできるzzuf-0.9サブディレクトリに入って./bootstrapスクリプトを実行する。続いて、標準的な./configure、make、sudo 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はアプリケーションのクラッキング手法としても使えるからだ。あなたのコードから悪用可能な脆弱性を見つけ出すのは、あなた自身か、それともほかの誰かかもしれない。

関連キーワード

バグ | クラッキング | 脆弱性


Copyright © 2010 OSDN Corporation, All Rights Reserved.

注目のテーマ

マーケット解説

- PR -