遅ればせながら筆者も「iPad」を入手した。アクティベーションにiTunesが必要なところは若干の違和感を覚えたが、自宅でネット検索したり、買い物をするにはこれで十分かな、という気もしないでもない。加えて、あっというまに幼児向けiPad図鑑アプリの使用法を覚え、楽しむ子供の姿を見ていると、彼らにとってiPadは日常の一ガジェットでしかないというのは驚異的だなぁ、と思ったりもする。そんなことを筆者が口にすると、社内の特定の人々からは「麗しの8ビットマイコン」「青春のPC-98」「ベーマガと私」といった声をいただいた。なるほど、あの頃の自分の体験と同じと思えばいいということか……。

今回は、EMETの効用をさらに説明するために、最近話題のAdobe Flash PlayerおよびReaderのゼロディ脆弱性について詳細に触れていきたい。なお、Flash Playerについてはすでに修正プログラムが提供されているので、更新した覚えのない方は今すぐ更新することをおすすめする。

シマンテック セキュリティレスポンス シニアマネージャーの濱田氏が同社のブログでこの脆弱性が悪用されていると報告したのが6月6日である。同報告によると、同社はPDFファイルと、HTMLファイルにリンクされたSWFファイルを通じてこの脆弱性を悪用するマルウェアが出現したことを確認したという。US-CERTの情報によると(http://www.kb.cert.org/vuls/id/486225)、本問題はAdobe Flash 9以降におけるActionScript Virtual Machine 2 (AVM2)のnewfunction命令の呼び出し方法にあるという。そして、この問題は独自のFlashサポートを行っているAdobe ReaderやAcrobatといった他の製品にも影響を及ぼすとしている。言い換えると、Flash Playerのインストール有無にかかわらず、PDFファイルを開くといった行為を通じてこの問題の影響を受けるということである。したがって、現在のところAdobe ReaderならびにAcrobatに関しては修正プログラムがない。こうした製品に関する修正プログラム6月29日までに公開される予定となっており、代替策についてはこちらを参照されたい。

今度は、シマンテック社の別のブログエントリに移ろう。6月8日付で公開された同脆弱性の分析結果である。これによると、脆弱性はある単一の命令によって発生するという。ActionScript Virtual Machine用にコンパイルされたバイトコードを直接修正することでこれは実現されるという。そして修正されたSWFファイルを脆弱なアプリケーションで読み込むと、メモリアクセス違反が発生するのだという。Fuzzerを使用した脆弱性発見手法などと比べ、とてもピンポイントなやり方を採用している点がユニークである。ユニークである理由は追って述べよう。

Windows XP SP3プラットフォームでこのSWFファイルをロードすると、図のようなアドレスでアクセス例外が発生することがわかる。

Immunity Debuggerを使用してアクセス例外が発生したアドレスとレジスタを表示した

CALL命令によりECXレジスタの値+0xCのアドレスに格納されているアドレスに命令ポインタを移そうとしてアクセス例外が発生している。そもそもこの例外を発生させているコードは何かというと、AVM2の持つJIT(Just-In-Time)コンパイラによってバイトコードがネイティブコードに変換されたものである。この点が、この脆弱性の非常にユニークなところである。筆者の想像ではあるが、この脆弱性の発見者はAVM2の持つJITによるネイティブコードの生成状況を見たうえで、意図的にアクセス例外を発生させるバイトコードに書き換えた可能性がある。先に紹介された6月8日付のシマンテック社のブログエントリも、当該SWFデータをデコンパイルし、得られたActionScriptコードをキーワードに検索したところ、2バイト長の命令を含まない「クリーンな」ActionScriptコードを含むWebページが検索結果に表示されたのだという。つまり「検索して得たActionScriptコードをテンプレートにバイトコードを出力」させた上で、2バイトだけ書き換えた可能性があるということだ。