最近、私たちは“PluginPhantom”という新型のGoogle Android版トロイの木馬を発見しました。PluginPhantomは、ファイル、位置データ、連絡先、Wi-Fi情報など、さまざまな種類のユーザー情報を盗み取ります。また、写真の撮影、スクリーンショットのキャプチャ、音声の録音、SMSメッセージの傍受および送信も行います。さらに、Androidのアクセスサービスを使ってキーボード入力を記録することができ、キーロガーとして振る舞います。

PluginPhantomは新しいクラスのGoogle Android版トロイの木馬で、更新処理を利用し、静的な検出を回避する初のトロイの木馬で、Android pluginテクノロジーを利用しています。正規の、しかも普及度の高いオープンソースのフレームワーク“DroidPlugin”を悪用します。DroidPluginを使えば、システムにアプリをインストールすることなく、プラグインとして動的に起動することができます。PluginPhantomは悪意のある機能の各要素をプラグインとして実行し、そのプラグインを制御するためにホスト アプリを使います。新しいアーキテクチャにより、PluginPhantomは柔軟性を高め、アプリを再インストールせずに自身のモジュールを更新します。また、プラグインに含まれている悪意のある動作を隠すことで、静的な検出を回避する能力も獲得しています。プラグインの開発パターンが汎用的で、プラグインSDKを容易に埋め込むことができるため、このプラグイン アーキテクチャはAndroidマルウェア間で将来流行する恐れがあります。

 

PluginPhantomの進化

 

私たちは、PluginPhantomが、2016年7月にTrustLookによって発見されたAndroid版トロイの木馬“Android.Trojan.Ihide”の後継者と確信していますが、それは両者が同一の証明書とパッケージ名を共通に使っているからです。PluginPhantomは“Android.Trojan.Ihide”由来の改変した悪意のある機能をすべて含んでいるばかりでなく、非常に革新的な設計アーキテクチャも採用しています。この新型アーキテクチャは、元の悪意のあるアプリが複数のアプリ(プラグイン アプリ)と単独のアプリ(ホスト アプリ)に分けられています。ホスト アプリはプラグインアプリをすべてリソースに埋め込み、これにより、さまざまな機能のモジュールを実行しています。被害者がホスト アプリをインストールすると、ホスト アプリはプラグイン アプリをインストールせずに、直接ロードして起動することができます。これは正規のオープンソース プラグインのフレームワークであるDroidPlugin [2]を悪用することで行われます。

1. DroidPluginの導入:

DroidPluginはアプリケーションレベルの革新的な仮想化/プロキシ フレームワークであり、もともとはホットパッチの適用処理、リリース済みAPKのサイズ縮小、および65535個のメソッド上限の除去を目的に開発されました。DroidPluginのよくある適用事例として、同一デバイス上で複数のアプリのインスタンスを起動する(例えばソーシャル アプリで複数のアカウントを使う)場合があります。基本的に、DroidPluginは、広く知られている動的なコードのロード(例えばdexファイルまたはjarファイルのロード)とは著しく異なります。インストールをせずにAPKファイルからアプリを直接ロードして起動することができるからです。DroidPluginの実行において、5つの基本的な概念またはメカニズムがあります。

  • 共有UID。プラグイン アプリはホスト アプリと同一のUIDを共有します。
  • 定義済みのスタブ コンポーネントおよび権限。ホスト アプリには、プラグイン アプリ用に定義済みのスタブ コンポーネントおよび権限が備わっています。
  • 動的プロキシのフック。ホスト アプリは、動的プロキシのテクニックを使ってプラグイン アプリのAPI呼び出しをフックします。そのため、AndroidシステムはAPIリクエストおよびコンポーネントがすべてホスト アプリから来ていると考えます。
  • リソースのロード処理。プラグイン アプリがシステムにインストールされないため、ホスト アプリはプラグイン アプリのプロセス内にアプリ リソースをロードするプロセスを引き継ぐ必要があります。
  • コンポーネントのライフサイクル管理。プラグイン プロセス内のコンポーネントが破棄される準備が整っている場合、対応するスタブ コンポーネントも同時に破棄されなければなりません。

 

2.PluginPhantomのプラグイン設計。

 

プラグインの設計アーキテクチャにおいて、PluginPhantomにはホスト アプリが1個(すなわち、私たちが捕えた悪意のあるAPK)およびアセット ファイルとしてホスト アプリに埋め込まれているプラグイン アプリが9個あります。これら9個のプラグインには、図1に示すとおり、中核となるプラグインが3個(“task”、“update”および“online”)と、追加プラグインが6個(“file”、“location”、“contact”、“camera”、“radio”および“wifi”)あります。

 

図1 PluginPhantomのプラグインのアーキテクチャ

ホスト アプリは、PluginPhantomのコントローラおよびエントリポイントとして、プラグイン アプリを起動してコマンドを送信することで、スケジューリングします。初期化段階では、ホスト アプリはアセット ファイル内の9個のAPKファイルをロードし、それらをDroidPluginフレームワークにプラグインとしてインストールします。その後、ホスト アプリは、Androidにインストールされた通常のアプリと同じ方法で、プラグインを起動し通信できます。

オンライン プラグインは、コマンド アンド コントロール(C2)サーバに接続し、デバイス情報(スクリーンの状態、バッテリ量、空きRAMサイズなど)をアップロードし、実行するコマンドを取得します。オンライン プラグインは、最初に“ThrowOut”手順を終了して、UDPソケットで“UUID” (“java.util.UUID.randomUUID()”から)を送信することで、リモート サーバをプローブします。“UUID”が正常に送信されると、オンライン プラグインは、引き続きWebSocketを使用してサーバからコマンド データを取得します。

タスク プラグインは、ホスト アプリのブリッジを介してコマンド データを取得します。異なるコマンド タイプに応じて、異なる攻撃を起動する6つの追加のプラグインにコマンドを転送します。また、タスク プラグインは、盗んだデータをWebSocket経由でリモート サーバにアップロードします。さらに、タスク プラグインは、“update”コマンド タイプを受信した場合には、アップデート プラグインを起動し、新しいプラグインAPKファイルをダウンロードして、プラグインを更新します。アップデート プラグインによるプラグインのダウンロードが終了すると、タスク プラグインがメッセージをホスト アプリに送信して、プラグインを再度ロードし、再起動します。

 

3.PluginPhantomにおけるIPCとデータ共有:

 

DroidPluginフレームワークでは、ホスト アプリとすべてのプラグイン アプリが同一のUIDではなく、異なるPIDを共有します。そのため、ホスト アプリとプラグイン アプリ間のIPC、またはプラグイン間のIPCは、Androidシステム内のIPCメカニズムと同じです。PluginPhantom内のIPCには、IntentとAIDLが含まれます。ホスト アプリは、Intentによってプラグイン アプリのエントリ サービスを開始することで、すべてのプラグイン アプリを起動できます。特に、プラグイン サービスの動作を維持するために、ホスト アプリは、アラーム マネージャを使用して、プラグイン アプリのエントリ サービスを一定間隔で再起動します。さらに、AIDLが、ホスト アプリとプラグイン アプリ間のIPC用に使用されます。たとえば、“AbsAidl”は、タスク プラグインがホスト アプリにコマンドを送信し、キーボード入力をフックするために使用されます。アップデート プラグインは、“ClientAidl”、“InfoAidl”および“PluginAidl”を使用して、更新されたプラグイン情報をホスト アプリと同期します。

IntentとAIDLはデータの一部を共有できますが、PluginPhantomは主にコンテンツ プロバイダとファイル システムを使用して、タスク プラグインと6個の追加プラグインの間でデータを共有します。たとえば、ラジオプラグインは、タスク プラグインからURI “content://***.task.cntPrv/Command”によってコマンドを取得し、コマンドのレスポンスと録音されたオーディオ ファイルパスをそれぞれURI “content://***.task.cntPrv/CmdRespond”と“content://***.task.cntPrv/CmdRespondFile”に保存します。その後、タスク プラグインは最後の2つのコンテンツ プロバイダを解析し、外部ストレージ パス“/sdcard/AndroidMedia/.audio/record”から録音されたオーディオ ファイルを読み込みアップロードします。

 

プラグインを介した情報の窃盗

1.ファイル プラグイン

ファイル プラグインは、特定のディレクトリをスキャンし、その中のファイルから情報(ファイル名、ファイル タイプ、ファイル サイズ、作成日時、編集日時、ファイルパス、正規パス、読み取り状態など)を取得します。また、外部ストレージ内のメディア ファイルをスキャンして、特定のファイルをダウンロードしたり削除したりできます。ファイル操作時には、必要に応じて、ファイル プラグインによってルート権限が使用されます。既存のサンプルでは、PluginPhantomはルート権限の使用を試みていますが、デバイスにルートとしてアクセスしていません。攻撃者は、デバイスへのルート アクセス権が必要な場合、C2チャネルを使用して、パッチが未適用のローカル ルートの脆弱性をエクスプロイトするAPKをインストールできますが、PluginPhantomの感染ではこのような事象は観察されていません。

2.ロケーション プラグイン

ロケーション プラグインは、きめ細かい位置情報と大ざっぱな位置情報の両方を取得します。Androidのデフォルトの地理座標系における座標を、中国でトップ2のナビゲーション アプリであるBaidu MapsとAmap Mapsによって使用されている2つの座標系の座標に変換します。正常に位置を取得するために、プラグインは、WIFI、GPS (Android 4.4未満)、およびモバイル データ(Android 5.0以下)オプションを有効化できます。

3.コンタクト プラグイン

コンタクト プラグインは、リモート サーバから受信される特定の電話番号の着信SMSコールおよび通話を傍受します。検出を回避するために、コンタクト プラグインは着信音と電話画面をオフにし、受信するSMSコールと通話の通話記録を削除します。コンタクト プラグインは、電話およびSIMカードの連絡先リストにある通話記録、デバイスID、連絡先情報(削除された連絡先を含む)も盗みます。また、SMSメッセージを特定の電話番号に送信し、現在の電話の請求残高を確認した後はその番号への送信を停止します。

4.カメラ プラグイン

カメラ プラグインは、前面または背面のカメラを使用して、バックグラウンドで写真を撮ります。サーフェス表示として、0.1*0.1サイズのカメラ プレビュー画面、透明なテーマとタイトルなしの全画面アクティビティが使用されるため、被害者はこの動作に気付かないことがあります。また、特定のデバイスのルート権限を取得した後は、「screencap –p」コマンドでスクリーンショットも撮ります。

5.ラジオ プラグイン

ラジオ プラグインは、リモート サーバからのコマンド、着信/発信通話、という2つのトリガー条件に基づいて音声をバックグラウンドで録音します。検出を回避するために、このプラグインは、他のアプリも録音しているときは音声の録音を行いません。

6.WIFIプラグイン

WIFIプラグインは、WIFI情報(例: SSID、パスワード、IPアドレス、MACアドレス)、ソフトウェア情報(例: アプリ名、バージョン、最終更新時刻、ISシステムアプリ)、実行中のプロセス情報(例: PID、プロセス名、アプリ名、アプリのリソースパス、アプリのデータパス、タイムスタンプ)、およびトレース情報(例: ブラウザの訪問履歴およびブックマーク)を盗みます。

 

ホスト アプリへのアクセスを介したキーボード入力の窃盗

 

ホスト アプリでは「AutoService」と名付けられた開発者定義のサービスが「AccessibilityService」を拡張し、システム内のすべてのGUIイベントがフックされます(図2)。そのためには、まず、図3のメッセージを表示して、ユーザーがこのアプリへのアクセス許可を付与するように仕向けます。ここでは、偽の「メモリ消去のサービス」のふりをしています。

図2 フッキング用のアクセス サービス

図3 アクセス サービスを有効にするように仕向ける

ホスト アプリはAndroidのアクセス機能を使って、特定のアクティビティとパッケージにフックして操作します。その際には、次の2つの目的でクラス名とパッケージ名を参照します。

1.GUIダイアログがアクセス許可を求める際に、アクセスを付与したり有効化したりするため。クリック可能なボタンのテキストが「this.b」(図4)の各キーワードに一致する場合、またはチェックボックスのテキストが「this.c」(図4)のキーワード「Don’t show this again (再度表示しない)」に一致する場合、アプリによってこのボタンまたはチェックボックスが自動的にクリックされます。

2.特定のアプリのキーボード入力を記録するため。PluginPhantomは、UIツリー内のすべてのリーフ ノードで、テキストやウィンドウIDなどのユーザー入力を記録します(図5)。つまり、EditText要素内にある被害者の入力が記録されることがあります。パスワード入力は記録できないことに注意してください。EditTextノードのパスワード属性がtrueであるため、EditTextノードのパスワード テキストは常に空になります。

図4 クリック時に一致したキーワード

図5 UIノードのテキストとウィンドウIDの記録

結論

Androidアプリ開発では、Androidプラグイン テクノロジーが頻繁に使用されていますが、奇しくも、マルウェア開発者に、より柔軟な方法でマルウェアを再設計するチャンスを与えることになっています。PluginPhantomファミリのマルウェアでは、プラグイン アプリを更新したりインストールすることにより、モジュールの更新や追加を簡単に実行してしまいます。回避手法においても、プラグイン マルウェアは、あらゆる悪意のある動作をプラグイン アプリに隠蔽し、ダウンロードして起動すると、静的な検出はバイパスされます。さらに、プラグイン テクノロジーは将来的には、再パッケージ手法に取って代わる可能性があります。プラグイン マルウェアでは、元のアプリを1つのプラグインとして起動した後、悪意のあるモジュールを別のプラグインとして起動するだけで済むからです。PluginPhantomは、正式なDroidPluginフレームワークの使用が確認された最初のマルウェアですが、攻撃者は、その他のプラグイン フレームワークを使ってさらに攻撃を仕掛けてくる可能性があるため、弊社はこの脅威の監視と報告を継続的に行っていきます。

Palo Alto Networksのお客様には、弊社のWildFire、URLフィルタリング、IPSサービスを通じて保護が提供されます。AutoFocusユーザーは、PluginPhantomタグを使用してこのマルウェアのサンプルを識別できます。

謝辞

PluginPhantomファミリの分析を進めるにあたり、ご支援いただいたZhi Xu氏、Claud Xiao氏、Xin Ouyang氏、Ryan Olson氏、その他Palo Alto Networksの社員に深く感謝の意を表したいと思います。

サンプルのハッシュ

002e568047074093ca43153b806fb29ec60bcf1b3040487f8ec727ace1209316
1f739108dc2a6520ad736249cd8ed0dbc674e59e687337005b3fa3ab52956bb2
1fe181823dbab09aee5cc72b83822977c64ec17cdbf739f5e6edf9b2f5697d11
8255149b6d3ffaa029c6302659aec00d17418fefc5cde9572fbf23bb996d9fde
91f7d9663d259b0c57619bbdd73fb763b6567cce0c1ae05542d8f55644e12d20
92b6a68ea66c73d5d05dff7d8d290ea8ba242846b05d6d4e2e477eb662944cac
b642b9de56218696cf5fe7f47aa914bfe3fec22a754d68c03e0e8d130efbb14f
d56f9157d5b9aabd01bc0476c1a5e5e398a90c75efb9da37f0f7fcaf61b896b8
e4977499171b475e8fd450477574b36b8d1bf0af62a5782fb77c702bcf4fb408
 

C2ドメインおよびURL

1519j010g4[.]iok[.]la
58[.]222.39.215:8088/dmrcandroid/ws/httpsData/command