料金詐欺マルウェア: Android アプリケーションがどのようにして財布を空にするか

news

課金詐欺マルウェアは、悪意のあるアプリケーションがユーザーの知らないうちに同意なしにプレミアム サービスに登録する課金詐欺のサブカテゴリであり、Android マルウェアの最も一般的なタイプの 1 つであり、進化を続けています。

SMS 詐欺や通話詐欺などの請求詐欺の他のサブカテゴリと比較して、電話料金詐欺には独特の動作があります。 SMS 詐欺や通話詐欺は単純な攻撃フローを使用してプレミアム番号にメッセージや通話を送信しますが、電話料金詐欺には複雑な複数ステップの攻撃フローがあり、マルウェア開発者は改善を続けています。

たとえば、この脅威が特定のネットワーク事業者のユーザーを標的にする方法に関連する新しい機能を確認しました。デバイスがターゲット ネットワーク オペレータのいずれかに加入している場合にのみ、そのルーチンを実行します。また、デフォルトでは、アクティビティにセルラー接続を使用し、Wi-Fi 接続が利用可能な場合でも、デバイスをモバイル ネットワークに強制的に接続します。ターゲット ネットワークへの接続が確認されると、密かに不正なサブスクリプションを開始し、ユーザーの同意なしにそれを確認します。場合によっては、そのためにワンタイム パスワード (OTP) を傍受することさえあります。次に、サブスクリプションに関連する SMS 通知を抑制して、ユーザーが不正なトランザクションに気付き、サービスからサブスクリプションを解除するのを防ぎます。

料金詐欺マルウェアのもう 1 つの固有の動作は、動的コード ローディングの使用です。これにより、攻撃フローの特定の部分でコードの一部がデバイスにダウンロードされるため、モバイル セキュリティ ソリューションが静的分析を通じて脅威を検出することが困難になります。この回避手法にもかかわらず、この脅威をフィルタリングして検出するために使用できる特性を特定しました。また、この脅威を軽減するのに役立つ Android API の制限と Google Play ストアの公開ポリシーの調整も見られます。

電話料金詐欺は、最初の主要なマルウェア ファミリである Joker が 2017 年に Google Play ストアに登場して以来、メディアの注目を集めてきました。このような注目にもかかわらず、この種のマルウェアがどのように不正行為を実行するかについて公開された資料は多くありません。このブログ投稿の目的は、このマルウェアがどのように動作するか、アナリストがそのような脅威をより適切に特定する方法、Android のセキュリティを改善して電話料金詐欺を軽減する方法に関する詳細な分析を共有することです。このブログでは、次のトピックについて説明します。

WAP 課金メカニズム: 概要

料金詐欺マルウェアを理解するには、攻撃者が使用する課金メカニズムについて詳しく知る必要があります。通話料詐欺で一般的に使用される課金タイプは、ワイヤレス アプリケーション プロトコル (WAP) です。 WAP 課金は、消費者がこのプロトコルをサポートするサイトから有料コンテンツを購読し、携帯電話の請求書から直接課金されるようにする支払いメカニズムです。サブスクリプション プロセスは、顧客がセルラー ネットワークを介してサービス プロバイダーとのセッションを開始し、有料サービスを提供する Web サイトに移動することから始まります。 2 番目のステップとして、ユーザーはサブスクリプション ボタンをクリックする必要があります。場合によっては、サブスクリプションを確認するためにサービス プロバイダーに送信する必要があるワンタイム パスワード (OTP) を受け取ります。全体的なプロセスを以下に示します。

ワイヤレス アプリケーション プロトコルの課金プロセスのしくみを示す図。デバイスがサービスをブラウズした瞬間からサービス加入の確認まで、モバイル デバイスとプレミアム サービス プロバイダーとの間の相互作用がマッピングされます。
図 1. WAP 請求プロセスの概要

プロセスはサービス プロバイダーによって異なるため、すべての手順が常に存在するわけではないことに注意してください。たとえば、一部のプロバイダーは OTP を必要としません。つまり、モバイル ユーザーは、デバイスがセルラー ネットワークに接続されているときにサブスクリプション ボタンをクリックするだけで、サービスにサブスクライブできます。

料金詐欺による不正なサブスクリプション

ユーザーの同意なしにサブスクリプションが行われた場合、サブスクリプションは不正であると分類されます。料金詐欺の場合、マルウェアはユーザーに代わってサブスクリプションを実行します。この方法では、次の手順でプロセス全体を認識できません。

  1. Wi-Fi 接続を無効にするか、ユーザーがモバイル ネットワークに切り替えるのを待ちます
  2. 購読ページにサイレントに移動します
  3. 購読ボタンを自動クリック
  4. OTP を傍受する (該当する場合)
  5. OTP をサービス プロバイダーに送信する (該当する場合)
  6. SMS 通知をキャンセルする (該当する場合)

これらの手順を実行する前に、マルウェアが無許可で行う重要な検査の 1 つは、モバイル国コード (MCC) とモバイル ネットワーク コード (MNC) を通じて加入者の国とモバイル ネットワークを識別することです。この検査は、特定の国または地域内のユーザーを対象として行われます。どちらのコードも、 TelephonyManagerまたはSystemPropertiesクラスを使用して取得できます。 TelephonyManager.getSimOperator() API 呼び出しは、連結された文字列として MCC コードと MNC コードを返しますが、同じクラスの他の関数を使用して、デバイスが現在加入しているモバイル ネットワークに関するさまざまな情報を取得できます。ネットワークと SIM オペレータは (ローミングなどで) 異なる可能性があるため、通常、マルウェア開発者はgetSimOperator関数を好んで使用します。

SystemProperties.get(String key)関数を使用すると、同じタイプの情報を取得できます。key パラメーターは、gsm.operator.numeric、gsm.sim.operator の 1 つまたは複数の文字列 (複数の呼び出しを使用) です。数値、gsm.operator.iso-country、gsm.sim.operator.iso-country、gsm.operator.alpha、gsm.sim.operator.alpha

最初の呼び出しとの違いは、 android.os.SystemPropertiesクラスが@SystemApiとしてマークされているため、アプリケーションは Java リフレクションを使用して関数を呼び出す必要があることです。 MNC および MCC コードは検出を回避するためにも使用されます。これは、SIM オペレーターが標的のオペレーターに属していない限り、悪意のあるアクティビティが実行されないためです。

Joker マルウェアのコード スニペットのスクリーンショット。このコードは、デバイスが南アフリカの携帯電話会社の傘下にある場合にのみマルウェアが実行されることを指定しています。
図 2. ペイロードを実行する Joker マルウェア、南アフリカの携帯電話事業者を標的に

以下のセクションでは、Android オペレーティング システムのコンテキストにおける不正なサブスクリプション手順の分析を示します。この分析は、料金詐欺スキームの実装に必要な API 呼び出しとアクセス許可を特定するのに役立ちます。

セルラー通信の強制

Android API レベル 28 (Android 9.0) 以下をターゲットとする料金詐欺マルウェアの亜種は、 WifiManagerクラスのsetWifiEnabledメソッドを呼び出して Wi-Fi を無効にします。この通話に必要な権限はACCESS_WIFI_STATECHANGE_WIFI_STATEです。両方の権限の保護レベルが通常に設定されているため、システムによって自動的に承認されます。

一方、より高いレベルの API を標的とするマルウェアは、 ConnectivityManagerクラスのrequestNetwork関数を使用します。 Android 開発者ページでは、 requestNetwork メソッドについて次のように説明されています。

このメソッドは、指定された NetworkRequest に一致する最適なネットワークを見つけようとし、現在基準を満たしているネットワークがない場合は、一致するネットワークを見つけようとします。プラットフォームは、独自の裁量でどのネットワークが最適かを評価します。スループット、遅延、バイトあたりのコスト、ポリシー、ユーザー設定、およびその他の考慮事項は、最良のネットワークと見なされるものを決定する際に考慮される場合があります。

この呼び出しに必要なアクセス許可は、 CHANGE_NETWORK_STATE (保護レベル: 通常) またはWRITE_SETTINGS (保護レベル: signature|preinstalled|appop|pre23) のいずれかですが、後者は保護されているため、通常は前者がマルウェア開発者に好まれます。料金詐欺を実行できるマルウェア サンプルから以下に示すコード スニペットでは、関数vgy7NET_CAPABILITY_INTERNET (定数値: 0x0000000c) でTRANSPORT_CELLULAR トランスポート タイプ (定数値: 0x00000000) を要求しています。

TRANSPORT_CELLULAR トランスポート タイプを要求する Joker マルウェアのコード スニペットのスクリーンショット。
図 3. TRANSPORT_CELLULAR トランスポート タイプを要求する Joker マルウェア サンプルのコード

図 3. TRANSPORT_CELLULAR トランスポート タイプを要求する Joker マルウェア サンプルのコード

NetworkCallbackは、ネットワーク ステータスを監視し、 ConnectivityManager.bindProcessToNetwork関数を介してプロセスを特定のネットワークにバインドするために使用できるネットワークタイプ変数を取得するために使用されます。これにより、既存の Wi-Fi 接続がある場合でも、マルウェアはモバイル ネットワークを使用できます。以下に示す概念実証コードは、上記の手法を使用してTRANSPORT_CELLULAR トランスポート タイプを要求します。トランスポート タイプが使用可能な場合、プロセスをモバイル ネットワークにバインドして、アプリケーションの WebView で example.com のホストをロードします。

TRANSPORT_CELLULAR トランスポート タイプのリクエストを示す概念実証コードのスクリーンショット。
図 4. TRANSPORT_CELLULAR トランスポート タイプを要求する概念実証コード

モバイル接続も利用できる場合でも Wi-Fi 接続が優先されることが予想されますが、このプロセスではセルラー ネットワークのみを使用してサーバーと通信します。

2 つの Android モバイル ブラウザー画面を並べて表示したスクリーンショット。左側のブラウザ画面は example.com のコンテンツを読み込み、右側のブラウザ画面は空白のページを読み込みます。
図 5. モバイル ブラウザは、TRANSPORT_CELLULAR トランスポート タイプが利用可能な場合は example.com を読み込み、Wi-Fi のみが利用可能な場合は空白のページを読み込みます

実際、ユーザーはモバイル データを手動で無効にして、マルウェアがセルラー ネットワークを使用できないようにする必要があります setWifiEnabledは廃止されましたが、API レベル 28 以下をターゲットとするマルウェアによって引き続き使用される可能性があります。

プレミアム サービス オファーの取得とサブスクリプションの開始

SIM オペレーターがターゲット リストにあり、デバイスがTRANSPORT_CELLULARタイプのネットワークを使用していると仮定すると、次のステップは、プレミアム サービスを提供する Web サイトのリストを取得し、それらに自動的にサブスクライブしようとすることです。

マルウェアは C2 サーバーと通信して、提供されているサービスのリストを取得します。オファーには、最終的にランディング ページと呼ばれる Web ページに到達するリダイレクト チェーンにつながる URL が含まれています。

次に何が起こるかは、サブスクリプション プロセスが開始される方法によって異なります。したがって、マルウェアには通常、さまざまなサブスクリプション フローを処理できるコードが含まれています。典型的なシナリオでは、ユーザーは以下に示すような HTML 要素をクリックし (JOIN NOW)、2 番目のステップとしてサーバーに確認コードを送信する必要があります。

アプリとプレミアム サービスのサブスクリプションを提供する Web サイトのスクリーンショット。 Web サイトには 2 つのバナーがあり、上のバナーには「今すぐ参加」というテキストが表示されています。下部のバナーには、スポーツ関連の画像 (サッカーとカーレース) が表示されます。
図 6. ユーザーの知らないうちにバックグラウンドで読み込まれるサブスクリプション ページ。

マルウェアがこれを自動的に行うために、ページの読み込みの進行状況を監視し、購読を開始する HTML 要素をクリックするように設計された JavaScript コードを挿入します。ユーザーは 1 つのサービスに 1 回しかサブスクライブできないため、コードは Cookie を使用して HTML ページをマークし、重複したサブスクライブを回避します。以下は、そのようなコードの例です。

図 7. 関連する HTML 要素をスクレイピングする JavaScript 挿入コード

76 行目で、 getElementsByTagNameは、 inputとしてタグ付けされたすべてのドキュメント オブジェクト モデル (DOM) 要素のコレクションを返します。 78 行目のループは、すべての要素を調べて、そのnamevalue 、およびaltプロパティをチェックします。要素に「確認」、「クリック」、「続行」などのキーワードが含まれていることが検出されると、以下に示すようにc関数に送信されます。

選択した HTML 要素のクリックをシミュレートする関数の JavaScript コードのスクリーンショット。
図 8. 選択した HTML 要素のクリックをシミュレートする JavaScript 関数

36 行目のifステートメントは、 jdh関数を呼び出して、要素が既にクリックされているかどうかを確認します(下の図 12 を参照) 。最後に、 c関数は、37 行目の分岐 (図 11 を参照) に従います。

プレミアム サービス ページが既にアクセスされているかどうかをマルウェアがチェックする JavaScript コードのスクリーンショット。
図 9. ページが既にアクセスされているかどうかをチェックする JavaScript コード

HTML ページのロード プロセスは、WebView にアタッチされたWebViewClientonPageFinishedコールバックを使用して追跡されます。その後、相対メッセージ タイプをリッスンするハンドラーは、サブスクリプションを実行するために必要な次の手順に応じて動作します。以下のコード スニペットでは、WebView に読み込まれた URL とID 「128」のシグナルhandler2に送信され、サービスが評価され、サブスクリプション プロセスが開始されます。

特定のメッセージ タイプをチェックして、サブスクリプションを実行するために必要な次のステップを決定するマルウェア コードのスクリーンショット。
図 10. サブスクリプション プロセスを開始するために必要な手順を評価するマルウェア

マルチステップまたはターゲット サブスクリプション プロセスでは、追加の検証手順が必要になる場合があります。以下に示すハンドラーは、WebView に読み込まれたページ URL をチェックします。 URL がdoi[.]mtndep.co.za/service/ と一致する場合、ハンドラーはProperties.call_jbridge_dump変数に割り当てられた JavaScript コードを実行します。

次に実行するルーチンを決定するために必要な条件を識別するマルウェア コードのスクリーンショット。表示される URL などの特定の条件に基づいてコードを割り当てます。
図 11. 特定の条件に応じてコードを実行するマルウェア

ID 「107」の信号は、コマンド アンド コントロール(C2)サーバーとの通信を必要とするいくつかの追加ステップをトリガーします。このケースは、次の図に示されています。

ID番号「107」のシグナルを識別した際に実行されるマルウェアコードのスクリーンショット。
図 12. 特定のシグナル ID に応じてコードを実行するマルウェア

シグナルを受信すると、ハンドラーはv1.bhu8関数を呼び出します。

ハンドラが v1.bhu8 関数を呼び出すマルウェア コードのスクリーンショット。上記の機能は、不正防止保護に関連するサービスがデバイスで実行されているかどうかを確認します。
図 13. 不正防止保護を攻撃するマルウェア

サーバーの応答でweb-zdm[.]secure-d[.]io/api/v1/activateを確認した後、マルウェアはtpack[.]l2.bhu8[.]vgy7関数を呼び出します。この関数は、アプリケーションの WebView に読み込まれた現在の URL と、国コードや HTML コードなどの追加情報を送信します。

マルウェアがデバイスから C2 サーバーに情報を送信するマルウェア コードのスクリーンショット。送信される情報には、国コード、ブラウザに表示されるウェブサイトの HTML コードが含まれます。
図 14. C2 サーバーに情報を送信するマルウェア
C2 サーバーによってソルバー タイプのサービスが提供されるマルウェア コードのスクリーンショット。
図15. C2サーバーが提供するソルバー型サービス

OTP の傍受

ほとんどの場合、サービス プロバイダーは、サブスクリプション プロセスを完了するためにサーバーに返送する必要がある OTP を送信します。 OTP は HTTP または USSD プロトコルまたは SMS のいずれかを使用して送信できるため、マルウェアはこれらのタイプの通信を傍受できなければなりません。 HTTP プロトコルの場合、サーバーの応答を解析してトークンを抽出する必要があります。一方、USSD プロトコルの場合、傍受する唯一の方法は、アクセシビリティ サービスを使用することです。

android.permission.RECEIVE_ SMS権限を必要とする SMS メッセージを傍受する方法の 1 つは、 SMS_ RECEIVED アクションをリッスンするBroadcastReceiverをインスタンス化することです。

次のコード スニペットは、 BroadcastReceiverを作成し、スーパークラスのonReceiveコールバックをオーバーライドして、「rch」で始まるメッセージを除外します。

マルウェアが「rch」で始まる SMS メッセージをフィルタリングするマルウェア コードのスクリーンショット
図 16. 「rch」で始まる SMS メッセージを除外するコード

その後、受信者がSMS_RECEIVEDアクションをリッスンできるようにするIntentFilterを作成し、最後に受信者が動的に登録されます。

受信者が受信した SMS メッセージをリッスンできるようにする IntentFilter コードのスクリーンショット。
図 17. レシーバーが SMS_RECEIVED アクションをリッスンできるようにする IntentFilter

HTTP プロトコルを使用して送信された OTP メッセージを処理するために、マルウェアは HTML コードを解析して、検証トークンを示すキーワードを検索します。次のコードには、抽出されたトークンがsendTextMessage API 呼び出しを使用してサーバーに送信されるフローが含まれています。

OTP メッセージから抽出された検証トークンが C2 サーバーに送信されるマルウェア コードのスクリーンショット。このコードは、これが sendTextMessage API を介して行われることを示しています。
図 18. 抽出されたトークンが sendTextMessage API 呼び出しを使用して C2 サーバーに送信される

このフローを有効にするために必要な追加のアクセス許可はSEND_SMSです。

SMS メッセージをインターセプトするもう 1 つの方法は、 NotificationListenerServiceを拡張することです。このサービスは、システムの既定の SMS アプリケーションから送信されたものを含め、新しい通知が投稿または削除されたときに、システムからの呼び出しを受信します。以下のコード スニペットは、この機能を示しています。

NotificationLIstenerService が拡張されたマルウェア コードのスクリーンショット。これにより、新しい通知が投稿または削除されたときに、アプリがシステムからの呼び出しを受信できるようになります。
図 19. NotificationListenerService サービスの拡張

分析中に、タイトルが「SMS_Received」、テキストが「Pin:12345」の通知をトリガーした結果、アプリケーションの logcat に次の出力が表示されました。

マルウェアの logcat のスクリーンショット。 logcat の出力は、デバイスが受信した通知の内容をキャプチャできることを示しています。
図 20. 通知がポストされた後の Logcat 出力

最後に、SMS メッセージをインターセプトするブロードキャスト レシーバーと通知リスナーの手法に加えて、 ContentObserverを使用して、特定のコンテンツに対する変更のコールバックを受信できます。 SmsObserverクラスのonChangeコールバック (以下に示す) は、システムが SMS コンテンツ プロバイダーの状態を変更するたびに呼び出されます。

マルウェアが着信 SMS メッセージを監視する方法を示す概念実証コードのスクリーンショット。
図 21. SmsObserver を介した受信 SMS メッセージの概念実証コード監視

通知の抑制

API レベル 18 以降、 NotificationListenerServiceを拡張するアプリケーションは、他のアプリケーションからトリガーされる通知を抑制することが承認されています。関連する API 呼び出しは次のとおりです。

  • cancelAllNotifications()は、通知マネージャーにすべての通知を閉じるように通知します
  • cancelNotification(String key)は、通知マネージャーに単一の通知を閉じるように通知します
  • cancelNotifications(String [] keys)を使用して、通知マネージャーに複数の通知を一度に破棄するよう通知します。

この API サブセットは、デフォルトの SMS アプリケーションによって投稿されるサービス サブスクリプション通知メッセージを抑制するために、マルウェア開発者によって悪用されます。より具体的には、サブスクリプションが成功すると、サービスプロバイダーはユーザーにメッセージを送信して料金について通知し、サブスクリプションを解除するオプションを提供します。通知リスナー サービスにアクセスすることで、マルウェアは上記の機能のいずれかを呼び出して通知を削除できます。

クローキングに動的コード ローディングを使用する

クローキングとは、悪意のある動作を隠すために使用される一連の手法を指します。たとえば、ほとんどの料金詐欺マルウェアは、モバイル ネットワークが標的に含まれていない場合、何のアクションも起こしません。これらの脅威が使用するクローキング メカニズムのもう 1 つの例は、動的コード ローディングです。これは、特定の条件が満たされた場合にのみ特定のマルウェア コードがロードされることを意味し、静的分析による検出が困難になります。

以下は、 SHA -256 を使用した多段階料金詐欺マルウェアの特徴的な例です

ステージ1

このマルウェアのエントリ ポイントは、 Applicationクラスのサブクラスであるcom.android.messaging.BugleApplicationであることが判明しています。悪意のあるフローは、以下の機能につながります。

マルウェアのエントリ ポイントがつながる関数を示すマルウェア コードのスクリーンショット。これが、マルウェアによる動的コード読み込みの開始点です。
図 22. マルウェアのエントリ ポイントが到達する関数

21 行目の呼び出しは、アセットディレクトリから取得したファイル名でfiles配列を埋めます。アセット ファイルの名前が「355」で終わる場合、 for ループは 32 行目のif分岐に入ります。このようなファイル名についてアプリのアセット ファイルをクエリすると、次の結果が得られます。

マルウェアのアセット ファイルに「355」で終わるファイル名をクエリした結果のスクリーンショット。結果は、PhoneNUMberAlternateFormatsProto_355 という名前のファイルです。
図 23. 「355」を検索したときのクエリ結果

PhoneNumberAlternateFormatsProto_355はソース ファイルであり、宛先ファイルおよび文字列「xh7FEC2clYuoNQ$ToT99ue0BINhw^Bzy」とともに、 ns.j関数のパラメーターとして指定されます。

ns.j 関数のコードのスクリーンショット。関数がソース ファイル PhotoNumberAlternateFormatsProto_355 からパラメーターを受け入れることを示しています。
図 24. ns.j 関数

68 行目のSecretKeySpecは、パスワード文字列の SHA-1 ダイジェストの最初の 16 バイトから作成されます。このキーは、電子コードブック (ECB) モードで Advanced Encryption Standard (AES) を使用してアセットからフェッチされたファイルを復号化するために使用されます。復号化の結果は、アプリケーションのキャッシュ ディレクトリに保存され、 System.load関数を使用してロードされる ELF ファイルです。

ステージ 2

ロードされたライブラリは、 AAssetManager_fromJava関数を使用して Assets フォルダーからPhoneNumberAlternateFormatsProto_300ファイルを取得し、 /data/data/<package_name>/ディレクトリ内のbという名前の一時ファイルに書き込みます (以下の 93 行目)。

マルウェアがアセット ディレクトリから 2 番目のペイロードをフェッチするコードのスクリーンショット。
図 25. assets ディレクトリから 2 番目のペイロードをフェッチします。

次に、ファイルbは、Java 側から与えられたキー「xh7FEC2clYuoNQ$ToT99ue0BINhw^Bzy」を使用して XOR 演算を使用して復号化されます (次の図を参照)。復号化されたペイロードは、アプリケーションのデータ ディレクトリにlという名前で保存されます。

マルウェアが「l_file_fd」という名前のアセットを復号化するコードのスクリーンショット。
図 26. アセットの復号化

図 27. Java コードから呼び出されるネイティブの handleTask

同じ関数が復号化されたペイロードlをロードし、 DexClassLoaderクラス ローダーを使用してcom.AdsView.pulgnを呼び出します (わかりやすくするために、変数名は変更されています)。

DexClassLoader クラス ローダーを使用して復号化されたアセットをロードするマルウェア コードのスクリーンショット。
図 28. DexClassLoader を使用して復号化されたアセットを動的にロードする

2 番目のペイロードを手動で復号化すると、次の APK ファイルが生成されます。

APK ファイルである復号化されたアセットのコードのスクリーンショット。
図 29. 復号化された APK ファイル

DexClassLoaderを使用して、 classes.dexエントリを含む .jar および .apk ファイルからクラスをロードできることに注意してください。

ステージ 3

この復号化された APK は、 com.Helpercom.AdsViewの 2 つの主要なクラスで構成されています。 com.AdsView.pulgn関数は、前のセクションで説明したネイティブ ライブラリによって最初に呼び出されます。

ペイロードが読み込まれると最初に呼び出される pulgn 関数のコードのスクリーンショット。
図 30. pulgn は、ペイロードがロードされたときに呼び出される最初の関数です

実行可能なスレッドの主な機能は、ホストをxn3o[.]oss-accelerate[.]aliyuncs[.]comに接続し、 xn30という名前の JAR ファイルをダウンロードすることです。この JAR ファイルはnviという名前でキャッシュ ディレクトリに保存され、 startSdkを使用してロードされます。以下の 81 行目に示すように、次のように機能します。

最終的なペイロードのダウンロードをトリガーするマルウェア コードのスクリーンショット。
図 31. 最終ペイロードのダウンロードとトリガー

ファイルxn30はステージ 3 の最終ペイロードであり、前述の料金詐欺活動を実行するファイルです。

料金詐欺マルウェアの脅威を軽減する

料金詐欺は、金銭的損失が主な影響を与える最も一般的なマルウェア カテゴリの 1 つです。その洗練されたクローキング技術により、ユーザー側からの防御は、デバイスを安全に保つ上で重要な役割を果たします。経験則として、信頼できないソースから Android アプリケーションをインストールすること (サイドローディング) を避け、常にデバイスの更新をフォローアップすることをお勧めします。また、エンド ユーザーが料金詐欺マルウェアから身を守るために、次の手順を実行することをお勧めします。

  • アプリケーションは、Google Play ストアまたはその他の信頼できるソースからのみインストールしてください。
  • アプリケーションがそれを必要とする理由を十分に理解せずに、SMS アクセス許可、通知リスナー アクセス、またはアクセシビリティ アクセスをアプリケーションに付与することは避けてください。これらは、通常必要とされない強力なアクセス許可です。
  • Microsoft Defender for Endpoint on Androidなどのソリューションを使用して、悪意のあるアプリケーションを検出します。
  • デバイスが更新を受信しなくなった場合は、新しいデバイスと交換することを強く検討してください。

潜在的なマルウェアの特定

セキュリティ アナリストにとって重要なことは、マルウェア コード パターンの静的検出に基づく従来の緩和手法では、このマルウェアに対して限られた修復しかできないということです。これは、リフレクション、暗号化、圧縮、難読化、ステガノグラフィ、および動的コード ローディングの拡張使用によるものです。

ただし、このタイプのマルウェアを識別するために使用できる特徴があります。これらの特徴は、次の 3 つに分類できます。

  • 主な特徴 – 静的に分析できる、アプリケーションに含まれる平文のパターン
  • 第 2 の特徴 – 料金詐欺活動を実行するために使用される一般的な API 呼び出し
  • 三次特性 – アプリケーションのカテゴリ、開発者のプロフィール、ユーザー レビューなどの Google Play ストア メタデータのパターン

3 次特性は、潜在的なマルウェアの初期フィルタリングに役立ちます。アプリのメタデータで観察されたパターンは、できるだけ多くのデバイスを短時間で感染させようとするマルウェア開発者の試みに関連していますが、可能な限り長く Google Play ストアに公開し続けます。 Google Play ストアにアプリを保持するために、攻撃者は次の手順を実行することがよくあります。

  1. 一般的なカテゴリに属し、最小限の労力でトロイの木馬化できるオープンソース アプリケーションを使用します。優先されるアプリケーションカテゴリには、パーソナライズ (壁紙やロック画面アプリなど)、ビューティー、エディター、コミュニケーション (メッセージングやチャット アプリなど)、写真、ツール (クリーナーや偽のウイルス対策アプリなど) が含まれます。
  2. アプリケーションが十分な数のインストールを取得するまで、クリーン バージョンをアップロードします。
  3. アプリケーションを更新して、悪意のあるコードを動的にロードします。
  4. アップロードされたアプリケーションから悪意のあるフローを分離して、できるだけ長く検出されないようにします。

これらのアプリケーションは、多くの場合、共通の特性を共有しています。

  • アプリケーションの使用に適していない権限の過度の使用 (たとえば、通知リスナー サービスをバインドする、または SMS 権限を要求する壁紙、エディター、およびカメラ アプリ)
  • アイコン、ポリシー ページ、およびボタンが類似している、一貫したユーザー インターフェイス
  • 類似のパッケージ名
  • 疑わしい開発者プロファイル (偽の開発者名と電子メール アドレス)
  • レビューでの多数のユーザーの苦情

これらの第 3 の特性に基づいて潜在的なマルウェア サンプルが特定されると、第 1 の特性を使用して、さらにフィルタリングと確認を行うことができます。アプリケーションは、許可要求、通知リスナー サービスの使用、またはアクセシビリティ サービスの使用を難読化することはできません。これらのリクエストは、静的分析を使用して簡単に検出できる APK 内のAndroidManifest.xmlファイルに含まれている必要があります。料金詐欺を実行するマルウェアが要求する一般的なアクセス許可には、READ_SMS、RECEIVE_SMS、SEND_SMS、CHANGE_WIFI_STATE、ACCESS_WIFI_STATE、CHANGE_NETWORK_STATE などがあります。通知リスナーとアクセシビリティ サービスの要求は、非常に疑わしいと見なす必要があります。

二次的な特徴には、setWifiEnabled、requestNetwork、setProcessDefaultnetwork、bindProcessToNetwork、getSimOperator、cancelAllNotificationsなどの疑わしい API 呼び出しも含まれます。ただし、これらの呼び出しは難読化されている可能性があり、静的分析中に特定するのが難しい場合があるため、確実にするには、より詳細な分析が必要になる場合があります。

Android のセキュリティとプライバシーの改善

Google は、モバイルの脅威の状況が進化し、新しい脅威や攻撃者の手法が発見されるにつれて、Android のセキュリティとプライバシーを継続的に改善しています。たとえば、オペレーティング システムでは、潜在的に機密性の高い情報を明らかにする可能性のある API 呼び出しは引き続き削除または制限されており、Google Play ストアでは、公開ポリシーによって特定のリスクの高い権限の使用が保護されています (たとえば、または SMS を送信する)許可宣言フォームに記入して、その使用を正当化する必要があります。 Android のセキュリティは、悪用に対処するために進化し続けると予想されます。

説明したように、アプリケーションは現在、セルラー ネットワーク オペレーターを識別でき、ユーザーに対して透過性なしでセルラー ネットワークを介してネットワーク トラフィックを送信できます。さらに、アプリケーションは、この動作を正当化する必要なく、非常に強力な機能である通知の読み取りと破棄へのアクセスを要求できます。

結論

電話料金詐欺は、2017 年に Joker やその亜種のようなファミリーが初めて登場して以来、Google Play ストアで最も蔓延しているタイプの Android マルウェアの 1 つです。 2022 年の第 1 四半期に Google Play ストアからインストールされた潜在的に有害なアプリケーション (PHA) の 34.8% を占め、スパイウェアに次いで 2 番目にランク付けされました。

このマルウェアは、ユーザーをプレミアム サービスに登録することで、被害者に多額の携帯電話料金を請求する可能性があります。この脅威は検出を回避し、単一の亜種が削除される前に多数のインストールを達成できるため、影響を受けるデバイスのリスクも高まります。

このブログでは、エンド ユーザーにこの脅威の詳細と料金詐欺から身を守る方法をお知らせしたいと考えています。また、これらの手法を使用する他の悪意のあるアプリケーションを特定する方法について、セキュリティ アナリストにガイダンスを提供することも目指しています。

この脅威とその継続的な進化に関する詳細な分析は、Microsoft Defender for Endpoint on Android などのソリューションを通じて提供する保護に役立ちます。

Microsoft Defender for Endpoint がモバイル脅威防御機能を含むクロスプラットフォーム セキュリティを提供する方法について説明します

ディミトリオス・ヴァルサマラスサン・シンジョン
Microsoft 365 Defender 研究チーム

付録

サンプル (SHA-256)

サンプル SHA-256
初期 APK ファイル 2581aba12919ce6d9f89d86408d286a703c1e5037337d554259198c836a82d75 (com.cful.mmsto.sthemes)
ステージ 2 のペイロード: Elf ファイル (ローダー) 904169162209a93ac3769ae29c9b16d793d5d5e52b5bf198e59c6812d7d9eb14 (PhoneNumberAlternateFormatsProto_355、復号化)
ステージ 3 のペイロード: APK (敵対的ダウンローダー) 61130dfe436a77a65c04def94d3083ad3c6a18bf15bd59a320716a1f9b39d826 (PhoneNumberAlternateFormatsProto_300、復号化)
ステージ 4 のペイロード: DEX (課金詐欺) 4298952f8f254175410590e4ca2121959a0ba4fa90d61351e0ebb554e416500f

一般的な API 呼び出しと権限

API 呼び出し 権限 SDK
setWifiEnabled CHANGE_WIFI _状態 ACCESS_WIFI_状態 <29
リクエストネットワーク CHANGE_NETWORK_STATE >28
setProcessDefaultNetwork <23
bindProcessToNetwork >22
getActiveNetworkInfo アクセス_ネットワーク_状態
getSimOperator
取得 (システム プロパティ)
addJavascriptInterface
評価Javascript >18
onPageFinished
onPageStarted
android.provider.Telephony.SMS_RECEIVED を使用した SMS BroadcastReceiver の onReceive RECEIVE_SMS >19
createFromPdu RECEIVE_SMS
getMessageBody
android.provider.telephony.SmsProvider のコンテンツ URI (「content://sms」) を使用した SMS ContentObserver の onChange READ_SMS
sendTextMessage
onNotificationPosted

参考文献

参照: https://www.microsoft.com/en-us/security/blog/2022/06/30/toll-fraud-malware-how-an-android-application-can-drain-your-wallet/

Comments

Copied title and URL