144個のGoogle Playアプリに新種のAndroidマルウェアを発見

マカフィーのモバイルリサーチチームは、Google Playの144個の「トロイの木馬」化されたアプリケーション内に潜んだ新種のAndroidマルウェアを発見しました。変数名やメソッド名を含むコードのいくつかの要素でGrabosという文字列が使用されていたため、私たちはこの脅威をGrabosと名付けました。 GrabosはGoogle Playの無料オーディオプレーヤーアプリ「Aristotle Music audio player 2017」で最初に発見されました。

図1. Google Playのトロイの木馬の音楽アプリ

Aristotle Musicが発見された時点では、そのアプリケーションの評価は非常に良好でした。 Google Playによると、アプリケーションがインストールされた回数は100〜500万回で、ユーザーからの最新のコメントでは、そのアプリケーションはマルウェアとして検出されたとコメントされています。

図2.アプリケーションの評価とユーザーコメント

Google PlayのGrabos
マカフィーのモバイルリサーチチームは9月にGrabosについてGoogleに通知し、報告したアプリケーションが速やかに削除されたことを確認しました。 私たちはさらなる調査を行い、143個のアプリを発見し(完全なリストは本ブログの最後を参照)、すべてGoogle Playストアから削除されました。 最初にGoogleに報告した後、下記6つのアプリも合わせて削除されました:

図3.追加されたGrabosトロイの木馬アプリ

本ブログ執筆時点では、まだ34個のアプリについてキャッシュページを参照することができたので、概算のインストール数、最終更新日、評価などの追加情報を得ることができました。 これらのアプリのほとんどは、8月と10月に最終更新されており、 平均評価は4.4で、420万〜1,740万のユーザーがGoogle Playからこれらのアプリをダウンロードしていました。

図4. Google Playの悪意のあるアプリの詳細

Grabosでは、挿入された悪意あるコードが商用の難読化ツールにより保護されているため、Google Playのセキュリティ対策を回避している可能性が高く、アプリケーションの静的解析は非常に困難であり、Grabosがどのような条件で動作するのかわからないため、動的解析もさえも困難になります。私たちは、コードを解凍することで解析を進めました。

「偽物」と「本物」アプリ
Grabosはファイルエクスプローラや音楽プレーヤーのアプリケーションに組み込まれており、その一部はオープンソースとして公開されています。アプリを起動するたびに下記条件を使用して「偽物」(正当な機能)または「本物」(挿入した難読化されたコード)のどちらの機能を実行するか決定します:
• isOnline:インターネット接続があるかどうかを確認します。
• getIsBlacklisted:Androidデバッグブリッジ(adb)と開発者設定が有効かどうか、またはデバイスがエミュレータにあるかどうかを確認します。 後者の場合、デバイスはブラックリストに登録され「偽物」アプリが起動します。
• getIsForcedBlacklisted:コントロールサーバーによって設定されたフラグ。
また、このコードには、エミュレータで実行されているか、adbや開発者設定が有効になっている場合でも「本物」のアプリケーションの実行を許可するテストモードが実装されています。これらのチェックは、アプリが現在動的解析されているかどうかを検出し、必要に応じて隠しコードの実行を防止しています。
アプリが解析されていない状況、またはテストモードで実行されている場合は、「本物」アプリが起動します。 この隠された音楽ダウンローダーは、YouTube上の特定の曲を検索します。 曲が選択されると、MP3またはMP4形式でファイルをダウンロードしてオフラインで再生することができます。

図5.「偽物」と「本物」のアプリ分岐。 「BL」は「ブラックリスト」の略。

この時点では、このアプリケーションは、著作権で保護された音楽ファイルのダウンロードによりGoogle Playから削除されないように動的解析を回避しているミュージックダウンローダのようです。 しかし、バックグラウンドではより多くのことが発生しています。

コントロールサーバーとの通信
Grabosは「偽物」と「本物」のアプリ機能に加え、接続の変更時やアプリのインストール時に実行されるレシーバーがAndroidManifestファイルに登録されています:

図6. AndroidManifestのGrabosレシーバー

接続変更時にレシーバーが実行された場合には、デバイスのオフライン時や最後の接続から5秒未満の場合には実行が終了します。 既に5秒以上経過している場合は、メソッド “updateRemoteSettingsSynchronousTask” が実行されます。 このメソッドは、感染したデバイスから次のデータを収集してBase64とAESにより暗号化します。
• デバイス情報:
o Androidバージョン
o モデル
o インストールリファラー
o ネットワーク情報
o SIM情報
o 通信キャリア
o 言語コード
o 国コード
o タイムゾーン
• デバイスの場所:Grabosは無料のIPジオロケーションAPIサービスを使用して、都市、国コード、ISP、組織、地域、郵便番号などのIPアドレス情報を取得します。
• デバイス構成:
o エミュレーターか否か
o ルート化されているか否か
o ADBの有効・無効
o 開発者設定の有効・無効
o 疑似ロケーションの許可
o 提供元アプリ不明のインストール許可
o VPN通信か否か
o 市販の難読化ツールが提供するルート、デバッグ、エミュレータの追加チェック
• インストールされたGrabosアプリケーション情報:バージョンコード、パッケージ名、およびインストール日時
• インストールされている特定のアプリケーション:Grabosは、あらかじめ定義されたリストにあるアプリが感染したデバイスにインストールされているかどうかを報告します(詳細は後述)。
すべての情報は暗号化されてコントロールサーバーに送信されます。 リモートサーバーはや音楽ファイルをダウンロードするために必要なパラメーター(URL、APIキー、ユーザーエージェント、client_idなど)、広告を表示するために必要なパラメーター(nativead_id、interstitial_id、banner_idなど)やGoogle Play上のアプリ評価に関する通知に関するパラメーターなどを暗号化されたデータとして応答します:

図7.コントロールサーバーによって提供される「アプリ評価」パラメーター

このアプリ評価ダイアログはアプリの初回起動時に表示されます。 ユーザーが「Rate 5 stars」ボタンをクリックすると、Google Playストアが開かれ、ユーザーはそこでアプリの評価を入力します。

図8.アプリ評価ダイアログ

同様の方法で、ユーザーに友人とアプリを共有することで、より高速なダウンロードを約束するというパラメータがリモートサーバーから提供されます:

図9.コントロールサーバーによって提供される「アプリケーションの共有」パラメータ

コントロールサーバーからは強制的にブラックリストにする “is_forced_blacklisted” パラメーターも提供され、値が “true” の場合には、隠された「本物」アプリケーションの実行を防ぎます。

不可解な機能
感染したデバイスの位置や設定情報の報告に加えて、GrabosはisPackageInstalledメソッドとアプリパッケージ名を使用して特定のソーシャルアプリとGoogleアプリがインストールされているかどうかを確認しています。 アプリが現在インストールされているかどうかに応じて、対応する値がtrueまたはfalseに設定され、その情報が暗号化されてコントロールサーバーに報告されます。

図10.コントロールサーバーに報告されるソーシャルアプリとGoogleアプリ

私たちはこの調査結果をGoogleに報告しました。 この時点では、私たちはこのインストール済みアプリがコントロールサーバーに報告する目的を知りません。しかし、Grabosには、リモートサーバーによって提供されるアプリケーションをインストールさせるために、ユーザーを騙すためのいくつかのメカニズムが実装されているため、このインストール済みアプリの情報はマルウェア作成者にとって非常に有用であると考えています。 これらの関数を見てみましょう。

カスタムプッシュ通知と追加アプリケーション
リモートサーバーから初期設定を取得した後、AsyncTask ShowNotificationIfNeededを実行して、コントロールサーバーによってパラメータn_title、n_description、およびn_packageが提供されているかどうかを確認します。 その場合、GrabosはアプリがGoogle Play(「pack」がURLではなく名前である場合)またはリモートサーバー(「pack」がHTTPで始まる場合)で利用可能かどうかを確認します。
もし、そのアプリケーションがインストールされておらず、利用可能である場合には、Grabosはリモートサーバーの応答から追加のパラメータ(アイコンなど)を収集してカスタム通知を作成し、ユーザーにアプリのインストールを促します:

図11.コントロールサーバーがカスタム通知を作成するために提供するパラメーター

Grabosは、リモートサーバーが次のパラメータを提供しているかどうかも確認します。
• interstitial_letang_options: アクティビティの表示を遅延させて繰り返す値を提供します(initial_delayおよびmin_interval)
• interstitial_letang: 以下のリモートコマンドを含みます:
o admob: メソッド “showAdmobInterstitial” を実行する
o nothing
o grabos_direct
コマンドがgrabos_directの場合、Grabosはgrabos_direct_interstitialパラメータでtitle、package、およびmax_times_shownの値を取得して、Google Playでアプリを開くか、アプリのダウンロードを開始します。

図12. Google PlayのURLまたは公開アプリからAPKをダウンロードする

ユーザーを騙してアプリケーションをダウンロードしてインストールさせる仕組みとして、この通知とinterstitial_letangメソッドの両方が、接続が変更されるたびにバックグラウンドで実行されます。一方で、Grabosには音楽ファイルのダウンロード実行時に別のアプリ配信する方法が実装されています。 メソッドShowGrabosIfNeededは、必要なパラメータが存在し、アプリケーションが利用可能かどうかをチェックするだけでなく、ユーザーの同意なしにアプリを起動すべきかどうかをチェックする点で、interstitial_letangメソッドと非常に似ています。

図13.インストールされたアプリの起動確認

Grabosがデバイスがオンラインであることを確認すると、Google Playまたはリモートサーバーでアプリを利用できるようになり、パッケージがインストールされていない場合、マルウェアはリモートサーバーの応答から次のパラメータを取得して警告ダイアログを作成し、別のアプリをダウンロードします:

図14. 警告ダイアログを作成するためのパラメーター

探知から逃れる行動:回避分析
アプリケーションが動的解析されているかどうかを検出するための複数の確認(エミュレータ、adb、開発者設定)と挿入したコードの暗号化に加えて、Grabosはテストモードでない限り、24時間ごとにリモート設定を更新します。この制限は、アプリの解析に使用したデバイスの日時を変更することで簡単に回避できます。しかし、Grabosの最近のバージョンでは、自動日時と自動タイムゾーンが有効になっているかどうかを検出するためのチェックが含まれています。

図15.自動日時と自動タイムゾーンの有効確認

この設定のステータスは、time_is_autoおよびtime_timezone_is_autoフィールドとしてコントロールサーバーに報告されます。このチェックはGrabosコードでは使用されていませんが、この情報を利用することで、アプリが動的解析されているかどうかを判断し、追加のペイロードを配信するかどうかを判断できます。
コントロールサーバーとして使用されたURLは、Grabosがネットワーク通信を正当なものとして偽装しようとしていることを示しています。一見すると、そのURLはなじみのある広告企業のものに見えますが、しかし、Grabosは .com ではなく会社が登録していない .link や .click などのドメインを使用しています。
最後に、Grabosは、現在実装されていませんが、特定のデバイスをブラックリストまたはホワイトリストに登録する追加のメカニズムが定義されています。 たとえば、将来のアプリのバージョンアップにより、感染したデバイスの国コードや設定された言語に応じて、デバイスがブラックリストに登録されたりホワイトリストに登録されたりする可能性があります。

図16.言語コードや国コードに基づくブラックリストとホワイトリスト機能

Grabosは、IPアドレスに基づいてデバイスをブラックリストに登録する方法も定義しています(未実装):

図17. IPアドレス情報に基づくブラックリスト機能

結論
私たちがこの脅威の解析を行っている間、コントロールサーバーはユーザーを騙しアプリケーションをインストールさせるためのカスタム通知のパラメーターは常に空の状態でした。広告を表示する機能とダウンロード数が多いことを考慮すると、Grabosの主な目的はアプリのインストールを促進して広告収入を上げることだと考えています。

Grabosは無料で音楽ファイルをダウンロードすることができるので、Google Playで人気のアプリでした。 しかし、ユーザーは、これらのアプリケーションに隠された機能を認識しておらず、追加のアプリケーションをダウンロードしてインストールし、ユーザーの同意なしにアプリを開くことができるカスタム通知機能が実装されています。

Grabosが感染したデバイスにインストールされている特定のソーシャルアプリやGoogleアプリの存在を報告していることを考慮すると、サイバー犯罪者はその情報を利用して、実装されている通知方法を使用してユーザーを騙して別のアプリをインストールさせようとするでしょう。 私たちの解析では、リモートサーバーはカスタム通知を表示するために必要なパラメーターの受信は確認されませんでしたが、デバイスは追加のAndroidアプリのダウンロードにより別のマルウェアに感染するリスクが残っています。

McAfee Mobile Securityはこの脅威をAndroid/Grabosとして検出します。このようなGoogle Playで配信されてしまった脅威から身を守るためにはセキュリティソフトウェアを利用してください。また、マーケット上のユーザーレビューを確認し、アプリ名と一致していないスクリーンショットや機能が使用されている疑わしいアプリをインストールしないようにしてください。
GoogleのAndroidセキュリティ部門のSebastian Porst氏とJason Woloz氏の調査協力に感謝いたします。

Grabosのパッケージ名リスト:
• picklieapps.player
• musicaplayer.stonetemples
• mp3musicplayer.playmusicmp3
• densebutter.musicplayer
• airplaneapps.soundmeter
• dinosaursr.musicplayer
• tenuousllc.humneate
• astropie.musicplayer
• chargeshoes.videoplayer
• callsaver.doubtful
• unfestenedsail.freeapp
• extendmilk.freeplayer
• excellentlossapps.playermusic
• AliciaTech.free
• mp3player.musicplayer.freelocalmusicplayer
• freemusicplayer.freemusicplayer.free
• afromusicplayer.fremediaplayer
• info_astro.glider_player
• illfatednotice.humdrum
• headybowl.musicplayer
• musicgratisplayerfree.free
• naturityllc.mp3player
• anothertube.music.player
• startdancingapps.callrecorder
• social.video.saver.pro
• gratis.video.downloader.hd
• sportingapps.copyleft_music.player
• auto_call_recorder.freeapp
• freenewsreader.rssfeed
• music.video.player
• curatorinc.ringtone.search
• mp3musicplayer.local_files_player
• copyleft.stream.musica.player
• mp3.music.player
• nobodybeats.musicplayer
• file.manager.pronessbest
• ark.music.mp3.player
• air.browser.free
• aneeoboapps.playlistmanager
• local_music_player.free_mp3_player
• greenlinellc.voicechanger
• free.playlist.creator.tube
• toporganizer.fileorganizer
• thumb.webbrowse
• aspirator.ringtones.player
• freevideoplayer.musicplayer
• vimfast.videodl
• whimsical.piano.free
• truckneat.freeapp
• crowdedarmy.volume.controller
• arnold_legal.mp3.musica
• descent.shutterfly
• thankyou.arrowplayer
• pocahantasapps.musicplayer
• astroplayer.freee
• couchpotato.musica.play_stream
• abstractly.musica.player
• matsumoto.mp3player
• musicequalizer.freeequalizer
• lifesbad.fileexplorer
• videolunch.free
• copyleft.cc.mp3.music
• ark.music.mp3.player
• musik.mp3.music
• streamerplayer.stream_videos
• voicerecorder.recordvoice
• snip.browser
• checkrein.musicapp
• mp3musicplayer.freemusicplayer.playmusic
• jadedprogram.mp3player
• preoral.freeborn
• voice.changer.freeappsapp
• streamplay.stream.player
• localmp3music.freeplayer
• drummachine.machinedrums
• coloringbook.freetrynow
• videodownloader.social_video_download
• ElephantApps.FileManager
• scaricare.app.musica
• quicksearch.tube.player
• rooseveltisland.mp3player
• mindprogram.musicf
• freeborn.sdkintegration
• koseapps.tubemusica
• baixar.videos.gratis
• adeptly.forgoneapp
• musicas.gratis.player
• miniaturef.swanky
• insta.mp3.music.streamer
• anchor.musicplayer
• repeate.mp3musicplayer
• FeisalLLC.MusicPlayer
• shelfshare.freeapp
• simple.streamer.player
• streamplayer.freearnold
• freeturkish.video.downloader
• cowherd.freeapp
• localmp3musicplayer.local_player
• scaricare.apps.musica
• silymove.freeapp
• pinkphone.funfreetube
• tissuepaper.freemusic
• chopsuey.musicplayer
• branchnotice.musicplayer
• fradcip.MasterApp
• music.player.mp3.ares
• social.video.downloader.for_fb
• frobenius.time.tube
• spelldoom.comeup
• bailymusic.player
• sportifco.musicplayer
• topsaver.video.downloader
• coupleweeks.modcium
• unbecomingllc.videodownloader
• video.for_fb.downloader.saver
• macdrop.apptool
• callsaver.recorderfreeapp
• arnie_legal.mp3.musica
• kikiapps.freeplayer
• pintaapps.expensetracker
• marble.musicequalizer
• artproject.searcher
• UnitTest.FreeApp
• exudedplayer.freemusicplayer
• blackballed.player
• mp3player.decisiveapps
• rusticd.musicplayer
• byunhyeong.jungfree
• voicelessapps.mp3musicplayer
• localmp3player.freeplayer
• kinokunya.free
• socialvideo.downloader_vim
• viastore.video.saver_for_fb
• disarmbit.reache
• crackerbalancellc.mp3converter
• vaskollc.jpfree
• freemusicplayer.musicplayfreetoolpalyer
• combustionapps.musique
• arnold.mp3.musica
• purpleheadphones.audioplayer
• unscalableapps.free
• freefile.organizerfree
• free.mp3.stream_cc_music
• mp3uncle.musiccamera

※本ページの内容は 2017年11月14日更新のMcAfee Blog の抄訳です。
原文: New Android Malware Found in 144 GooglePlay Apps
著者:Carlos Castillo