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アプリのデータコンテナにあるすべてのファイルにアクセスし、攻撃者のサーバーにアップロードできます。

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

Plugin Masque:信頼できないコードを特権で実行

iOSの拡張機能以外に、VPNプラグインも.ipaファイルのバンドルの一種となります。iOSの拡張機能は、特別なエンタイトルメントなしに任意のiOS 8アプリ内に組み込むことができますが、これに対して、VPNアプリとVPNプラグインはいずれもシステム全体のVPNサービスを提供するため、「com.apple.networking.vpn.configuration」のエンタイトルメントでプロビジョニングを行う必要があります。現時点では、こうしたVPNクライアントをiOS上で配布可能な専用iOSデベロッパーは、非常に限られています(例:Cisco Anyconnect、Junos Pulse、OpenVPN等)。インストール後のVPNプラグインは、特権システムプロセス「neagent」により、ユーザー・インターフェイスを経由することなくロードされます[9]

図2は、Junos Pulseのディレクトリ構造を示したものです。.ipaファイルであるVPNプラグイン(SSLVPNJuniper.vpnplugin)は、VPN構成用のユーザー・インターフェイスとして機能する通常のアプリ(Junos Pulse.app)といっしょに「Payload」ディレクトリ下に格納されています。

図2:Junos Pulseアプリのディレクトリ構造

被害者のiOS上にある正規のVPNプラグインとバンドル識別子が同じ、悪意あるVPNプラグインを社内アプリが内蔵している場合、悪意あるVPNプラグインは問題なくインストールされ、正規プラグインを置き換えることが可能ですが、その際、「com.apple.networking.vpn.configuration」などの特別なエンタイトルメントは不要です。その後、VPNサービスを利用するために通常のVPNアプリを起動すると、悪意あるVPNプラグイン内の信頼できないコードが「neagent」プロセスによってロードされ、VPNの全トラフィックのハイジャック/監視などの特権操作が実行されます。サンドボックス回避を目的とした「neagent」プロセスへのコード注入は、PanGu 8 [9, 10]の脱獄(=Jailbreak)ツールで使用される重要な脆弱性でもあります。8.1.2以前のiOSデバイスについては、VPNプラグインの脆弱性を悪用することで、他のカーネル脆弱性を通じOTA形式で直接脱獄することが可能です。本脆弱性は「CVE-2014-4493」に関連するもので、iOS 8.1.3でパッチ適用済みです。ファイア・アイは2015年4月の「Jailbreak Security Summit」[4] においてこの攻撃を公表し、デモを初めて行いました。

次の動画は、信頼できないコードの実行攻撃のデモです。本デモでは、悪意あるVPNプラグインを含む社内アプリが被害者のデバイスにインストールされます。正規の「Junos Pulse」アプリでユーザーがVPNの構成を行うと、悪意あるVPNプラグインのPoCコードがロードされ「neagent」によって実行されます。

 

     while(1) {

        syslog(LOG_ERR, "[+] ========= ****** PoC DYLIB LOADED ****** ==========");

        sleep(3);

    }

表2:悪意あるVPNプラグインのPoCコード

この攻撃を成功させる上で注目すべき点は、ユーザーが社内アプリに接触する必要や「信頼する」必要がないことです。攻撃対象のVPNアプリをユーザーが強制的にアンインストールした場合でも、アプリは再起動後に復活します。つまり、アプリのアンインストールは簡単にはできないようになっているのです。電源ボタンを長押ししてiPhoneをオフにしようとした場合でも、攻撃者のコードを実行するneagentデーモンはバックグラウンドで動作を続け、デバイスの本当の再起動を阻止します。iPhoneの画面は真っ暗になり、デバイスは再起動中のように思われますが、攻撃者のコードによりneagentはバックグラウンドで動作しています。

[デモ:信頼できないコードの実行攻撃動画]

企業におけるiOSアップデートの遅延
iOS 8.1.3(App Masque、URL Masque、Plugin Masqueの脆弱性に一部または全部対応)が公開されたのは2015年1月のことで、iOSが新バージョンをいち早く導入することは周知の事実です。しかし、・アイが複数の有力ネットワークでiOSの最近のWebトラフィックを監視したところ、その結果は驚くべきものでした。公開から5カ月が過ぎているにもかかわらず、iOSトラフィックの約3分の1は、いまだに8.1.3より古いバージョンのデバイスによるものです(図3)。これらのトラフィックの発信元は、App Masque、URL Masque、Plugin MasqueなどのMasque Attackに対し、今でも脆弱な状態です。すべてのユーザー、特に企業のユーザーには、最新版iOSへの迅速なアップデートを推奨します。

図3:ファイア・アイが調査したネットワーク・トラフィックに基づく、iOSのバージョン比率

結論
アップル社はiOS 8.1.3で当初の脆弱性(Masque Attack)を一部またはすべて修正した[1, 2]にもかかわらず、現在もなお、iOSのインストールプロセスの脆弱性を悪用するその他の攻撃が確認されています。こうしたリスクをユーザーが認識し、自衛に役立てられるよう、本稿ではMasque Attackの3つの亜種について情報を公開しました。さらに、iOSデバイスの約3分の1はしばらくアップグレードされていないため、すべてのMasque Attackに対して、現在も脆弱な状態となっています。iOSユーザーには、デバイスを最新の状態にされることを推奨します。

参照情報
[1] https://www.fireeye.com/blog/threat-research/2014/11/masque-attack-all-your-ios-apps-belong-to-us.html

[2] https://www.fireeye.com/blog/threat-research/2015/02/ios_masque_attackre.html

[3] https://drive.google.com/file/d/0BxxXk1d3yyuZOFlsdkNMSGswSGs/view

[4] http://thecyberwire.com/events/docs/nsmail.pdf

[5] https://manuals.info.apple.com/MANUALS/1000/MA1685/en_US/ios_deployment_reference.pdf

[6] https://developer.apple.com/app-extensions/

[7] https://developer.apple.com/library/prerelease/ios/documentation/General/Conceptual/ExtensibilityPG/NotificationCenter.html

[8] https://developer.apple.com/library/ios/documentation/General/Conceptual/WatchKitProgrammingGuide/DesigningaWatchKitApp.html

[9] https://cansecwest.com/slides/2015/CanSecWest2015_Final.pdf

[10] http://en.pangu.io/

FireEye(ファイア・アイ)について
FireEye®は、次世代のサイバー攻撃から、世界中の民間企業や官公庁をリアルタイムで防御するために専用設計された、仮想マシンベースのセキュリティ・プラットフォームを発明した企業です。高度なサイバー攻撃は、次世代ファイアウォールやIPS、アンチウイルス、各種ゲートウェイなど、シグネチャベースのセキュリティ対策を容易にすり抜けてしまいます。FireEye®脅威対策プラットフォーム™は、攻撃ライフサイクル全体で、モバイル、Web、電子メール、ファイル・システムといった主要な攻撃経路にわたり、シグネチャを利用しないリアルタイムでダイナミックな脅威防御策を組織へ提供します。FireEyeプラットフォームの核となる仮想実行エンジンは、Dynamic Threat Intelligenceによって補完されており、サイバー攻撃をリアルタイムに検出・防御することができます。FireEyeのソリューションは、「Forbes Global 2000」企業の675社を含む、世界67か国以上の3,700を超える組織で利用されています。

FireEyeウェブサイト: http://www.fireeye.co.jp
FireEyeプラットフォームについて: https://www.fireeye.jp/products.html

【報道関係の方からのお問い合せ先】
ファイア・アイ広報事務局
(ホフマンジャパン株式会社内)
担当: 青木 / 鷲野 / 田中
TEL: 03-5159-5750
Email: FireEye_PR@hoffman.com

# # #

FireEyeはFireEye, Inc.の登録商標です。その他すべてのブランド、製品、またはサービスの名前は、それぞれ該当する所有者の商標またはサービスマークである可能性があります。