ブログ(脅威調査)

FLASHMINGO: FireEye によるオープンソースベースのFlash解析ツール

Adobe Flashは、この10年間で最も活用されたソフトウェアの1つです。その複雑さと普遍性が、攻撃者の格好の餌となりました。2005年以降にFlash Player単体に見つかったCVEは1,000を超えると言われています。これらの脆弱性のうち約900は、共通脆弱性スコアリングシステム(CVSS)のスコア9以上です。

攻撃者に10年間以上いたぶられ続けた結果、ようやく2020年にAdobeはFlashを非推奨とすると発表しました。すでに主要ブラウザはFlashのサポートを終了していたため、これは特に驚くことではありません。

Flashは過去のものである、という認識が広がっているかと思いますが、歴史が示すとおり、レガシーな技術は実は長く残り続けるものです。企業組織が一定期間内にFlashの利用を禁止しない限り、Flash のEOL後、セキュリティパッチが提供されないというリスクにさらされることになります。

FLAREチームのマルウェアアナリストとして、今もFlashエクスプロイトを持つマルウェアサンプルを見つけることがあります。Flashサンプルを分析する必要性と、すでに市場で使われなくなりつつある製品投入するリソースのバランスを考える必要性に迫られています。FLASHMINGOはこの闘いを終わらせ、SWFファイルの分析を自動化する目的で開発されました。FLASHMINGOは、疑わしいFlashサンプルをトリアージし、最小限の労力で調査することを可能にします。さまざまな分析ワークフローに対して、スタンドアロン・アプリケーションとして、または強力なライブラリとして統合することが可能です。カスタムPythonプラグインを介してツールの機能拡張が可能です。

背景:SWFおよびActionScript3

FLASHMINGOの詳細な動きの説明の前に、Flashアーキテクチャについて説明します。フラッシュのSWFファイルは、特定の機能を持つタグと呼ばれるかたまりによって構成されています。タグは、互いに完全に独立しているため、古いバージョンのFlashとの間に互換性を持ちます。タグがサポートされていない場合、ソフトウェアは単にそれを無視します。セキュリティ問題の多くは、SWFのスクリプト言語:ActionScript3(AS3)周りで発生しています。このスクリプト言語は、バイトコードにコンパイルされ、Do ActionScript ByteCode(DoABC)タグ内に配置されます。SWFファイルがDoABCタグを含む場合、バイトコードは、AdobeのFlashプレーヤに同梱されている仮想マシン(VM)(AS3の場合はAVM2)によって抽出され、実行されます。AVM2の設計はJava VMに基づいているため、Java VMと同様、悪意のあるAS3バイトコードによるネイティブコードの実行を可能にするメモリ破損と論理問題に悩まされていました。脆弱性の根本的な原因がAVM2ではなかった少ない例では、安定した攻撃を実現するためにActionScriptが必要でした。たとえば、メモリ破損を引き起こす前にヒープグルーミングを行います。これらの背景により、FLASHMINGOは、AS3バイトコードの分析に焦点を当てています。

ツールのアーキテクチャ

FLASHMINGOは、オープンソースのSWIFFASライブラリを活用して、Flashファイルの解析を大幅に向上させます。バイナリデータとバイトコードはすべて構文解析され、SWFObjectというオブジェクトに格納されます。このオブジェクトは、我々の分析に関連するSWFに関するすべての情報、例えばタグのリスト、すべてのメソッド、ストリング、定数、および埋め込まれたバイナリデータに関する情報を持ちます。これは、SWFファイルを参照しやすいフォーマットに変えたものです。

FLASHMINGOは、SWFObjectを操作し、情報を抽出するプラグインの集合です。図1は、FLASHMINGO、そのプラグイン、およびSWFObjectの関係を示しています。


図1: ソフトウェアの構造概要

FLASHMINGOには、以下のような、さまざまな分析を行うことができる便利なプラグインが複数用意されています。

  • 疑わしいメソッド名の検出多くのサンプルには、「run_shell」や「find_virtualprotect」など、開発時に使用されるメソッド名が含まれています。このプラグインは、疑わしいサブストリングを含む方法でサンプルにフラグ付けを行います。
  • 疑わしいconstantsの検出バイトコード内に一定のconstant値が存在する場合、不正コードまたは疑わしいコードである可能性があります。例えば、constant値0x5A4Dを含むコードは、MZヘッダを検索するシェルコードである可能性があります。
  • 疑わしいループの検出不正行為はしばしばループを伴います。例えばエンコード、デコード、ヒープスプレーなどです。このプラグインは、XORやビットごとのANDなどの興味深い動きをするループを持つメソッドにフラグ付けを行います。これは、シンプルなヒューリスティック解析を用いて、エンコードやデコードを検出し、より深い解析のためにコード抽出を行います。
  • 埋め込まれているすべてのバイナリデータの取得
  • FFDEC Flash Decompilerを使用する逆コンパイル・プラグインこの逆コンパイラ・エンジンは、Javaで記述されており、スタンドアロン・ライブラリとして使用することができます。FLASHMINGOはPythonで記述されているため、このプラグインを使用するには、Jythonが必要になります。

独自のプラグインでFLASHMINGOを拡張

FLASHMINGO簡単に拡張することができます。すべてのプラグインは、plug-insディレクトリーの下の各ディレクトリー内にあります。起動時に、FLASHMINGOはすべてのプラグイン・ディレクトリでマニフェスト・ファイル(後半で説明)を検索し、アクティブとしてマークされている場合プラグインを登録します。

template plug-in により、開発も容易です。独自のプラグインを追加するには、テンプレート・ディレクトリーをコピーし、名前を変更し、そのマニフェストとコードを編集します。YAMLで記述されたテンプレート・プラグインのマニフェストを以下に示します。

```
# これは、開発を容易にするためのテンプレートです。
name: Template
active: no
description: copy this to kickstart development
return: nothing

```

このファイルで最も重要なパラメータは、nameとactiveです。nameパラメータは、FLASHMINGOが内部で参照するときに利用されます。activeパラメーターは、このプラグインをアクティブにするかどうかを示すブール値(yesまたはno)です。デフォルトでは、すべてのプラグイン(テンプレートを除く)がアクティブであるため、非アクティブにしたい場合に使われます。descriptionおよびreturnsは、使用者にドキュメンテーションを表示するための文字列です。プラグイン・マニフェストは、プログラム開始時に構文解析されます。新しいプラグインを追加したり、プラグインを有効/無効にしたりするには、FLASHMINGOを再起動する必要があります。

ここで、ビジネスロジックを実装する実際のコードについて説明します。ファイルplugin.pyは、Pluginという名前のクラスを持ちます。必要なのは、その run メソッドを実装することだけです。各プラグインは、SWFObjectのインスタンスをパラメーターとして受け取ります。コードは、このオブジェクトとやりとりし、ユーザが定義したカスタムフォーマットでデータを返します。こうして、ユーザーのインフラから直接データを取り出すためのユーザー自身のプラグインを作ることができます。

binary_dataという名前のプラグインを作成する方法を見てみましましょう。このプラグインは、デフォルトでSWFファイル内のすべての埋め込みデータを返します。ユーザがオプションのパラメータパターンを指定した場合、プラグインは、埋め込みデータ内のそのバイトシーケンスの一致を検索し、埋め込みデータの辞書およびパターンが見つかったオフセットを返します。

まず、オプションの引数パターンを定義します(2行目および4行目):

その後、カスタムされた run メソッドと、それをサポートするために必要な他のすべてのコードを実装します。

これは、シンプルかつ有用なプラグインであり、FLASHMINGOとやりとり方法を示しています。プラグインは、プロパティ「ml」(2行目)を介してアクセス可能なロギング機能を有します。デフォルトでは、FLASHMINGOのメインロガーに記録されます。指定されていない場合、プラグインのディレクトリー内のログ・ファイルに戻されます。10行目から16行目は、カスタムされた run メソッドを示し、custom_inspect_binary_dataメソッドとともにSWFの埋め込みデータから情報を抽出します。このバイナリデータのソースに注意してください。これは、"swf"という名前のプロパティから読み込まれています。これは、引数としてプラグインに渡されるSWFObjectです。このswfオブジェクトとやりとりするSWFファイルコンテンツに対して、より複雑な分析を実行することができます。FireEyeのリポジトリには、SWFObjectで使用可能なすべてのメソッドのドキュメントが格納されています。

まとめ

Flashは2020年の終わりにEOLを迎えることになり、また開発コミュニティの多くはかなり前からFlashから離れていますが、FireEyeは、Flashが今後もしばらくの間感染手段として利用されるであろうと予測しています。レガシー技術は、セキュリティーアップデートがないため、攻撃者にとって美味しいのです。FLASHMINGOは、マルウェアアナリストが、実行環境やファイルフォーマットの複雑さに煩わされることなく、厄介なFlashサンプルに迅速に対処することができる柔軟なフレームワークを提供します。

FLASHMINGOは、FireEye public GitHub Repository で提供されています。