Cordovaアプリケーションのテスト
Cordovaのようなハイブリッドフレームワークには、一つのアプリで複数のプラットフォーム(Android、iOS、Windows Phone、FireOS、FirefoxOSなど)に対応できる利点があります。開発が容易かつ迅速で、一般にすべてのプラットフォームで共通のAPIを利用できます。
ネイティブとハイブリッド
Cordovaのようなハイブリッドフレームワークには、一つのアプリで複数のプラットフォーム(Android、iOS、Windows Phone、FireOS、FirefoxOSなど)に対応できる利点があります。このフレームワークを使えば開発が容易かつ迅速で、一般にすべてのプラットフォームで共通のAPIを利用できます。
ただし、ハイブリッドアプリにはパフォーマンスの問題があります。もっとも、最新バージョンではフレームワークの速度が大きく改善されており、最新のスマートフォンでは速度の遅れは気にならない程度です。
Cordova
Cordovaは、HTML5、CSS3、Javascriptを使ってハイブリッドモバイルアプリを開発するためのプラットフォームです。オープンソースで、Apache Licence version 2.0のもとでライセンスされています。コアコンポーネントはJavaScriptで豊富な機能を提供しており、ネイティブ言語を使って拡張することもできます。
内部構造
Cordovaモバイルアプリケーションのセキュリティをレビューするには、何をどこで確認すべきかを把握するために、まずフレームワークの内部構造をひととおり理解しておくことが重要です。
config.xml
config.xmlはメインの設定ファイルで、有効化されたプラグイン、プラットフォーム固有の設定、カスタムフックの一覧など、モバイルアプリケーションのさまざまな側面を定義します。config.xmlファイルのオプションの詳細については、こちらのURLを参照してください。
セキュリティ監査では、アプリケーションの機能をひととおり把握するために、まずこのファイルを確認します。
<?xml version='1.0' encoding='utf-8'?>
<widget id="io.cordova.hellocordova" version="0.0.1" xmlns="http://www.w3.org/ns/widgets" xmlns:cdv="http://cordova.apache.org/ns/1.0">
<name>HelloCordova</name>
<description>
A sample Apache Cordova application that responds to the deviceready event.
</description>
<author email="dev@cordova.apache.org" href="http://cordova.io">
Apache Cordova Team
</author>
<content src="index.html" />
<plugin name="cordova-plugin-whitelist" spec="1" />
<access origin="*" />
<allow-intent href="http://*/*" />
<allow-intent href="https://*/*" />
<allow-intent href="tel:*" />
<allow-intent href="sms:*" />
<allow-intent href="mailto:*" />
<allow-intent href="geo:*" />
<platform name="android">
<allow-intent href="market:*" />
</platform>
<platform name="ios">
<allow-intent href="itms:*" />
<allow-intent href="itms-apps:*" />
</platform>
</widget>
config.xmlファイルはCordovaプロジェクトフォルダーのルートに置かれており、プロジェクトフォルダーは次の構成になっています。
hooks:Cordova CLIの動作を変更するためのものplatforms:各プラットフォームのネイティブコードを格納します。開発者はこれを変更してCordovaフレームワークを拡張または改変できますが、推奨される方法はプラグインの追加です。plugins:プラグインはJavaScript APIを拡張するもので、このフォルダーに格納されます。www:HTML、JavaScript、CSSのコードを格納するメインのフォルダーです。
ホワイトリスト
ホワイトリストプラグインは、ナビゲーション、インテント、ネットワークアクセスについて許可するURIを定義する、重要なセキュリティプラグインです。このプラグインではコンテンツセキュリティポリシー(CSP)も定義できます。CSPは、Cordovaアプリケーションにとって非常に危険なクロスサイトスクリプティング(XSS)脆弱性に対する、きわめて重要な防御策です。
CSPの詳細については、こちらのリンクと、新しいnonceベースの防御に関するこちらのプレゼンテーションを強くお勧めします。
<!-- Good default declaration:
* gap: is required only on iOS (when using UIWebView) and is needed for JS->native communication
* https://ssl.gstatic.com is required only on Android and is needed for TalkBack to function properly
* Disables use of eval() and inline scripts in order to mitigate risk of XSS vulnerabilities. To change this:
* Enable inline JS: add 'unsafe-inline' to default-src
* Enable eval(): add 'unsafe-eval' to default-src
-->
<meta http-equiv="Content-Security-Policy" content="default-src 'self' data: gap: https://ssl.gstatic.com; style-src 'self' 'unsafe-inline'; media-src *">
<!-- Allow everything but only from the same origin and foo.com -->
<meta http-equiv="Content-Security-Policy" content="default-src 'self' foo.com">
<!-- This policy allows everything (eg CSS, AJAX, object, frame, media, etc) except that
* CSS only from the same origin and inline styles,
* scripts only from the same origin and inline styles, and eval()
-->
<meta http-equiv="Content-Security-Policy" content="default-src *; style-src 'self' 'unsafe-inline'; script-src 'self' 'unsafe-inline' 'unsafe-eval'">
<!-- Allows XHRs only over HTTPS on the same domain. -->
<meta http-equiv="Content-Security-Policy" content="default-src 'self' https:">
<!-- Allow iframe to https://cordova.apache.org/ -->
<meta http-equiv="Content-Security-Policy" content="default-src 'self'; frame-src 'self' https://cordova.apache.org">
プラグイン
プラグインは、アプリケーションがサポートする機能のセットを定義します。Cordovaには既存のプラグインが豊富にそろっており、カメラ、GPS、ネットワーク、バッテリーといった一般的な機能にアクセスできます。開発者は独自のプラグインを開発することも、こちらで公開されている数百ものオープンソースプラグインのいずれかを組み込むこともできます。
Cordovaプラグインは簡単に開発できます。たとえばAndroidの場合、CordovaPluginクラスを継承し、executeメソッドのいずれかをオーバーライドするだけで実装できます。
その他のフレームワーク
Cordovaで開発されたアプリケーションでは、Sencha、Angularなどの補完的なフレームワークを併用したり、PhonGapやIonicのようなCordovaの拡張版を使ったりするのが一般的です。これらのフレームワークはCordovaの機能を拡張し、アプリケーション開発をはるかに容易にします。たとえばIonicは、プッシュ通知、A/Bテスト、アナリティクス、コードデプロイ、自動ビルドといったサービスを提供しています。
これらのフレームワークには、それぞれ独自のロジックと設定ファイルがあります。
デバッグ
開発目的であれセキュリティテスト目的であれ、コードのデバッグはバグや脆弱性の特定や、アプリケーションの理解に大いに役立ちます。デバッグに使えるツールは対象のプラットフォームによって異なります。Androidでは、Chromeのリモートデバッグを利用でき、Cordova内部のすべての開発者ツールにアクセスできます。iOSでは、ほぼ同等の機能を備えたSafari Web Inspectorを利用できます。
Cordovaは、モバイルアプリケーションを構築するための現実的な選択肢となりました。セキュリティの観点では、Cordovaは新たな課題と拡大したアタックサーフェスをもたらします。以下に、よく見られるセキュリティ上の弱点と注意点を挙げます。
よく見られるセキュリティ上の弱点
安全でないホワイトリスト
Cordovaのホワイトリストプラグインは、Cordovaアプリのセキュリティにおける重要な要です。前述のとおり、このプラグインでは、WebViewがナビゲートできる許可済みURI、Androidの場合にアプリケーションが要求できる許可済みインテント、そして許可済みのネットワークアクセスを定義できます。
このプラグインのもう一つの重要な機能が、XSS脆弱性から保護するためのCSPポリシーのサポートです。ホワイトリストのフィルターはWebsocketsとHTML5の<video>タグには適用されないため、CSPが必要になります。
次のような許容範囲の広いポリシーは、
<!-- Don't block any requests -->
<access origin="*" />
安全ではないにもかかわらず残念ながらよく見られ、アプリケーションにおけるXSS脆弱性の悪用を容易にします。この脆弱性は、当社が公開しているセキュリティスキャナーでチェックされます。
クロスサイトスクリプティング(XSS)
OWASPの定義によれば、クロスサイトスクリプティング(XSS)攻撃はインジェクションの一種で、本来は無害で信頼できるWebサイトに悪意のあるスクリプトが注入されるものです。XSS攻撃は、攻撃者がWebアプリケーションを利用して、一般にはブラウザー側のスクリプトという形で、悪意のあるコードを別のエンドユーザーに送り込むことで発生します。こうした攻撃を成立させる欠陥はかなり広く存在しており、Webアプリケーションがユーザーからの入力を検証やエンコードを行わずに、生成する出力の中で使用している箇所であればどこでも発生します。
XSS脆弱性はCordovaアプリケーションにも当てはまり、モバイルアプリケーションのコンテキストでの完全なコード実行に等しいため、非常に危険です。実行できることの範囲は、読み込まれているプラグインの一覧によって決まります。
使用されていないプラグイン
XSSのような脆弱性の影響を抑えるには、アプリケーションのアタックサーフェスを減らすことが重要です。特に、ファイル、カメラ、連絡先へのアクセスといった危険な機能を持つプラグインについてはなおさらです。
プラグイン自体にも、SQLインジェクション、安全でないファイルシステムアクセス、XXEインジェクションといった固有の脆弱性が存在する可能性があります。
パッチ未適用のCordovaバージョン
Cordovaには過去に、ホワイトリストの制限を回避して任意のリソースを読み込めてしまう脆弱性が複数存在しました。脆弱性を修正するには、通常、アプリケーションの新しいバージョンをビルドして公開する必要があります。
既知の脆弱性の一覧については、こちらのURLを確認してください。
AndroidはあくまでAndroidであり、iOSはあくまでiOSです。Cordovaによって新たに持ち込まれる脆弱性クラス、特にXSSに加えて、Cordovaモバイルアプリケーションもモバイルアプリケーションであることに変わりはなく、従来のモバイルアプリケーションの脆弱性も引き続き当てはまります。