3. 方法、仮定、手順
我々の研究は、これまで取り組まれていなかった課題、すなわち、実環境で報告されているマルウェアとは異なり、プログラム分析に大きな課題を突きつける、新規で高度なマルウェアに焦点を当てた。サービス拒否によってすぐに気づかれるほかのセキュリティ攻撃とは異なり、マルウェアアプリは、自らの存在を明かすことなく、機密情報をひそかに漏洩させることができる。
新規で高度なモバイルマルウェアの検出は、次のプログラム分析の課題がある場合に、極めて困難になりうる。
- マルウェア内の、複数の関数とデータ構造にまたがる非局所的なデータ依存と制御依存。
- マルチスレッドやイベント処理による目に見えない制御の切り替え。これらの制御の切り替えは、静的解析では関数呼び出しや制御文として直接見えない。
- アプリケーションの意図には本質的なあいまいさがあるため、悪意のある振る舞いを正当な機能から切り分けることが難しい。
既存の欠陥分析ツール(マルウェア検出ツールに限らない)のユーザーは、2 つのパスを用いる。(第 1 パス)ツールが自動的に動作して、コード内の潜在的な問題の一覧を生成し、(第 2 パス)手間のかかる手作業の検査によって問題を検証する。この手法は次の困難に直面する。その軌道を導くその場の人間の知能がないため、ツールは誤った判断や非常に保守的な判断を下し、多くの偽陰性や偽陽性を生む。さらに、欠陥分析ツールが生成する結果には、人間がツールの発見を確認または棄却するための推論に用いる証拠が欠けている。既存の 2 パス方式を図 1 に示す。
ツールだけでは上に挙げたプログラム分析の課題に対処できないため、我々は人間の導きを取り入れてツールの軌道を微調整し、マルウェア検出の精度を高める。人間は、アプリケーションソフトウェアを理解しなければ、ツールを効果的に導くことはできない。また、人間は、途方もない労力をかけなければ、大規模で複雑なアプリケーションソフトウェアを理解することもできない。そこで我々は、関連するソフトウェアの成果物を検索して抽出し、分析者がアプリケーションの意図について推論し、ツールによるマルウェア検出の結果を検証するための証拠とすることで、ツールによる支援を取り入れる。要するに、我々は、統合された理解駆動型の分析に基づく新しい手法を提案し、研究した。
図 1 に示すように、我々は既存の 2 パス方式とは対照的に、反復的な改良を伴う、密に結合したヒューマン・イン・ループの手法を持つ。我々の手法は、プログラム分析を困難にする攻撃の巧妙さに対処するための実行可能な代替手段を提供したため、かなりうまく成功した。
我々は、ENSOFT が開発した Query-Model-Refine(QMR)フレームワークを活用した。これは、密に結合したヒューマン・イン・ループの手法に必要なツールの仕組みを提供する。データベース言語 SQL と同様に、このフレームワークは組み合わせ可能なクエリ言語を取り入れており、対話的に使うことも、Java プログラムとして埋め込んで、プログラムを分析するプログラムを作ることもできる。クエリ言語があるため、ユーザーは静的解析の低水準の詳細から解放され、より高水準の意味論におけるマルウェア検出の戦略に労力を集中できる。「モデル」と「改良」の機能はクエリ言語と連動し、大規模なソフトウェアの効果的な抽象を作ることで人間の理解を助ける。我々は、Java 向けの QMR プラットフォームである Atlas を開発した。
我々の手法のもう一つの重要な側面は、進化に適し、使いやすいツールを開発することであった。すなわち、静的解析ツールの構築に関する専門知識を必要とせずに、そのマルウェア検出の能力をかなり容易に洗練し、拡張できるツールである。これが可能なのは、我々の手法が、マルウェア検出の能力を Atlas 上に構築したツールボックスとして組み込むことに等しいためである。静的解析の低水準の詳細は Atlas の内部にあり、マルウェア検出の能力は、Atlas のクエリを用いた簡潔な解析プログラムとしてツールボックスの内部にある。既存の検出能力を洗練し拡張することも、まったく新しい能力を作ることも、クエリを用いた解析プログラムを通じて行えるため、比較的容易である。根底にある設計思想は、Matlab のような環境と似ている。そこでは重い処理が裏側で行われるため、ユーザーはドメイン固有のプログラムをはるかに容易に開発できる。特性の完全な一覧を作ることは非現実的であるため、敵対的な思考を用いて、すぐに使える特性のクックブックを比較的簡単に拡張できることが不可欠である。進化に適した技術は、DoD が今後何年にもわたってマルウェア検出の最先端を維持するための、費用対効果の高い道筋を提供する。
3.1 技術的進歩
DARPA APAC プログラムにより、我々は 3 つの重要な技術的進歩を遂げる機会を得た。ここではそれらについて述べる。
3.1.1 グラフスキーマとプログラム分析プラットフォーム
自動化と人間の理解の両方を促進するソフトウェア分析プラットフォームは、どのように構築すべきか。
我々は、この重要な問いに答えるために大きな進歩を遂げた。我々は、eXtensible Common Software Graph(XCSG)と呼ぶグラフスキーマを考案し、Java、Java バイトコード、C、C++ のプログラムの豊かな構造的・振る舞い的な意味論を表現する共通の媒体として、属性付き有向グラフを提供した。我々は、XCSG スキーマに基づくプログラム解析器を書くためのグラフデータベースプラットフォームとして、Atlas を発展させた。我々が発展させた Atlas プラットフォームにより、本来なら数日から数か月かかるソフトウェアの分析、検証、変換のプログラムを、数分から数時間で書けるようになった。
Atlas は C、C++、Java、Java バイトコードを解析し、複雑なプログラムの意味論をグラフデータベースに取り込む。グラフデータベースをマイニングし、走査し、変換するための API を提供する。Atlas の API とプログラムグラフの可視化の機能により、大規模なソフトウェアの複雑な問題について推論するための基本的な手法を試し、発展させるツールのプロトタイプをすばやく作れる。Atlas は学術用途に無償で提供されている。XCSG スキーマはオンラインで公開されている。
Atlas は、解析を 2 つの異なるフェーズに分けることで、ドメイン固有の解析の目的を、その根底にある仕組みから切り離す。第 1 のフェーズでは、多項式時間の静的解析器がソフトウェアの AST をインデックス化し、豊かなグラフデータベースを構築する。第 2 のフェーズでは、ユーザーはグラフを直接探索することも、便利な API を用いて書いたカスタムの解析スクリプトを実行することもできる。これらの特徴により、Atlas は対話と自動化の両方に理想的なものとなる。我々は ICSE 2014 の論文で、Atlas の動機、設計、使い方を述べている。そこでは、Linux カーネルの安全な同期の検証や、Android アプリケーションのマルウェアの検出を含む、検証のためのケーススタディを示している。
デモ動画:http://youtu.be/cZOWlJ-IO0k
3.1.1.1 グラフとクエリ
グラフは、プログラムとプログラム分析の結果を表現する自然な方法である。そこでは通常、ノードはメソッドや変数などの実体に対応し、エッジは制御フローやデータフローなどの関係に対応する。Atlas のデータベースは、豊かなプログラムの意味論を抽出し、統一されたグラフ表現として格納する。その表現には、構造的な関係(型、メソッド、フィールドなど)と、保守的な解析によって導かれた制御フローとデータフローが含まれ、それらは、パス、オブジェクト、コンテキスト、フィールドを区別する洗練された解析を書くための基礎知識となる。
プログラムの意味論を統一されたグラフに符号化することには、組み合わせ可能な解析に適するという利点がある。プログラム分析の結果は通常もう一つのグラフであり、それを次の解析の入力として使える。Atlas ではグラフを表示することもできるが、可視化は必ずしも終点ではない。ノードとエッジを選択し、次の反復の解析の入力として使える。
多くのプログラム分析の問いは到達可能性のクエリとして符号化できるため、Atlas は、こうしたよくあるクエリを書きやすくするクエリ言語を提供する。クエリを書くには、グラフのスキーマ、すなわちプログラムと分析の情報がどのように符号化されているかを知っている必要もある。eXtensible Common Software Graph(XCSG)と呼ばれる Atlas のスキーマについては後で論じる。
3.1.1.2 人間との対話
ソフトウェアの複雑な問題について推論するための、ほかのどの既存のプログラム分析ツールをもはるかに超える前例のない人間との対話の能力は、次のものによって可能になる。(a) 複雑なプログラムの意味論を人間が理解しやすい形で、大規模なプログラムグラフを可視化し、それと対話する能力。(b) プログラムの成果物のコードと、それらの成果物の間の関係を示す対応するグラフとの対応。この対応により、大規模なコードをスケーラブルにナビゲートできる。(c) 複雑で横断的なプログラムの意味論とその可視化をマイニングする強力なクエリを組み合わせられる、クエリインタプリタのシェル。
Android アプリを分析した最初の数回のエンゲージメントでの経験から、我々は、多くのクエリがデータフローのクエリの変形であることに気づいた。反復的な分析のプロセスを加速するため、よく使われるクエリをポイントアンドクリックの操作にまで減らす「Atlas Smart Views」を導入した。分析者はドロップダウンメニューから解析器を選択し、分析者が適切なソースコードの実体をクリックするたびに、その解析器が自動的に適用されて対応する結果が表示される。たとえば、分析者が「call graph」解析器を選択し、表示中のソースコード内のメソッド呼び出しをクリックすると、対応するコールグラフが即座に表示される。別の例として、分析者が「data flow graph」解析器を選択し、表示中のソースコード内のメソッド呼び出しのパラメータをクリックすると、対応するデータフローグラフが即座に表示される。新しい解析器を「Atlas Smart Views」に追加できる。我々は Android 固有の解析器を追加した。
3.1.1.3 拡張性
Atlas は、我々が APAC プロジェクトのために構築したセキュリティツールボックスのような、ドメイン固有のツールボックスを構築するためのプラットフォームとなる。セキュリティツールボックスは、グラフデータベースを拡張することで Android の意味論を取り入れる。たとえば、グラフデータベースは、Android の XML ファイルから導かれるグラフィカルユーザーインターフェース(GUI)の意味論を含むように拡張される。この拡張は、eXtensible Common Software Graph(XCSG)スキーマに従うように設計しなければならない。
XCSG スキーマは、ソフトウェア(すなわちソースコードやバイナリ)の意味的に豊かなグラフ表現を定義し、ソフトウェアからのパターンのマイニング、マルウェアと欠陥の検出、静的解析ツールの構築、コードの理解といったプログラムの応用を支援する。XCSG は、Kothari と彼のチームが DARPA Software Enabled Control(SEC)プログラム [3] のために開発した eXtensible Common Intermediate Language(XCIL)に基づいている。
XCIL と同様に、XCSG はプログラムの成果物について意味的に正確な定義を持ち、異なる言語で書かれたソフトウェアを調和的に表現できる。正確な意味論がなければ、解析ツールは容易に言語の偏りを持つようになり、特に複数の言語で書かれたソフトウェアを分析する際に、ほかの言語を誤って処理することにつながる。たとえば、C と Java のキーワード「static」は、重なり合うが両立しない用途を持ち、XCSG はそれを区別する。XCSG は、グラフデータベース向けに調整し、制御フローグラフやデータフローグラフのような解析結果の表現を包含することで、XCIL を改良している。
