多くのトリックを用いたHiddenAdsマルウェア


有名アプリを模倣しユーザーを騙すAndroidマルウェアHiddenAdsを多数発見

McAfee Mobile Researchチームは、新種のAndroid向けマルウェアHiddenAdsを発見しました。HiddenAdsはアドウェアの一種で、広告表示やデータ収集を行います。一般的に、アドウェアが広告収入を得る方式は、端末上で広告表示する方式と、ユーザーの広告クリックによって課金が発生する方式に大別されます。

アフィリエイトマーケティングでは、広告を宣伝活動に利用しますが、詐欺マーケティングの分野では、広告がマルウェアの拡散に利用されてしまう可能性があります。多くのアドウェアは、正規のアプリを悪用し、ユーザーを騙して、インストール数を稼ぎます。今回私たちは、下記2つの有名アプリの偽物バージョンに注目しました。

  • FaceApp:機械学習を使った写真編集ソフト
  • Call of Duty:Android向けの有名なゲーム

これらのアプリは若者に人気のアプリケーションで、アプリ内購入によるビジネスモデルが採用されています。これら2つの要因はとても興味深く、セキュリティ意識の低いユーザーが課金回避のために海賊版をインターネット上で検索する機会を増加させているかもしれません。そのためかもしれませんが、HiddenAdsの亜種でも、音楽ストリーミングアプリSpotifyやよく知られたゲームアプリなどを装って配布されていることが確認されています。

私たちは、このHiddenAdsマルウェアに関連した3万個以上サンプルを世界的に観測しています。

https://www.virustotal.com/graph/g05e894f94d9b40ab9651e0b353a66b8b4eb54e6dc8884fc2b52b86e205bc8fcc

図1. マルチトリックス HiddenAdsマルウェア

これらのマルウェアサンプルは公式のGoogle Playストアでは配布されておらず、多くの場合、信頼されていないインターネット上にAPKファイルがホストされています。偽アプリをダウンロードするための悪質なリンクが記載されたYouTubeチャネルを利用してマルウェアが配布されていました。

このHiddenAdsの亜種は、様々なテクニックを使用して、ユーザーを騙したり、マルウェアリサーチャーの解析を妨害しています。本ブログでは、その詳細についてご紹介します。


配布チャネル

まず、これらのマルウェアサンプルは、人気アプリを装って配布されていました。そのため、ユーザーが人気アプリの海賊版を探している際に、マルウェアに感染してしまう危険性があります。前述したように「Call of Duty」は有名なゲームアプリケーションで、多くのユーザーがモバイル版アプリやゲームの攻略方法をオンラインで探しています。不運な場合には、下記結果を見つけるかもしれません。

図2. 配布チャネル

上記のYouTubeビデオには、モバイル版アプリのダウンロードリンクが記載されており、そのリンクをクリックすることでAPKファイルがダウンロードされます。そして、そのアプリを端末にインストールすることで、ユーザーはマルウェアに感染してしまいます。


ユーザーを騙すトリック

1.アプリケーション名のトリック

ユーザーは、一般的にアプリ名とアイコンをみて、アプリケーションを特定します。マルウェアリサーチャーは、アプリケーションのパッケージ名を使用して一意に特定しています。このマルウェアでは、正規アプリであると思わせるために、Google Playストアで有名なアプリケーションのアプリ名、アイコン、パッケージ名を流用するトリックを使っています。

表1. 解析サンプルの基本情報

下記スクリーンショットがFaceAppというアプリをGoogle Playストアで検索した結果です。

図3. Google PlayストアのFaceAppのアプリ情報

この人気アプリはアプリ内購入があります。もしユーザーがフリーの海賊版を非公式サイトから探したいと考えているならば、結果として私たちが解析しているマルウェアサンプルにたどり着くかもしれません。偽アプリのアプリ名、アイコン、そしてバージョン番号は、Google Playストアの正規アプリにとても類似しています。一方で、ファイルサイズは異なっていることも覚えておきましょう。

2.アイコンのトリック

当然、ユーザーはアプリアイコンは、インストール前後で同じものであると思っています。しかしながら、このマルウェアでは、AndroidManifest.xmlファイルでアイコンを2つ定義することで、異なるものにしています。また、アクティビティのラベル名は「設定(Settings)」になっています。

図4-1. AndroidManifest.xmlファイルに定義された2つのアイコン

ダウンロードしたマルウェアサンプルをインストールために使用するファイルエクスプローラ上では、最初の人物アイコン(tv_icon.png)が表示されています。インストール画面においても最初のアイコンが表示されています。インストールが完了すると、メニュー画面上では、2番目の設定アイコン(but_invertc.png)が表示されます。

図4-2. インストール前後のアイコン

これはアイコンの表示トリックです。マルウェアをインストールしたあと、予期したアイコンがデバイス上で見当たらないことでユーザーは驚くことでしょう。おそらく、インストール中に何かエラーが発生し、インストールに失敗したと考えるかもしれません。実際には、マルウェアすでに端末にインストールされてしまっており、2つの設定アプリが表示されています(右側の四角で囲まれたものが偽アプリ)。ユーザーが設定アプリを起動する際に、偽アプリのアイコンを代わりにクリックしてしまうことで、悪意あるアプリケーションが起動します。

3.ランチャートリック

ユーザーが偽アプリの設定アプリアイコンをクリックすると、悪質アプリが起動して、次のトリックが発動します。

図5. OKボタン押下後にアイコンが消滅した様子

このマルウェアは、「このアプリは、あなたの国では利用できません」という警告ダイアログをアプリ起動後すぐに表示します。実際には国判定は行われておらず、アイコンが消滅したことをユーザーに信じさせるためのメッセージです。メッセージ表示後、マルウェアはバックグラウンドで動作し続けていますので、このマルウェアは特定の国で利用できないというわけではありません。それは単純に被害者にとって制御できない状態になってしまっているということです。


難読化のテクニック

これまで見てきたテクニックは、マルウェアがユーザーを欺くための手法です。次に、このマルウェアサンプルが使用している解析妨害テクニックを紹介します。このマルウェアサンプルの開始時には、MultiDex.install関数が実行されます。MultiDexは分割された複数のDEXファイルをサポートするために使用される有名なモジュールです。初期解析において、人気の有名アプリがなぜこのMultiDexモジュールを使用しているのか奇妙に思いました。

図6. 「MultiDex.install」機能の悪意のあるコード

そして、その疑問は私たちをさらなる解析に進ませることになり、最終的には、このモジュールは悪質なコードの入り口であることを突き止めました。

・外部ライブラリを復号

外部ライブラリの復号関数は複雑に難読化されていました。解析妨害のために変数名は無意味な文字に置き換えられ、単純な関数を複数の関数に分割していたり、無意味なコードが挿入されていました。

・復号処理のコードを解読することでそのプロセスを理解することが可能に

図7-1. 多くの関数に分割
図7-2. 関数に埋め込まれた無意味なコード

復号プロセスでは、まず、CPUタイプに応じてリソースファイルresource/string.xmlからデータを読み込みます。

  • CPUがarm64のとき、x1の値を読み込む
  • CPUがarmeabiのとき、x0の値を読み込む
  • それ以外のCPUは未サポート
図8-1. リソースファイルに記載された読込データ

データの左側パートはELFファイルのヘッダーを表し、右側パートは配列名が記載されています。

・arrays.xmlファイルに配列名 “a58ax” が定義されており、BASE64エンコードされたデータ文字列が格納されています。

・この文字列をBASE64XORでデコードすることで、外部ライブラリを復元します。

図8-2. arrays.xmlファイルに格納されているBASE64エンコードされたデータ

最後に、System.load関数を実行して復元した外部ライブラリをロードし、外部ライブラリに実装されているネイティブ関数を実行します。

図9. 外部ライブラリのロードとネイティブ関数の呼出し

ネイティブ関数では、assets/geocalc_lite.dat ファイルを読み込み、コード本体となるDEXファイルを/data/data/de.fastnc.android.geocalc_lite/app_app_apk/geocalc_lite.dat.jar のパスに復元します。


復元されたDEXファイルの解析

復元されたDEXファイルでは広告表示が行われています。広告データは外部サーバーから受信し、それをデバイス上に表示します。コード解析結果から10種類以上の広告タイプがあることがわかりました。様々な方法で広告データを読み込み、表示する仕組みが実装されています。

・デフォルトの設定パラメータ
DEXファイルにはデフォルトパラメータがBASE64でエンコードされた文字列として埋め込まれています。

図10-1. BASE64でエンコードされたデフォルトパラメータ
図10-2. デコードした後のデフォルトパラメータ

デコードされたデフォルトの設定パラメータはJSON形式のオブジェクトで、様々なパラメータが格納されています。

  • metricsApiKey: Yandex SDKのAPIキー.
  • installFrequencySeconds: ‘install’リクエストの送信間隔時間。(デフォルトは1000– 1640秒)
  • overappStartDelaySeconds: HTTPリクエストの遅延時間。(デフォルトは30000– 5時間20分)
  • bundles_*(b,c,l,n): 広告表示の可否情報

“domain” パラメータは重要であり、リモートサーバーのアドレスリストが記載されており、これらのリストからランダムに接続先が決定されています。もし、選択したものが利用できない場合には、別のアドレスが使われます。


リクエストとレスポンス

DEXファイルには、3つのタイプのリクエストが定義されており、それぞれの起動条件は異なります。そのうち2つのリクエストに関して、観測できたサーバーレスポンスの解析を行いました。

図11-1. リクエストとレスポンスのキャプチャ

1. ‘install’リクエスト

アプリ起動中に条件が満たされるとリモートサーバーにこのリクエストが送信されます。’type’の値として’install’という文字列が設定されています。

図11-2. インストールリクエスト

ファイルされたJSONオブジェクトに、SDKのバージョン情報が含まれており、それが比較的最近の201988日に更新されたものであることが分かります。

図11-3. バージョン名とSDK情報の定義

リモートサーバーからのレスポンスはたいてい空ですが、数日間動作させることにより、レスポンスの実データを入手することに成功いたしました。

図11-4. レスポンスデータ

リモートサーバーのレスポンスの内容は、デフォルトパラメータをカバーしています。

  • Enabled: 広告の有効化フラグ。デフォルトは無効化されており、サーバーからのレスポンスにより有効化される。
    • 新しいリモートサーバーのアドレス:‘http://hurgadont.com’, ‘http://asfintom.com’, ‘http://eklampa.com’, ‘http://glanmoran.com’, ‘http://cantomus.com’, ‘http://fumirol.com’ and ‘http://bartingor.com’
    • 既存のリモートサーバーのアドレス:
      “http://minasorp.com”,”http://omatist.com”,”http://retinba.com”,”http://baradont.com”,”http://lindostan.com”, “http://avgon.net” and “http://dorontalka.com”

これらの7つの新しいアドレスと、デフォルトの7つのアドレスの計14つのリモートサーバーアドレスがあり、本ブログ執筆時点においてこれらはまだ稼働していました。

2. ‘b/request’ request

本リクエストは中核をなすリクエストで、’type’の値として’b/reqeust’という文字列が設定されています。

図12-1. ‘b/request’ リクエスト

DEXファイルでは、多数のイベントを監視することで、イベントに応じたコンテンツやリクエストをリモートサーバーに送信します。

表2. イベントの監視

広告バナーのタイプと、イベントの指定が定義されています。

図12-2. バナータイプとスポットタイプ

レスポンスデータは下記3つのメイン機能が定義されています。

  • ‘sdkUpdate’ data: SDKの最新バージョンのロード.
  • ‘banners’ data: 広告バナーの表示Used to show banner advertisements.
  • ‘mediatorSDKs’ data: mediatorSDKsリクエストの送信
図12-3. ‘b/request’ レスポンス

私たち観測したの‘b/request’リクエストのレスポンスには、バナーデータが1つ含まれており、その詳細データは以下のようなフィールドが定義されていました。

図12-4. バナーデータと‘html’ フィールド情報

‘html’は重要なフィールド情報で、loadDataWithBaseURL APIを実行することで、WebView内に指定されたコンテンツをロードします。観測したデータによると、最初のURLhxxp://bestadbid.com/afu.php?zoneid=1558701)をWebViewにてロードして表示します。このURLにはリダイレクトが設定されており、サイトを開くたびに違うサイトに遷移します。私たちの試験環境では、ギャンブルサイトに誘導されることが確認されています。

図12-5. ギャンブルサイトへリダイレクト

mediatorSdks データ:mediatorSdksデータは、実際のサーバーレスポンスを確認することはできず、実際のデータの内容はわからなかったが、“tracking”データで指定されたURLを端末上で表示した結果をリモートサーバに送信する機能が実装されています。

図12-6. mediatorSdksデータの定義

3. Mediator統計リクエスト

“tracking”データのURL表示後、/sdk/stat/mediator_* リクエストによって、実行ステータス情報をリモートサーバーにレポートしています。レポートタイプには4種類あり、1つは失敗、残り3つは成功のステータスであり、この3つの成功ステータスに関連したURL“tracking”データとしてレスポンスに含まれると推察しています。

図12-7. 4種類のメディエーター統計リクエスト

結論

今回解析したマルウェアは、古典的なアイコンを非表示にするアドウェアであり、アプリケーションアイコンを隠し、難読化されたDEXファイルを動的に展開することで広告を表示していました。この目的のために、多くの技術が含まれていることを見てきました。正規アプリであると思いこませるためのアイコントリック。セキュリティツールによる検出を回避するための難読化。復号されたDEXファイルとレスポンスデータの解析から14個のリモートサーバーアドレスを発見し、制御のトリガーの為に、多くのイベントを監視していることを突き止めました。これらのことは、このマルウェアがよく設計されたものであることを表しており、一旦端末にインストールしてしまうと、ユーザーは感染したことに気づくのは難しく、削除するのも困難です。

マカフィーモバイルセキュリティ製品では、この脅威をAndroid/HiddenAdsとして検出し、これらの脅威からユーザーを保護します。マカフィー製品を端末にインストールするとともに、インターネット上の信頼されない場所で配布されているアプリはインストールしないようにして下さい。

マカフィーモバイルセキュリティについてはhttps://www.mcafeemobilesecurity.comをご覧ください。

※本ページの内容は、2020年3月4日(US時間)更新の以下のMcAfee Blogの内容です。
原文:Multi-tricks HiddenAds Malware
著者:ZePeng Chen