2015年1月20日以降、Adobe Flash Player に存在する深刻なゼロデイ脆弱性が確認されました。Adobe は、この脆弱性に対する修正プログラムを週末から順次公開しており、自動アップデートを有効にしているユーザは最新バージョン(16.0.0.296)に更新できます。トレンドマイクロは解析により、この脆弱性を抱えたコードが修正されていることを確認しています。
手動アップデートの最新バージョンは今週中に公開される予定です。Chrome および Internet Explorer(IE)の新しいバージョンに対応した Flash Player の最新バージョンもほぼ同時期に公開されます。
弊社が入手した検体を解析したところ、不正な Flashファイル(拡張子SWF)に埋め込まれた実際の Flashファイルを確認しました。この実際のファイルは、複雑に難読化されていました。
弊社では難読化を復号化した後、この脆弱性を徹底的に解析して、このエクスプロイトコードがどのように機能するかを解明することができました。詳細に入る前に、興味深い点を 1つ指摘したいと思います。このコードフラグメントの一部は、脆弱性「CVE-2014-8439」を狙うエクスプロイトコードに類似していました。つまり、同一人物がこの 2つのエクスプロイトコードに関係している可能性があります。
■今回の脆弱性の根本原因は何か
弊社の解析によって、今回の脆弱性は「Use After Free(解放後使用)」の脆弱性であることが判明しました。今回の事例では、domainMemory によって参照されるメモリが解放されます。この脆弱性はメモリの読み込みや書き込みに利用され、攻撃者はこの機能を利用して任意のコードを実行することが可能になります。
今回の脆弱性は、以下の手順で利用されます。
- ByteArray を新規で作成し、大量のデータを書き込む。その後、データを圧縮する。
- 圧縮された ByteArray のデータをポジション 0x200 から上書きし、ByteArray を domainMemory に設定する
- ByteArray のデータを解凍する。手順2により、IOError の 例外が発生する。コードはこの例外をキャッチし、解放されたメモリの場所を保持するために別の ByteArray を使用する。この ByteArray は 0xBBBBBBBB で保存される
- ByteArray のプレースホルダのデータを消去する
図1:「ByteArray」を作成するコード
図2:「ByteArray」の上書き
図3:IOError および例外のキャッチ
図4:0xBBBBBBBB ByteArrayメモリを解放する
■なぜ domainMemory は解凍されたデータのバッファを参照するのか
「AvmPlus」のプロジェクトのコードに、関数 ByteArray::UncompressViaZlibVariant の不具合を確認しました。この関数は、次のように設計されています。
- 解凍されたデータを最初に保存するために新しいバッファを割り当てる
- 解凍に成功すると、domainMemory に新しいバッファを使用するよう指示する
- 解凍に失敗した場合は、domainMemory にこのバッファを使用するよう指示せず、この新規に作成されたバッファを解放する
この動きは正しく見えますが、解凍処理により、新しいバッファへの割当が増大します。クラス「Grower」はバッファの動的成長を処理します。この成長が完了すると、破壊されたクラス「Grower」が domainMemory に増大したバッファを使用するよう指示します。その結果、domainMemory は解凍処理の間、この新しいバッファを使用します。失敗すると、新しく作成されたバッファが解放されます。これにより、ByteArray::UncompressViaZlibVariant: の元のロジックが破壊されます。たとえ解凍が失敗しても、domainMemory は新しいバッファを使用します。
このようにして、上記の手順が実行された後、domainMemory は 0xBBBBBBBB を含む解放されたメモリ空間を指します。エクスプロイトコードは、解放されたメモリ空間の読み込みおよび書き込みを実行するために本来の命令を利用することができるようになります。
図5:解放されたメモリ空間を読み込む
Adobe Flash に存在する脆弱性を利用した最近の攻撃のように、このエクスプロイトコードはメモリ配置を制御し、ベクターを解放されたメモリの隣に配置します。これにより、ベクターの長さを上書きすることが可能になり、攻撃者は任意にメモリを読み書きすることができます。
図6:メモリの上書き
図7 で示されるように、解凍処理時にメモリ配置が変更し、ベクターの長さが上書きされます。「解放後使用」のメモリアドレスは、図7 のデバック環境で 0x05120000 です。
図7:解凍後のメモリ配置(ヘッダデータは解凍に成功)
図8:0xBBBBBBBB ByteArray が割り当てられた後のメモリ配置
図9:0xBBBBBBBB ByteArray が割り当てられた後のメモリ配置とスプレーされたベクター
図10:ベクターの長さを上書きした後のメモリ配置
ベクターの長さを 0x40000000 にまで上書きすると、この検体のコードは任意のメモリの読み込みおよび書き込みができるようになりました。この機能は、エクスプロイトが任意のコードを実行するために利用されます。エクスプロイトは偽の仮想関数の呼び出しを開始して、シェルコードを実行します。
■トレンドマイクロの対策
弊社の動的スクリプトエミュレーション技術により、複雑に難読化された Flashファイルも解析が可能です。この技術により、弊社は埋め込まれた Flashファイル(拡張子SWF)を抽出し、ベクターを利用するヒープスプレーの挙動を監視することができました。結果として、弊社はエクスプロイトコードの徹底的な解析を行い、比較的短期間でユーザを完全に保護することが可能となりました。
トレンドマイクロ製品をご利用のユーザは、弊社のクラウド型セキュリティ基盤「Trend Micro Smart Protection Network」によって守られています。特に「Webレピュテーション」技術により、このエクスプロイトキットを拡散させる不正URL へのアクセスをブロックします。そして、「ファイルレピュテーション」技術により、不正プログラムを検出し、削除します。今回の攻撃で利用された不正なFlashファイルは「SWF_ANGZIA.A」として検出します。
なお、この脅威に対する弊社の対策についての詳細は、以前の記事もご参照下さい。
参考記事:
- 「Analyzing CVE-2015-0311: Flash Zero Day Vulnerability」
by Peter Pi(Threats Analyst)
翻訳:品川 暁子(Core Technology Marketing, TrendLabs)