エグゼクティブサマリー

Android 端末のマルウェア検出のための理解駆動型プログラム分析(CPA)

目次

1. エグゼクティブサマリー

モバイルマルウェアの検出は、横断的な制御依存とデータ依存や、マルチスレッドやイベント処理による目に見えない制御の切り替えがある場合に、極めて困難になりうる。さらに、アプリケーションの意図には本質的なあいまいさがあるため、悪意のある振る舞いを正当な機能から切り分けることが難しい。証明可能な自動化がすべての場合に可能なわけではないことを踏まえ、我々が提案する新しい理解駆動型のグラフベースの手法は、高度なマルウェアをすばやく発見できる反復的な改良のプロセスを可能にする。我々はフェーズ I で最も成績のよい Blue チームであり、フェーズ II では上位 3 チームに入った。我々は分析時間についてフェーズ I とフェーズ II の BAA の目標を上回り、フェーズ I では正確さについても上回った。しかし Red チームは、マルウェアの検出がいまだ解決されていない問題であり、さらなる研究が必要であることを明確に示した。このプログラムは、静的解析の難しい問題のいくつかと、人間が潜在的なマルウェアについてよりよい仮説を立てられるようにするプログラム理解の技術の必要性を浮き彫りにした。

APAC における我々の成功は、次の研究課題を特定し、それぞれに新しい解決策を見いだしたことに直接起因する。

  1. 自動化と人間の理解の両方を促進するソフトウェア分析プラットフォームは、どのように構築すべきか。
  2. 人間と機械による分析システムは、新規で高度な、ドメイン固有のマルウェアをどのように検出できるか。
  3. 正確でスケーラブルな部分プログラム解析のために、表現力があり簡潔な情報フローの要約を、ライブラリからどのようにマイニングできるか。

自動化と人間の理解の両方を促進するソフトウェア分析プラットフォームは、どのように構築すべきか。

既存のフレームワークは、自動化か静的な可視化のどちらかを提供するものであり、我々の目的には不十分であった。我々には、柔軟で対話的な query-model-refine のパラダイムが必要であった。先行研究の限界を克服してこの研究課題に取り組むため、我々は下請けの ENSOFT に、我々の必要を満たすよう Atlas とそのグラフスキーマを発展させることを依頼した。Atlas は、ソフトウェアのグラフベースの数学的抽象を用いる。Atlas は、プログラムの抽象構文木(AST)を前処理し、インメモリのグラフデータベース内の、豊かな属性付きグラフのデータ構造にする。このソフトウェアグラフは、自動的にも対話的にもクエリできる。自動化は組み込みの Java DSL によってサポートされ、自動化された解析器をごく少ない行数のコードで Atlas 上に書ける。対話と理解は、いくつかの方法でサポートされる。第一に、解析結果は、対応するソースコードまたはバイトコードと 1 対 1 に対応する、直感的なグラフの可視化で見ることができる。第二に、Atlas はシェルビューを提供し、ユーザーは必要に応じて結果を計算し、クエリし、可視化できる。第三に、設定可能な Smart View を通じて、ユーザーのクリックに応じて解析器を自動的に呼び出せる。たとえば、このビューは、ユーザーがソースのトークンやグラフの要素をクリックするたびに、コールグラフ、型階層、その他の成果物を即座に表示するように設定できる。この自動化と対話の強力な組み合わせは、ユーザーの知能を増幅する効果を持ち、自動化だけ、あるいは手作業だけでは実現できないユースケースを可能にする。

人間と機械による分析システムは、新規で高度な、ドメイン固有のマルウェアをどのように検出できるか。

自動化と対話を可能にするソフトウェア分析プラットフォームは、それだけではマルウェアの検出には十分ではない。それは、人間と機械による検出手法を構築するための基盤である。我々はすぐに、自動化されたツールは注目すべきプログラムの振る舞いを指摘するのに使えるが、ドメイン固有の判断を下すには人間の分析者が必要であると認識した。このようなハイブリッドなシステムを設計するには、次のような新しい問いに答える必要がある。(i) どの振る舞いを検出することが重要か。(ii) 静的解析で実際に検出できる振る舞いはどれか。(iii) 振る舞いを分析者にわかりやすく提示するにはどうすればよいか。(iv) 分析者が追加の問いを効果的に立てて答えられるようにするにはどうすればよいか。

問い (iv) は、従来からある既存の 2 パス方式の欠陥検出ツールの欠点に対処するうえで特に重要である。従来の 2 パス方式のツールでは、自動化が第 1 パスを行い、その後、人間がその警報を手作業で確認または棄却しなければならない。これはユーザーに不当な負担を強いる。今日のマルウェア検出の手法は、2 パス方式に分類されるか、そうでなければ完全に自動化されており、したがって新規で高度な、あるいはドメイン固有のマルウェアの検出には適していない。我々は Atlas とその API を用いて先行研究を超え、セキュリティツールボックスを作成した。従来の 2 パス方式とは異なり、セキュリティツールボックスは対話的な手法を用いる。我々は、自動化と対話の反復を繰り返すことでマルウェアを検出する。自動化は成果物をマイニングしてプログラムの振る舞いを明らかにし、分析者は結果を統合して、自動化が答えるべき新しい問いを立てる。

正確でスケーラブルな部分プログラム解析のために、表現力があり簡潔な情報フローの要約を、ライブラリからどのようにマイニングできるか。

Android アプリケーションは、最近のほとんどのソフトウェアと同様に、再利用可能なライブラリの上に構築される。Android は、Java の標準ライブラリ全体を含む巨大なライブラリを提供しており、アプリケーションはそれを呼び出せる。さらに、Android フレームワーク自体が、ボタンのクリック、手続き間の通信、コンポーネントのライフサイクルの変化、その他の多くのイベントに応じて、アプリケーションへのコールバックを行う。したがって、アプリを単独で分析することは部分プログラム解析の一形態である。部分プログラム解析とは、プログラムの実装の真部分集合の解析と定義される。Android フレームワークは(アプリより桁違いに大きく)あまりに巨大であるため、それを含めてプログラム全体の解析を行うことは現実的ではなかった。しかし、その振る舞い、特に情報フローを捉えられないと、APAC の参加チームの結果は不完全になり、検出漏れが生じた。

APAC の Blue チームは、この問題を解くためにさまざまな手法を試みた。Stanford は、その研究論文で報告しているように、大学院生と学部生からなる小さな軍団を擁して「重要な」Android API の粗い情報フローの仕様を手書きし、のちにそれらを動的に検証する作業を行った。この労働集約的なプロセスは、簡潔ではあるが粗く、品質と網羅性にばらつきのある結果を生んだ。もう一方の極端として、一部の参加チームは Android フレームワーク全体を解析に含めようとした。この手法は品質と網羅性の問題には対処したが、計算のスケーラビリティに深刻な問題をもたらした。我々 ISU のチームは、自動化された要約ベースの手法によって両方の長所を得られると考えた。

ライブラリの要約に関する先行研究のほとんどは、コールグラフの構築の戦略に焦点を当てており、そのため役に立たなかった。少なくとも 1 つのほかの APAC 参加チームである Stanford がライブラリのデータフローの要約を試みたが、我々は、その結果が粗すぎて正確に使えず、コールバックに関わるフローも捉えられないことを見いだした。その研究の利点を取り入れつつ欠点を避けるため、我々は、Java ライブラリのバイトコードから、きめ細かく簡潔なデータフローの要約を抽出する自動化ツール FlowMiner を設計した。FlowMiner は、Atlas のグラフベースの解析のパラダイムと API を用いて、Java ライブラリの 1 回限りの静的解析を行う。FlowMiner は、健全なデータフローの要約を、移植可能な XML 形式で符号化した抽象データフローグラフとして出力する。静的解析ツールは、この移植可能な要約ファイルを用いて、完全かつ正確でありながらスケーラブルな部分プログラム解析を実現できる。