ブログ(脅威調査)

iOSを狙う3種類の新たなMasque Attack

米国カリフォルニア州ミルピタス発
米国時間2015年6月30日にリリースされたiOS 8.4で、アップル社はいくつかの脆弱性を修正しました。最新版は「Masque Attack(マスク攻撃)」に悪用されうる2種類の新たな脆弱性「CVE-2015-3722/3725」と「CVE-2015-3725」への対応もされています(ファイア・アイではこの2つの脆弱性を「Manifest Masque(マニフェストマスク)」、「Extension Masque(エクステンションマスク)」としています)。これらの脆弱性は、悪用されるとApple Watch、ヘルスケア、Apple Payなどのシステムアプリが破壊され、アプリのデータコンテナが突破されます。

本稿では、上記の2つの脆弱性に加え、未公表のマスク脆弱性「Plugin Masque(プラグインマスク)」(iOS8.1.3で修正済み)に関する情報も公開します。Plugin Masqueは、iOSのエンタイトルメント付与を迂回し、VPN通信をハイジャックする攻撃です。iOSのバージョンに関するファイア・アイの調査では、バージョン8.1.3の公開から5カ月を経た現在でも、約3分の1のデバイスが未だに8.1.3未満を適用しており、すべてのMasque Attackに対して脆弱な状態であることが判明しています。

ファイア・アイではこれまでに以下5種類のMasque Attackを検知しています。

名称

現在までに公表されている影響

iOSの対応状況

App Masque

* 既存アプリの置き換え

* 機密情報の収集

iOS 8.1.3で修正済み[1]

URL Masque

* 信頼確認を迂回

* アプリ内通信をハイジャック

iOS 8.1.3で一部修正済み [2]

Manifest Masque

* OTAインストール中に他のアプリ(Apple Watch、ヘルスケア、Apple Pay等)を破壊

iOS 8.4で一部修正済み

Plugin Masque

* 信頼確認を迂回

* VPNプラグインのエンタイトルメントを迂回

* 既存のVPNプラグインを置き換え

* デバイス・トラフィックをハイジャック

* デバイスの再起動を阻止

* カーネル脆弱性の悪用を多用

iOS 8.1.3で修正済み

Extension Masque

* 他アプリのデータにアクセス

* 保有データに対する他アプリからのアクセスを阻止

iOS 8.4で一部修正済み

Manifest Masque AttackはCVE-2015-3722/3725を悪用する攻撃で、被害者がエンタープライズプロビジョニング機能を使用してWebサイトから社内アプリを無線経由でインストールする際に、iOS上の既存アプリを破壊します。破壊対象のアプリ(=ターゲットアプリ)は、公式App Storeからダウンロードされたアプリの場合もあれば、Apple Watch、Apple Pay、App Store、Safari、「設定」等、重要なシステムアプリの場合もあります。本脆弱性はiOS 7.xとiOS 8.4以前のiOS 8.xの全バージョンに影響を及ぼします。ファイア・アイでは、この脆弱性を2014年8月にアップル社に報告しました。 

Extension Masque Attackは、アプリのデータコンテナの制約を突破します。iOS 8上では、社内アプリと並行して悪意あるアプリ拡張機能もインストールされますが、これはターゲットアプリのデータコンテナへの完全なアクセスを得ることも、自らのデータコンテナに対するターゲットアプリからのアクセスを阻止することも可能です。セキュリティ研究者のLuyi氏やXiaofeng氏などは、6月14日付けでOS Xに関する同様の複数の問題を公表しました[3]。彼らは素晴らしいリサーチをしましたが、これを見逃し、「今回のセキュリティリスクはiOSには存在しない」としています。しかし、データコンテナの問題は、iOS 8.4以前のiOS 8.xバージョンのすべてに影響を及ぼしており、攻撃者はこれを悪用することで、ターゲットアプリのデータコンテナの全データを窃取できます。ファイア・アイでは以前よりこうしたiOSの脆弱性を独自に発見しており、アップル社には当該レポート[3]の発行前に通知済みです。同社は、この問題をCVE-2015-3725の一部として修正しました。

また、上記2種類の脆弱性(iOS 8.4で修正済み)に加え、VPNプラグインを置き換え、別の信頼できないコードの注入攻撃をするPlugin Masque Attackについても、以下に情報を公開します。本脆弱性については、2014年11月にアップル社に報告済みであり、同社は当初のMasque Attack(App Masque)にパッチ適用をしたiOS 8.1.3で本件も修正済みです[1、2]。しかし、これは当初のMasque Attackよりもさらに深刻です。というのも、悪意あるコードが「neagent」プロセスに注入されることで、全VPNトラフィックの監視などの特権操作を、ユーザーが無意識の間に実行できるようになるからです。ファイア・アイは、2015年4月に開催された「Jailbreak Security Summit」で、初めてこの攻撃のデモを行いました[4]。本攻撃は「Plugin Masque Attack」として分類しています。

これら3種類のMasque Attackについて、以下で技術的な詳細とデモをご覧いただけます。

Manifest Masque:新しきを身にまとい、古きを捨てる
エンタープライズプロビジョニングでiOSの社内アプリを無線配信する際、発行するWebページは、httpsサーバーでホストされたXMLマニフェストファイルへとリダイレクトするため、ハイパーリンクを記載する必要があります[5]。XMLマニフェストファイルには、バンドル識別子、バンドルバージョン、.ipaファイルのダウンロードURLなど、社内アプリのメタデータが含まれます(表1)。iOSの社内アプリを無線でインストールすると、iOSはこのマニフェストファイルを最初にダウンロードし、メタデータを解析してからインストールプロセスに着手します。

<ahref="itms-services://?
action=downloadmanifest&url=https://example.com/manifest.
plist">Install App</a>

<plist>
         <array>
                 <dict>
          ...
                       <key>url</key>
                       <string>https://XXXXX.com/another_browser.ipa</string>
           ...
          <key>bundle-identifier</key>
                    <string>com.google.chrome.ios</string>
                    …
                   <key>bundle-version</key>
                   <string>1000.0</string>
              </dict>
              <dict>
                   … Entries For Another App
             </dict>
        <array>
</plist>

表1:ハイパーリンクとマニフェストファイルの例

アップル社の公式文書によると[5]、バンドル識別子フィールドは「Xcodeプロジェクトで規定した通りの、アプリのバンドル識別子」となるべきです。しかし、iOSはWebサイト上のXMLマニフェストファイルのバンドル識別子と、アプリ自身の中にあるバンドル識別子との一貫性を検証していないことが判明しています。Webサイト上のXMLマニフェストファイルにあるバンドル識別子がデバイスの別の正規アプリのものと同じであり、マニフェストにあるバンドルバージョンの数字が正規アプリのものよりも高い場合、正規アプリは破壊され、ダミーのプレースホルダーが置かれる一方、組み込みのバンドル識別子を使用することで、社内アプリは引き続きインストールされます。被害者がデバイスを再起動すると、ダミーのプレースホルダーは表示されなくなります。その上、表1の通り、マニフェストファイルはさまざまなアプリのメタデータエントリーを格納し複数のアプリを一度に配布できるため、本脆弱性の被害者は、たった1度のクリックで複数のアプリが破壊されてしまう可能性があります。

本脆弱性を悪用することで、アプリ開発者は自らのアプリをインストールさせつつ、同時に競合製品などの他アプリを破壊できます。これによって、攻撃者はiOS上でDoS攻撃やフィッシング攻撃を実行できます。

図1:「悪意あるChrome」をインストールし、正規アプリを破壊するフィッシング攻撃

図1は、フィッシング攻撃の一例を示したものです。ユーザーがGmailアプリ内のURLをクリックすると、このURLは「googlechrome-x-callback://」というスキームによって書き換えられ、デバイス上のChromeによって処理されようになります。しかし攻撃者は、Manifest Masqueを悪用することで正規のChromeを破壊し、同一のスキームを登録した「悪意あるChrome」をインストールします。当初のMasque Attackでは、正規アプリの置き換えで同一のバンドル識別子が要求されますが、本フィッシング攻撃の悪意あるChromeは、インストーラによるバンドル識別子の検証を迂回するため、別のバンドル識別子を使用します。その後、被害者がGmailアプリ内のURLをクリックすると、悪意あるChromeは書き換えられたURLスキームを引き継いで、より高度な攻撃を実行できます。

さらなる問題点として、本脆弱性を悪用することでApple Watch、Apple Pay UIService、App Store、Safari、ヘルスケア、InCallService、「設定」などのすべてのシステムアプリを破壊することも可能になります。一度破壊されてしまうと、これらのシステムアプリはデバイスを再起動しても利用できなくなります。

次の動画は、被害者がたった一度クリックをし、社内アプリを無線でインストールした際に、このDoS攻撃がiOS 8.3上ですべてのシステムアプリと1つのApp Storeアプリ(例:Gmail)を破壊するデモです。デバイスを再起動した後も、すべてのシステムアプリは依然として破壊された状態であり、App Storeのアプリはアンインストールされているので表示されないのが注目すべき点です。

[デモ:破壊動画]

 

Extension Masque:データコンテナを突破
アップル社はiOS 8でアプリ拡張機能を導入しています[6]。この豊富に用意されたアプリ拡張機能により、開発者はこれまでにないさまざまな方法を通じ、iOS 8上でアプリの機能性を拡張できるようになりました。例えば、ホーム画面上のウィジェットとしてアプリを表示させることや、アクションシートに新たなボタンを追加すること、iOSの「写真」アプリ内に写真フィルタを提供すること、システム全体で利用可能な新しいカスタムキーボードを表示させることなどが可能となりました[7]。さらに、Apple Watch発売後のiOS 8.2/8.3では、iPhoneのウォッチ拡張機能[8]がウォッチアプリのすべてのロジックを権限移譲します。アプリ拡張機能はコードの実行が可能で、データコンテナ内のデータへのアクセスは制限されます。拡張機能はiOSアプリの一部として配布されますが、攻撃者からは潜在的な新たな攻撃ベクトルとして悪用可能です。

ファイア・アイは、拡張機能がターゲットアプリと同一のバンドル識別子を使用している限り、iOS 8アプリ内の拡張機能が他アプリのデータコンテナへの完全なアクセスを得ることや、保有するデータコンテナへの他アプリのアクセスを阻止する能力があることを独自に発見しました。攻撃者は、被害者がエンタープライズプロビジョニングを使用し、Webサイトから社内アプリをインストールした上で、社内アプリの悪意ある拡張機能をデバイス上で有効にするよう誘導できます。

こうした攻撃の影響は、悪意ある拡張機能とターゲットアプリのインストールシーケンスに関連したものです。なお注目すべき点として、拡張機能は単体ではインストールできないため、アプリの一部として配布される必要があります。したがって、以下で拡張機能のインストールについて言及する場合、拡張機能を運搬するアプリのインストールを意味します。

  • 悪意ある拡張機能がターゲットアプリより「前に」インストールされた場合、ユーザーが無意識の間にデータコンテナを突破し、ターゲットアプリのデータコンテナへの完全なアクセスを得ることができ、ターゲットアプリはその後も通常に動作します。
  • 悪意ある拡張機能がターゲットアプリの「後に」インストールされた場合、ターゲットアプリは、自らのデータコンテナへはアクセスできなくなります。そのため、ターゲットアプリの機能は深刻な不安定状態となり、クラッシュの可能性すらあります(サービス妨害(DoS)の発生)。この状況でターゲットアプリの再インストールを試みた場合、アプリは復旧します。しかし、これではまた、先の状況に戻ってしまいます。ターゲットアプリは、悪意あるアプリの「後に」インストールされたことになるため、悪意ある拡張機能は、ターゲットアプリのコンテナについて完全なアクセスを得ることができます。

次の動画は、データコンテナの突破攻撃のデモです。本デモでは、悪意ある拡張機能はGmailアプリのデータコンテナにあるすべてのファイルにアクセスし、攻撃者のサーバーにアップロードできます。

[デモ:データコンテナの突破攻撃動画]