2012年9月22日土曜日

Internet Explorerのゼロデイ脆弱性

このところ話題になっている脆弱性について、ちょっと調べて見ました。


Internet Explorer の脆弱性により、リモートでコードが実行される


CVEの情報は以下にあります。



この問題は、Internet Explorer がHTML内のスクリプトを実行する際の処理に問題があるため、不正なWebページに利用者を誘導することで、任意のプログラムを利用者のPC上で実行できてしまうというものです。

少し、専門的な話になりますが、ブラウザは読み込んだHTMLやスクリプトを処理するため、内部に様々なファンクションを持っています。最近のWebページは動的に作成され、利用者の操作に反応して様々な動きをするように作られるため、これに対応できるような形で、様々な機能(コマンド)を動的に割り当てて、場合によっては並列に実行していくような仕組みとなっているわけです。

ここで、ある操作Aを実行するようなスクリプトを含むHTMLを読み込ませたとします。通常は、このHTMLが読み込まれた後、そこに書かれた操作が実行されるよう、読み込み時にスクリプトが解釈され、実行準備が行われます。具体的には、ヒープと呼ばれるメモリー領域が、その操作のために割り当てられて、そこに実行すべきコマンドのための処理が準備されます。そして、コマンドを実行する段階で、このコードを実行するための内部処理が呼び出されます。通常は、このHTMLが書き換えられると、ヒープは解放され、次に読み込まれたHTMLのために使われることになります。

HTML内に書かれるスクリプトでは、様々なイベントを検出して、処理を割り込ませることができます。たとえば、マウス操作などで、画面が都度変化するような処理はこれにより実装されます。たとえば、HTMLを読み込んで、準備が完了した際に特定の処理を呼び出すこともできます。こうしたイベントに対応するハンドラのためのコードもHTMLが読み込まれた時にヒープに展開されます。

では、ちょっと意地悪して、読み込まれた直後に実行されるコードから、あるウインドウ操作コマンドを起動し、そのイベントハンドラ内で、HTMLそのものを書き換えてしまったらどうなるでしょうか。通常は、書き換えに伴って、登録されていたハンドラも解除され、そのために割り当てられていたコード領域は開放されます。本来であれば、このハンドラから戻った際に、元のコードは存在しなくなっているので、処理を終了してしまわなければいけないのですが、実は今のIEではそうなってはいませんでした。イベントハンドラが先に実行され、そのあとでコマンドが実行されるような動きになってしまうことが原因で、既に解放されてしまっているヒープにある処理を実行しようとしてしまうのです。

これだけならば、異常なコードの実行として単にIEが落ちるだけで終わります。しかし、このHTMLが上位にあるHTMLのIFRAMEの中で実行されていて、イベントハンドラ内で、親フレームで定義された配列変数を書き換えるような操作をすると、解放されたヒープ領域は再利用され、うまくいけば、そこに好きなデータを書き込むことが出来ます。さらに、親フレームでは、スクリプトのデータとしてエンコードされたシェルコード(PC上の特定の操作を指示するようなコード)があらかじめ展開してあれば、子フレームから書き込んだデータによって、そこに制御を渡すような操作が可能になってしまいます。

つまり、このことが、任意のコードを外部から送り込んで実行させられる、ということなのです。

この脆弱性の修正はまもなくマイクロソフトから配信されるとのことですが、当面はIE以外のブラウザを使用しておきたいところです。IEを使う場合は、インターネットゾーンでのスクリプトの実行を禁止するなどの措置を当面はとっておく必要があります。また、IEをPC管理権限を持ったユーザが使用している際に、この脆弱性を攻撃されると、PCの制御を完全に奪われる可能性もあるので、注意が必要です。通常のネットサーフィンに使用する場合は、権限を制限したユーザの資格で実行すべきでしょうね。

(追記)

9月22日付けで、マイクロソフトから修正プログラムが緊急配信されています。

0 件のコメント:

コメントを投稿