Google Playで配信されていた数百の悪意あるアプリが、Android 13のセキュリティを容易に回避

Bitdefenderのセキュリティ研究者は、Google Playストアで数百の悪意あるアプリを展開した大規模な広告詐欺キャンペーンを特定し、総ダウンロード数は6,000万回を超えました。これらのアプリは文脈に合わない広告を表示し、フィッシング攻撃で被害者に認証情報やクレジットカード情報を渡すよう説得しようとさえします。

Google Playストアは、既存の保護を回避して悪意あるアプリをアップロードしようとするサイバー犯罪者にしばしば狙われます。Googleは、独自の判断で、または研究者から通知を受けて、この種のアプリをストアから排除しますが、犯罪者は適応します。  

これが、ユーザーがAndroid端末やGoogle Playストアにデフォルトで備わっている保護だけに頼るのでは不十分である主な理由の一つであり、Bitdefenderがこの問題に対処するための専用技術を用意している理由でもあります。  

Bitdefender Mobile Securityに組み込まれている「App Anomaly Detection」という技術は、インストール後のアプリの挙動を監視します。これは今日の脅威環境において極めて重要です。場合によっては、悪意ある攻撃者が、すでにGoogle Playストア向けに審査を通過していた以前は無害だったアプリの機能を改変し、危険なソフトウェアへと変えてしまいます。  

IAS Threat Labのセキュリティ研究者は、このキャンペーンの一部(180以上のアプリ)を暴露しました。しかし、Bitdefenderのセキュリティ研究者が把握したところ、このキャンペーンははるかに大規模で、危険性も私たちが通常観測する範囲を超えています。犯罪者は、端末へのアクセスを利用して、単に煩わしい全画面広告を表示するだけでなく、ユーザーをフィッシングサイトへ誘導してきました。 

主な調査結果

  • このキャンペーンには、Google Playストアで配信されていた少なくとも331本のアプリが含まれ(調査完了時点でも15本がオンラインのまま)、合計で6,000万回以上ダウンロードされました。 
  • 攻撃者は、ランチャーからアプリのアイコンを隠す方法を見つけ出しました。これは新しいAndroidのバージョンでは制限されています。  
  • 多くの場合、アプリには何らかの機能がありますが、特定の権限を使わずに制限を回避し、前面で動作している他アプリの上に文脈に合わない広告を表示できます。 
  • 一部のアプリは、フィッシング攻撃によりオンラインサービスのユーザー認証情報、さらにはクレジットカード情報の収集を試みました。 
  • Android 13では技術的に不可能であるはずなのに、ユーザー操作なしでアプリが起動できます。 
  • このキャンペーンは、単独の攻撃者によるものか、ブラックマーケットで販売されている同一のパッケージングツールを複数の犯罪者が使用している可能性があります。 

インサイトと概要

調査対象のアプリケーションは、Androidのセキュリティ制限を回避して、前面で動作していない場合でもアクティビティを開始し、必要な権限なしにユーザーへ連続的な全画面広告を大量表示します。同じ挙動は、フィッシングを試みるUI要素の表示にも利用されます。 

以下のようなシンプルなユーティリティアプリを装ったアプリケーション: 

  • QRスキャナー
  • 支出管理アプリ
  • ヘルスケアアプリ
  • 壁紙アプリ
  • その他多数…

国別の分布

ほとんどのアプリケーションは、2024年Q3にGoogle Play上で初めて活動を開始しました。さらに分析したところ、より以前に公開されていた古いものは、当初は無害でマルウェアのコンポーネントを含んでいませんでした。悪意ある挙動はその後に追加され、Q3の初めのバージョンから始まっています。

明確にしておくと、これは現在進行中のキャンペーンです。Google Playストアで公開された最新のマルウェアは、2025年3月の第1週に公開されました。調査を完了した1週間後の時点でも、15本のアプリケーションがGoogle Playでダウンロード可能な状態でした。

以下は、ストアにアップロードされた最新バッチのうちのいくつかです。どちらも3月4日にアップロードされました。

技術概要

ユーザー操作なしで実行:

アプリケーションは、インストール完了後にシステムによって自動的にクエリされ、アプリケーションのエントリポイントが読み込まれる連絡先コンテンツプロバイダを宣言します。

より最近のサンプルの一部では、リソース内で文字列として参照されるこの種のコンテンツプロバイダを追加することで、検知回避手法を逃れる犯罪者の手口の進化が見られました。以前の反復では、アプリのマニフェストで直接参照されていました。

これが、私たちの分析でこの大規模な不正キャンペーンに関与するアプリがこれほど多く見つかった理由の一つである可能性があります。攻撃者は、自分たちの手法が発見されてアプリがストアから削除されると、適応する方法を見つけることがよくあります。

アイコンを隠す手法:

悪意あるアプリをユーザーから隠す方法の一つは、アイコンを隠すことです。これはAndroid OSではもはや許可されていない挙動です。 

攻撃者がこの問題を解決するために複数のアプローチを用いたことが確認されました。最も一般的で興味深い方法は、おそらく最も効率的でもあります。アプリは、ランチャーアクティビティ(例: ユーザーが見てクリックするもの)をデフォルトで無効化した状態で提供されます。

その後、コンテンツプロバイダが提供する起動メカニズムを悪用し、サンプルはネイティブコードを使ってランチャーを有効化します。これは追加の検知回避手法として実行されている可能性があります。

「セットアップ手順」が完了すると、アプリは自身のランチャーを無効化し、アイコンは端末のランチャーから完全に消えます。この挙動は最近のAndroidバージョンでは許可されていないため、マルウェア開発者がバグを見つけたか、APIを悪用している可能性があります。これもネイティブコードで行われます。

別の仕組みとして、他のサンプルで確認されたものは、Android LEANBACK_LAUNCHER(通常のAndroidスマートフォンでは利用できない、Android TV向けに設計されたランチャーの一種)を使用して検知回避手法をさらに強化することを目的としています。

ここでは、アプリケーションはカテゴリLAUNCHERのエイリアスアクティビティを使用し、LEANBACK_LAUNCHERとして定義された最初のアクティビティを指します。エイリアスがデフォルトで無効化され、LEANBACK_LAUNCHERが表示されない場合、アプリケーションはLAUNCHERエイリアスを有効化/無効化するタイミングを選べます。

また、一部のアプリケーションのコードに残っているメタデータからも、この種のアイコン隠し挙動を推測できます。

結論は憂慮すべきものです。攻撃者は、必要だと判断したときにいつでも、アイコンとランチャーを動的に無効化/有効化できます。

また、一部のアプリはユーザーによる削除を避けるため、設定内でも隠れようとすることに気づきました。以下の例と動画では、アプリが公式のものに見せかけるため、名前をGoogle Voiceに変更しています。

前面にない状態でのアクティビティ開始と広告メカニズム:

一見したところ、別のアプリケーションが前面で動作している場合でも、アプリケーションが起動されていないのに広告を表示し始めることが確認されました。

まず、その挙動を可能にするSYSTEM_ALERT_WINDOW権限がマニフェストにあるか確認しましたが、存在しませんでした。

次に、Javaコード内で広告表示に使われるアクティビティを特定しましたが、そのアクティビティはJavaコードのどこからも呼び出されていませんでした。さらに、そのアクティビティは戻るボタンに対して空のコールバックを登録しており、ユーザーが広告を終了できないようにしています。

また、AndroidManifest.xml内のいくつかのオプションを使って、最近のタスクから消え、ユーザーから自身を隠せるようにしている点も興味深いところです。

この種のアクティビティは、この脅威のすべてのサンプルで一貫しているように見えますが、名前は(おそらく自動生成された)異なるものになっています。

ネイティブライブラリに戻りましょう。上記のアクティビティを起動するメカニズムがそこにあり、次のAPI呼び出しを悪用することで、必要な権限なしにアクティビティの起動に成功していることが分かります:

  • DisplayManager.createVirtualDisplayを使用して、ランダムな名前の仮想ディスプレイを作成し、次のフラグを設定する:

DisplayManager.VIRTUAL_DISPLAY_FLAG_PUBLIC | DisplayManager.VIRTUAL_DISPLAY_FLAG_PRESENTATION | DisplayManager.VIRTUAL_DISPLAY_FLAG_OWN_CONTENT_ONLY

  • DisplayManager.DisplayListenerを作成し、onDisplayAdded関数のコールバックで、作成された新しいディスプレイを探索する。
  • 新しいディスプレイが見つかると、アプリケーションはpresentation APIを使用してそのディスプレイ上にプレゼンテーションを作成する: Android.app.Presentation(context, new_display)、そしてプレゼンテーションのshow()関数が呼び出される。
  • 遅延後、Intent.FLAG_ACTIVITY_NEW_TASKフラグ付きでstartActivityを使用し、必要なアクティビティを起動する。

私たちのインサイトにより、複数のアプリでこの種の挙動が明らかになり、全画面アクティビティを介してフィッシング攻撃を展開できる技術的能力がはっきり示されました。ユーザーは、さまざまな口実でFacebook、YouTube、その他のオンラインサービスの認証情報、あるいはクレジットカード情報の入力を求められる可能性があります。

次の動画は、特定のサンプルからではなく、私たちのインサイトから確認されたアプリの挙動と能力を再現したものです。

また攻撃者は、端末が感染していると脅してユーザーを怖がらせ、バンキング型トロイの木馬など危険なマルウェアとなり得るサードパーティ製アプリをインストールさせようとすることも一般的です。

永続化メカニズム:

システムによって頻繁にクエリされるコンテンツプロバイダの仕組みに加え、調査したアプリケーションの多くは、アプリのエントリポイントを使ってフォアグラウンドサービスを開始し、通知バーに空のエントリを表示します。

この挙動が許可されていたのはAndroid APIレベル31までです。新しいAndroidではフォアグラウンドサービスがブロックされるため、アプリケーションは最初の広告アクティビティの後にネイティブコードからフォアグラウンドサービスを開始します。するとアプリはフォアグラウンドにあると見なされ、サービスの開始が許可されます。

別の永続化メカニズムは、さまざまなダミーのブロードキャストレシーバーやサービスを利用します。

C2通信:

ほとんどのアプリケーションは、カスタムの専用C2ドメインを使用し、各パッケージに固有のリンクを提供します(詳細はAnnex/IOCs参照)。

また、AES、Base64、独自暗号の組み合わせを用いた暗号化通信のさまざまな方法も観測しました。

マルウェアは辞書ベースの構造を用いて端末情報を流出させますが、この辞書のキーは多態化され、各アプリケーションごとに固有です。つまり、データ送信に使われるラベルが常に変化し、検知と分析がより困難になります。

サーバー側では、復号後であっても、さらなるブロック分析を妨げるために、応答が意図的に人間にとって分かりにくくされています。この意味不明な応答は、広告SDKを設定するために使用されます:

難読化および解析妨害メカニズム:

分析したアプリケーションの多くは、XORに基づく類似の文字列難読化手法を使用していますが、入力はBase64エンコード文字列、平文文字列、あるいはハードコードされたバイト配列など、さまざまです。

また、前面にない状態でアクティビティを開始する仕組みが、ランダムに生成された名前のネイティブライブラリ内にあることも特定しました。

ネイティブライブラリはArmaririsツールで難読化されているようです。

さらに分析を進めたところ、このライブラリには、エミュレート環境で実行されているか、デバッガが接続されているかを判定して検知を回避できるランタイムチェックが含まれていることが分かりました。

侵害指標(IOC):

URL

パッケージ名

翻訳元: https://www.bitdefender.com/en-us/blog/labs/malicious-google-play-apps-bypassed-android-security

ソース: bitdefender.com