米国時間2月17日、セキュリティ系のニュース・サイトをチェックしていると、なにやらInternet Explorer(IE)に0-dayのバッファ・オーバーフロー脆弱性が発見され、exploitまで登場しているとの事。もしこれが本当なら、この前のWMF脆弱性(IT Proの関連記事)のときのような騒ぎになるかもしれません。

 とはいえ、一口にバッファ・オーバーフロー脆弱性と言っても、前回お話しましたようにその種類や安定性は様々です。どの程度の危険性があるのかは、実際にその脆弱性を詳しく解析してみないと分かりません。今すぐにでも攻撃に悪用される恐れのあるものから、実際のところは悪用が難しくほとんど脅威にならないものもあります。本当に危険なものなら、今すぐ会社に行かねばなりません……。

 とりあえず、「Security Focus」のサイトに公開されている情報を詳しく見てみる事にしました。それによると、どうやらIE 6のVBScriptとJScriptエンジンにバッファ・オーバーフローの脆弱性があり、exploitに成功するとブラウザが強制終了、場合によっては任意のコードが実行可能であるとの事です。もし任意のコードが実行可能なら大変です。

 上記の情報源は、「porkythepig」と呼ばれる人物による「Bugtraq」メーリング・リストへの投稿のようです。同氏は米国時間2月16日午後5時14分、詳細な情報とexploitを投稿しています。投稿された情報を読むと、もう少し詳しいことが分かりました。どうやらバッファ・オーバーフローではなく、スタック・オーバーフローのようです。exploitを確認しますと、再帰呼び出しによってスタックを使い切り、IEをクラッシュさせるものでした。

バッファ・オーバーフローとスタック・オーバーフロー

 最も典型的で、かつ、簡単に攻略可能なバッファ・オーバーフロー脆弱性は、境界チェックの無い、スタックに確保されたローカル・バッファに対する文字列コピーです。これは一般的に「スタック・ベースのバッファ・オーバーフロー」などと呼ばれています。

 この言葉が“短縮”されて、まれに「スタック・オーバーフロー」などと呼ばれる事がありますが、本来、スタック・オーバーフローとは、巨大なローカル変数を確保したり、再帰呼び出しの回数が多すぎたりしてスタックが足らなくなってしまった状況を示します。ローカル・バッファがあふれてしまうバッファ・オーバーフローとは、言葉は似ていますが全く異なるものです。今回のIEの脆弱性はまさにスタック・オーバーフローです。例外コードも、通常のバッファ・オーバーフローの場合は0xC0000005(Access Violation)となりますが、今回のケースでは0xC00000FD(Stack Overflow)と表示されます。

今回の脆弱性は脅威か?

 さて、(バッファ・オーバーフローではない)スタック・オーバーフローで致命的な攻撃、すなわち、任意コードの実行は可能でしょうか?コードを実行できなければ、DoS攻撃しかできません。サーバー・プログラム等ではDoS攻撃が可能であることも深刻な問題ですが、少なくとも、ウイルス感染や攻撃者による不正侵入などを許す事はありません。しかも、今回対象になるのはクライアント・プログラムです。

 再帰呼び出しが無限に発生すると、スタックに関数からの戻り位置などの情報が蓄積され続け、最終的にスタックを使い切ってしまいます。その結果、スタック・オーバーフローによる例外が発生します。今回の場合、例外はPUSH命令(スタック・ポインタを4バイト減算し、指定された4バイトの値を格納する)で発生していました。

 これが任意コードの実行に結びつくかと言えば、恐らくはNOだと思います。理論的には、非常に限定された条件なら可能となる場合もありますが、少なくとも今回のケースではあり得ないと思います。攻撃の最大深度はDoS(ブラウザのクラッシュ)どまりであり、脅威としてはさほど大きくは無く、以前のWMF脆弱性のような深刻な事態には至らないものと思います。

 この件について新しい情報を入手したら、随時このコラムでお知らせしたいとお思います。