Flashのゼロデイ脆弱性「CVE-2015-0313」の解析

トレンドマイクロは、2015年2月2日、Adobe Flash Player に存在する新たなゼロデイ脆弱性を報告しましたが、この脆弱性に対応する更新プログラムが Adobe から公開されました。この脆弱性は、Internet Explorer(IE)や Firefox、Chrome など、すべての主要なブラウザを介して攻撃することが可能です。ただし、Chrome はブラウザのサンドボックス機能によって Flash のプラグインから保護されているため、Chrome のユーザはこの攻撃から守られています。なお、この更新プログラムにより、Flash Player の最新バージョンは 16.0.0.305 となりました。

今回の脆弱性は「Use After Free(解放後使用)」の脆弱性です。脆弱性「CVE-2015-0311」と同様、「bydomainMemory」を参照するメモリが解放後に使用されます。このエクスプロイトコードの他の手法についても「CVE-2015-0311」を利用するものと類似しており、難読化、Return Oriented Programming(ROP)、シェルコードなどを用います。セキュリティリサーチャー Kafeine氏の協力を得て、今回の攻撃ツール(エクスプロイトキット:サイバー犯罪者が脆弱性を利用した攻撃を行うために使用するツールキット)が設置された Webページを解析した結果、「Hanjuan exploit kit(Hanjuan EK)」が最初に問題のエクスプロイトコードを利用したことが判明しました。

しかし、こうした類似性にもかかわらず、今回のゼロデイ脆弱性には、前回のゼロデイ脆弱性といくつかの相違点があります。

■「ActionScript」のワーカー
今回の脆弱性の根本的原因を解析する前に、Flash のスクリプト言語である「ActionScript」の概念を説明する必要があります。

「ActionScript 3.0」により、開発者は Worker オブジェクトを使用して、高性能のアプリケーションを実装することが可能です。「ActionScript 3.0 Developer’s Guide」で述べられているように、異なるワーカー間でオブジェクトを共有することができます。

ここで理解しておかなければならない最重要点は、ワーカーは共有可能な ByteArray オブジェクトの基盤となるメモリを共有することです。共有可能な ByteArray オブジェクト上で「Worker.setSharedProperty」が呼び出されている時は、新しいメモリーは割り当てられません。また、1つのワーカーが共有可能な ByteArrayオブジェクトのメモリコンテンツに加えた変更は、他のワーカーから確認できます。

■根本的原因の解析
弊社が入手したエクスプロイトコードは、Worker オブジェクトを利用します。メインの実行スレッドとワーカー間には、共有プロパティおよび「MessageChannel」を使用した通信があります。「MessageChannel」はメインスレッドとワーカースレッドを同期するために使用します。そして、共有プロパティがこの脆弱性を実際に攻撃するために利用されます。

この脆弱性攻撃の流れは、以下の 3つの手順で簡単に説明できます。

  1. [メインスレッド] 「setSharedProperty」を呼び出し、共有可能な ByteArray オブジェクトをメインスレッドとワーカースレッドの間で共有させる。
  2. [メインスレッド] この共有可能な ByteArray オブジェクトのメモリを「domainMemory」に設定する。
  3. [ワーカースレッド] 「getSharedProperty」を呼び出し、ワーカースレッドは、ワーカーの共有プロパティを介して共有可能な ByteArray オブジェクトを取得する。その後、「ByteArray::Clear」を呼び出してメモリを消去する。

■「domainMemory」はなぜ解放されたメモリを参照するのか
手順3 で、ワーカースレッドは、「ByteArray::Clear」を呼び出すことにより、共有可能な「ByteArray」のメモリを消去します。これが脆弱性を攻撃する動きとなります。

デバッグを解析した結果、ワーカースレッドでメモリが消去される前に、元となるバッファが共有可能な ByteArray オブジェクトおよび「domainMemory」に参照されることが判明しました。関数「ByteArray::Clear」はこの元となるバッファを解放し、ポインタを NULL に設定しますが、メモリ参照の変更のために「domainMemory」に通知しません。これは、他の関数には存在しない論理の不具合です。

「ByteArray::Length」などの関数は、ワーカースレッドで呼び出されると、「domainMemory」に通知してメモリ参照を変更します。「ByteArray::Compress」や「ByteArray::Uncompress」のような関数は、ワーカースレッド内で「domainMemory」が参照する共有可能な「ByteArray」で呼び出された場合、「ArgumentError」を返します。

図1 と図2 は、「ByteArray::Clear」の呼び出し前と後の違いです。

図1:関数「clear」を呼び出す前のメモリ参照
図1:関数「clear」を呼び出す前のメモリ参照

図2:関数「clear」を呼び出した後のメモリ参照
図2:関数「clear」を呼び出した後のメモリ参照

■ROP および シェルコード
この脆弱性の ROP およびシェルコードは、脆弱性「CVE-2015-0311」で利用されたものと類似しています。図3 は、利用された ROPガジェットです。

図3:ROPガジェット
図3:ROPガジェット

図4 は、シェルコードに利用される関数です。シェルコードは、不正活動を実行するファイルをダウンロードするために関数「winhttp」を利用します。

図4:シェルコードに利用される関数
図4:シェルコードに利用される関数

図5:不正活動を実行するファイルがダウンロードされる
図5:不正活動を実行するファイルがダウンロードされる

古いバージョンの Flash をご利用のユーザは、可能な限り速やかに最新バージョンに更新して下さい。

弊社のネットワーク挙動監視ソリューション「Trend Micro Deep Discovery(トレンドマイクロ ディープディスカバリー)」のサンドボックスや「Script Analyzer」エンジンにより、他のエンジンやパターンの更新がなくても、この脅威をその挙動で検出することができます。ブラウザ向け脆弱性利用対策技術「ブラウザガード」を搭載する「Trend Micro Security」や「Trend Micro 脆弱性対策オプション(ウイルスバスター コーポレートエディション プラグイン製品)」、「ウイルスバスター ビジネスセキュリティ」といったネットワーク端末へのセキュリティ対策製品は、エクスプロイトコードをホストする URL にアクセスするタイミングでエクスプロイトコードをブロックします。「ブラウザガード」はまた、ブラウザや関連したプラグインを狙うエクスプロイトコードから保護します。

弊社のサーバ向け総合セキュリティ製品「Trend Micro Deep Security(トレンドマイクロ ディープセキュリティ)」および「Trend Micro 脆弱性対策オプション(ウイルスバスター コーポレートエディション プラグイン製品)」をご利用のお客様は、以下のフィルタを適用することにより、問題のゼロデイ脆弱性を利用した攻撃から保護されます。

  • 1006468 – Adobe Flash Player Unspecified Vulnerability (CVE-2015-0313)

トレンドマイクロ製品をご利用のユーザは、弊社のクラウド型セキュリティ基盤「Trend Micro Smart Protection Network」によって守られています。特に「Webレピュテーション」技術により、このエクスプロイトコードを拡散させる不正URL へのアクセスをブロックします。そして、「ファイルレピュテーション」技術により、不正プログラムを検出し、削除します。

弊社のセキュリティ対策についての詳細は、弊社の Business Support(英語情報) もご参照下さい。

参考記事:

 翻訳:品川 暁子(Core Technology Marketing, TrendLabs)