今月の「Patch Tuesday」では、以下に示す「緊急」レベルのセキュリティ・パッチがリリースされました。

 この脆弱性は、Microsoft Officeファイルを開くだけで、そのファイル中に記述されたマシン・コードがユーザーの確認無しに実行されてしまうというものです。この種の脆弱性は、いわゆる「受動的攻撃」を成立させますので危険です。MicrosoftのSecurity Bulletinでも、危険度は「緊急」に設定されています。

 今回は、このMS06-012の脆弱性を取り上げ、受動的攻撃の概要とその危険性について解説したいと思います。また、そのような種類の脆弱性を効率的に発見する手段としてよく利用されている「File Fuzzing法」についてお話しします。

能動的攻撃と受動的攻撃

 ソフトウエアに潜むほとんどの脆弱性は、「能動的攻撃を成立させる脆弱性」と「受動的攻撃を成立させる脆弱性」の2種類に分類できます。しかし、Microsoftをはじめ、多くのソフトウエア・ベンダーから発表されるセキュリティ情報では明確に区別されておらず、「リモートから攻撃可能」といった表現で統一されています。

 これは、一般ユーザーにも脆弱性の脅威を理解しやすくするためだと思いますが、能動的攻撃と受動的攻撃では攻撃のアプローチが大きく異なります。脆弱性の脅威を正確に分析するためには、その違いを知ることが非常に重要です。

 まず、能動的攻撃を成立させる脆弱性について解説します。これは、基本的に「ターゲット・システムの正規の利用者が何らかのアクションをすることなく、攻撃者のアクションだけで攻撃を成立させることができる脆弱性」と定義できます。例えば、以下のような種類の脆弱性が該当します。

  • MS Blasterが悪用した「RPC DCOMの脆弱性」や、Sasserが突いた「LSASSの脆弱性」など、リモート・システムから何らかのパケットを送ることで任意のコードを実行できる脆弱性
  • TCP/IPスタックやネットワーク・サービスをリモートからクラッシュさせる、いわゆるリモートDoS(サービス拒否)攻撃を成立させることができる脆弱性
  • SQLインジェクションやOSコマンド・インジェクションのような、一部のWebアプリケーションの脆弱性
  • 「MS06-011」やUNIXのsuidコマンドのバッファ・オーバーフローのように、権限昇格を可能にする脆弱性

 これらの脆弱性の最大の特徴は、ターゲット・システムの正規の利用者が攻撃のプロセスに介在しないということです。つまり、能動的攻撃を成立させる脆弱性が存在すると、正規の利用者がシステムを利用する/しないにかかわらず、攻撃を受ける可能性があるということです。

 それに比べ、受動的攻撃を成立させる脆弱性は、「ターゲット・システムの正規の利用者やターゲット・ユーザーが、何らかのアクションをすることで初めて攻撃が成立する脆弱性」と定義することができます。例えば、以下のような脆弱性が挙げられます。

  • Windows メタファイル脆弱性(MS06-001)やGDI+の脆弱性(MS04-028)のように、Webブラウザやメーラーといったネットワーク・クライアントを介して任意のコードを実行させることができる脆弱性
  • 動画再生アプリケーションやファイル・アーカイバの解凍機能に存在するバッファ・オーバーフロー脆弱性
  • クロスサイト・スクリプティング脆弱性

 これらの脆弱性を攻略するには、ターゲット・システムの正規の利用者やターゲット・ユーザーを、何らかの形で罠にはめることが必須条件となります。つまり、攻撃者が設置した特定のWebサイトを閲覧させたり、攻撃者が作成した特殊なZIPファイルを解凍させたりするなど、何らかの方法で攻撃者が仕掛けた罠に誘導する必要があります。

 3月のPatch Tuesdayで公開されたMicrosoft Office の脆弱性は、Officeファイルを開くとその中に記述された任意のコードが動作してしまうというものですので、典型的な受動的攻撃を成立させる脆弱性であると言えます。

受動的攻撃の危険性

 このように比較すると、一見、受動的攻撃を成立させる脆弱性よりも、能動的攻撃を成立させる脆弱性の方が圧倒的に危険であるように思えます。実際、脆弱性単体で考えた場合、能動的にリモートのターゲットを完全に掌握できる脆弱性は非常に危険です。特に、公開サーバーの公開サービスに能動的攻撃を成立させる脆弱性がある場合には致命的です。

 しかし最近では、その危険性が広く認識されてきましたので、以前に比べて脆弱性の管理が進んでいます。また、一般家庭にもルーターが普及してきましたので、一般ユーザーが能動的攻撃を受ける機会も以前に比べて減ってきました。

 しかしその一方で、受動的攻撃を許す脆弱性は相変わらず放置されていることが多々あります。Windows Updateをきちんと実施しているユーザーでも、Real PlayerやQuick Time、Acrobat Readerなどについては、あまりアップデートしていないというケースは少なくないでしょう。

 また、受動的攻撃の多くはファイアウオールなどで防ぐことが難しいため、その攻略のハードルは能動的攻撃よりもむしろ低くなるケースが多いと言えます。

 このため、特定のターゲットを掌握するための“ピンポイント攻撃”には非常に有効的な手段になり得ます。また、能動的な攻撃手法では攻略が極めて難しいネットワークでも、デスクトップ・アプリケーションに対する受動的攻撃を利用すれば、容易にネットワーク内部のシステムを掌握できる場合があります。

受動的攻撃のアタック・ベクターと脆弱性の発見

 受動的攻撃の場合、その性質上、細工したファイルをアプリケーションに開かせることで攻撃が成立するというパターンが多数を占めます。つまり、アタック・ベクター(攻撃経路)は「ファイル」になります。

 受動的攻撃を成立させる脆弱性を発見する方法としては、主に、アプリケーションをリバース・エンジニアリング(ソースコードがあればソースコードを解析)する方法と、適当に細工したファイルをアプリケーションに開かせてその挙動を見るという2通りのアプローチがあります。どちらにも長所と短所がありますが、簡単に発見できる脆弱性をあぶりだすためには、後者の方が明らかに効率が良いと言えます。

 とはいえ、人手で様々なパターンのファイルを作成して試すことは、結構時間がかかる作業になります。複雑なバイナリ・ファイルであればなおさらです。このため数年前からは、ファイル・フォーマットに関する脆弱性の監査に「Fuzzing」と呼ばれる自動化手法がよく用いられます。

File Fuzzing

 Fuzzingとは、“ブルートフォース的”に、手当り次第に色々なパターンを試してみるという手法です。この手法をファイルに適用することをFile Fuzzingと呼びます。例えば、ファイル中に文字列らしきものを見つけた場合には、そこに色々な長さの文字列をセットして開いてみることで、バッファ・オーバーフロー脆弱性を発見できるかもしれません。また、文字列長らしきフィールドを見つけたら、そこに長大な値を設定して開いてみることで、整数オーバーフロー脆弱性を発見する可能性があります。

 このような手法をツール化したものを「File Fuzzer」などと呼びます。脆弱性を数多く発見している個人やセキュリティ・ベンダーは、独自のFile Fuzzerを開発して使っていることが多いようです。eEyeでも、「EVE」や「UFuz3」といったFuzzerを作成して監査しています。eEyeのアドバイザリで公開されたいくつかの脆弱性は、これらツールにより発見されました。


eEyeが開発したFile Fuzzer「UFuz3」
[画像のクリックで拡大表示]

「UFuz3」のユーザ・インタフェース。ウイザード形式で簡単にFuzzingを実行できる
[画像のクリックで拡大表示]

 今回は、受動的攻撃を成立させる脆弱性についてお話しました。File Fuzzingの具体的な手法については、折を見て「Security Tech」で解説したいと思います。