ファジング入門(続:セキュリティ・ミニキャンプ in 東北 2015に参加してきた)

学生の田中ァです.

この記事は岩手県立大学AdventCalendar2015の18日目です.

先月開催されたITイベントに参加してきたという内容ですが,そろそろ書かないといけないけど書くきっかけがなかったので,この記事を読んだ大学関係者の皆さんにとって,セキュリティを考えるきっかけとなればいいなと思い,AdventCalendarに登録させていただきました.

内容もファジングというセキュリティテストを取り上げたものなのでソフトウェア開発をする皆さんにとっても参考になるものではないかなと思います.

どうかお付き合いください.

はじめに

前回 tanakaxa.hatenablog.jp

11月にセキュリティ・ミニキャンプ東北に参加してから1ヶ月もたってしまいました.

前回の記事を公開してから「もっといっていい」「もっと深く」と運営のあるお方からご意見をいただき,講師の先生方からも条件付きで書いても良いという許可をいただきましたので,2日目午後の「ファジング実践」についてどのような事をやったのかをもう少し詳しく書きたいと思います.

ファジング入門

ファジングとは

組み込み機器やソフトウェア製品のバグや脆弱性を検出するセキュリティテストのことです.

製品に対し問題が起きそうなデータ「ファズ」を送り付け,異常な動作が起きないかをテストします.

Webサーバのアプリケーションを例として考えます.

アプリケーションは以下のようなGETリクエストを受け付け処理をします.(リクエスト行以外省略)

GET http://localhost/index.html HTTP/1.1

もしもGETリクエストのURIが以下のようにとても長い文字列が含まれているとアプリケーションはどうなるでしょうか?

GET AAAAAAAAA...(略)...AA HTTP/1.1

エラー400が返ってくるくるのであれば良いのですが,URIを入れるバッファが溢れサーバアプリケーションが死んでしまうかもしれません.

このようにファジングを行うことで,ソフトウェア製品のバグ・脆弱性を見つけ,出荷前に減らすことができます.

ファズ

Webサーバのアプリケーションであれば文字列がファズの形式になりますが,ファイルを扱うアプリケーションであればファイルがファズの形式となります.

上記例ではオーバーフローを狙ったファズを紹介しましたが,他にも書式文字列問題を狙ったファズ(%s%s%s)や整数オーバーフローを狙ったファズも上げられます.

このようにファズは目的によって多種多様な形式・パターンとなります.列挙しつくすのは大変なので,ファズは「問題を起こしそうなデータ」と覚えておけば良いでしょう.

ファジングツール

ファズを生成して送信し異常がないかを監視する,ファジングツールというものがあります.ファジングツールは生成されるファズの種類が多種多様なように多数のツールがあります.

ファジングツールIPAの「ファジング活用の手引き」の付録で紹介されています.

http://www.ipa.go.jp/security/vuln/documents/fuzzing-guide.pdf

ファジング実践

ミニキャンプではPeachというファジングツールを使って,古いWebサーバアプリケーションに対してファジングを体験しました.次からは実際にアプリケーションに対しファジングをする手順を書きたいと思います.

ファジングツール Peach

f:id:tanakaxa:20151217162402p:plain Peach Fuzzer

PeachはMITライセンスで公開されているファジングツールです. WindowsLinuxOS Xで動作します.

Peachはファイルによるファジングからネットワークを介したアプリケーションへのファジングに対応しています.

公式では3が最新版として公開されていますが,IPAの資料を参照している点やHTTPのサンプルPitファイルの都合から2.3を使って説明します.

Pitファイル(設定ファイル)の作成

PeachはPitファイルと呼ばれるxml設定ファイルを用意して実行します.HTTPのリクエストをファズとする場合,そのリクエストを元に作成していきます.

HTTPリクエストをファズとするのであればサンプルフォルダにあるHTTP.xmlを参考にIPAのファジング実践資料を読むと,わかりやすいです.説明は長くなるので省略します.

ミニキャンプの演習では専用のxmlファイルが用意されており,死にそうな場所に目星を付けファズの注入箇所を変えながら実行しました.

実行する

> peach.bat HTTP.xml

実行ファイルを引数に与え実行します.

f:id:tanakaxa:20151217165419p:plain

左側の括弧の中の数字はテストの進み具合を表しています.

[現在のテスト番号:総テスト数]

実行中はプロセスが生きているかどうかなど異常がないか対象を監視する必要があります.

何事も問題がおきずすべてのテストが終了すれば"今回用意したテストパターンでは"脆弱性が見つからなかったことになります.

問題を起こしたファズを特定する

もしもアプリケーションが異常終了したり暴走した場合は原因となったファズを特定します.

Peachにはオプションでテスト番号を指定し,何番からいくつまでテストといったことが可能になっています.1つのファズが原因かもしれませんし,複数のファズが重なったことによる原因かもしれません. 根気よくテスト件数を減らしながら探していきましょう.

原因を特定する

問題を起こしたファズを特定したら原因を特定します.

今回の場合,ファズはGETリクエストなのでパケットをキャプチャし中身を見てみましょう.Wireshark,使いやすくていいですよね!

パケットを観察し原因を特定したら原因となったアプリケーションのコードを修正します.

おわりに

かなり端折りながらPeachを用いたWebサーバアプリケーションへのファジング手順を書きました.

ミニキャンプでは修正前のWebサーバアプリケーションを対象にファジングを行い,原因を特定するところまでやりました.

Pitファイルなどの準備は大変かと思いますが,1回やってしまえば同じような製品には使いまわせるかもしれませんし,リリース前にバグや脆弱性を潰せるメリットはかなり大きいと思います.

今後社会に出てコードを書くことも非常に多いと思うのでぜひ活用していきたいです.

参考資料

ファジングについてはIPAのサイトに多くの手引書があります. 興味がわいた方はぜひ読んでみてください.

www.ipa.go.jp

明日の県大AdventCalendarはarthur87さんです.よろしくお願いします.

qiita.com