ブログ(脅威調査)

Twitter、Facebook、Google Chromeなどのアプリがリバース・エンジニアリングされるiOS向けMasque Attack攻撃について

iOSを対象とする「Masque Attack(マスク攻撃)」の脅威については、過去にも本ブログで取り上げました[1,2,3]。これらの攻撃はこれまで実行された形跡がなかったため、モバイルユーザー数の急速な拡大にもかかわらず、モバイル経由で攻撃を行う高度な脅威は存在しないとされていました。しかし、ファイア・アイは今回、Hacking Team社に対する攻撃ツールの中にMasque Attackを悪用する11種類のiOSアプリを発見し、iOSを標的とするマルウェアが非脱獄版iOSデバイスに適用される初の事例を確認しました。

これらのアプリは、WhatsApp、Twitter、Facebook、Facebook Messenger、WeChat、Google Chrome、Viber、Blackberry Messenger、Skype、Telegram、VKといった人気のSNSやメッセージアプリがリバース・エンジニアリングされ、攻撃の兵器となったものです。正規版との違いは、これらのアプリには、機密情報を窃取し、リモートサーバーと通信をするためのバイナリが追加されていることです。バンドル識別子はすべてApp Storeで公開中の正規アプリと同一であることから、バージョンが8.1.3以前のiOSデバイスについては、正規アプリに取って代わることが可能です。

特筆すべきなのは、バンドル識別子は実際に遠隔から設定が可能な点です。そのため、8.1.3より後のiOSデバイスであれば、Masque Attackの脆弱性は修正済み(バンドル識別子が同一のアプリは互いに置き換え不可能)であるものの、攻撃者は現在もなお、一意のバンドル識別子を使用して兵器化されたアプリを導入できます。このスキームでは、EnPublic攻撃が再び使用されます[4]

図1は、再パッケージ化されたFacebookアプリのランタイム動作のサンプルです。アプリを起動すると、「写真」、「マイク」、「連絡先」へのアクセス許可を尋ねるアラートが3つ連続で表示されます。

図2:正規アプリの実行ファイルに注入されたdylib

これらの悪意あるMasque Attackアプリは、MachO形式のLC_LOAD_DYLIBコマンドを悪用し、悪意あるdylib(=「_PkgSign」)を正規の実行ファイルに注入します(図2)。このdylibは悪意あるコアロジックを実装しています。

Masque Attackアプリはそれぞれ本質的に異なるため、情報窃取に際してdylibは異なるメソッドをフックする必要があります。悪意あるdylibは、リモートサーバーが制御する悪意ある動作を管理するため、「TIGI000」で始まるIDとカスタマイズ済みのクラスをそれぞれのMasque Attackアプリに割り当てます(表1)。


アプリID

悪意あるマネージャークラスの

名称

Masque Attackアプリの

バンドル識別子

TIGI00001

POViewConnection

com.skype.skype

TIGI00002

POViewAsynService

com.viber

TIGI00003

POViewRegistration

net.whatsapp.WhatsApp

TIGI00004

_bvbcccyytr

com.facebook.Facebook

TIGI00006

POViewDataManager

com.facebook.Messenger

TIGI00008

POViewLogger

com.google.chrome.ios

TIGI00009

VKMessageManager

com.vk.vkclient

TIGI00010

TelegramManager

ph.telegra.Telegraph

TIGI00011

BBMManager

com.blackberry.bbm1

TIGI00012

WechatManager

com.tencent.xin

TIGI00013

TwitterManager

com.atebits.Tweetie2

...

...

...

表1:Masque Attackの各アプリのバンドル識別子に対する、ハンドラークラスの割り当て

注入後のdylibは、正規の実行ファイル内で、38種類のクラスによる機密性の高い52種類の関数をフックします。フック対象のクラスのメソッドはすべて、正規アプリの主要関数に対応しています。例えば、WhatsAppのメッセージを傍受するには
[SKPConversation OnMessage:andMessageobjectid:]が、WeChatの会話を録音するには[VideoVoipCallerView OnBeginTalk:]がフックされます。

 

図3:WhatsAppのメッセージ傍受で使用されるメソッドのフック・サンプル

注入後のdylibは、アプリの実行ファイルの一部として機能します。アプリのコンテナ内の全データを読み取り/修正することで機密情報を収集し、リモートサーバーに送信することが可能です。機密情報の具体的な内容は、以下の通りです。

  • Skype、WeChat等の音声通話の録音Skype、WhatsApp、Facebookメッセンジャー等のテキストメッセージの傍受
  • ChromeでのWebサイト閲覧履歴
  • 通話内容
  • SMS/iMessageの内容
  • バックグラウンドで記録された高精度GPS座標
  • 連絡先情報
  • 写真

特に注目すべきなのは、dylibのデータ・アップロード機能は、標的となったユーザーからのアップロードに限られる点です。dylibはリモートサーバーにIMEIを送信することで、ターゲット・デバイスが攻撃対象としてふさわしいかどうかを検証します。その後サーバーはデータを窃取するかどうか指示します。しかし、私たちは、「SKIP-LICENSE」鍵がキーチェーン内で「1」に設定されている場合、検証を迂回するロジックがあることを発見しました。これにより、被害者が有用だと判断された場合には、ローカルの共謀者がこの値を「1」に設定することで、情報の窃取を強制できます。

図4:リモートサーバーにアップロードされたJSONデータ

最後に、すべてのデータはJSON形式でリアセンブルされ、リモートサーバーに送信されます。図4は、アップロードされたデータのサンプルです(実データは匿名化済み)。itemsのフィールドには、通信アプリのチャットデータ、位置情報、通話履歴等、さまざまな種類のデータが格納されています。

URLスキーム経由で構成可能
リモートサーバーと悪意ある動作は、URL経由で構成が可能です。再パッケージされた各サンプルでは、カスタマイズされたURLスキームがInfo.plistファイルに追加されているのが判明しました。URLスキームは、表1の「アプリID」列とまったく同じ「TIGI0000X://」のパターンに従います。

悪意あるdylibは、「application:openURL:sourceApplication:annotation:」関数をフックすることで、URLスキームが開かれた際の構成データを解析できます。構成データはJSON形式でのシリアル化、Base64によるエンコードを経て、カスタマイズされたURLスキームの直後に添付されます。攻撃者は、デバイス上のSMS/メール/Webページを通じ、ターゲットとなった被害者がこうしたURLをクリックするよう誘導するとともに、リモートサーバーなどのターゲットの構成をカスタマイズできます。

結論
Hacking Team社から漏えいした攻撃ツール群からは、iOSデバイスをターゲットとする高度な攻撃が台頭しつつあることが判明しました。そのため、すべてのiOSユーザーには、デバイスのiOSを常に最新版にすることと、アプリのダウンロード・プロセスに細心の注意を払うことを推奨します。

参照情報
[1] iOS Masque Attack Revived: Bypassing Prompt for Trust and App URL Scheme Hijacking (英文) 

[2] 「Masque Attack」:iOSにおける重大な脆弱性-すべてのiOSアプリが情報漏えい元になる可能性について-

(日本語)

[3] iOSを狙う3種類の新たなMasque Attack(日本語)

[4] VB2014 paper: Apple without a shell – iOS under targeted attack (英文)


<iOSへの攻撃についてまとめたインフォグラフィック>