MonacaはHTML5/JavaScript/CSSを使ってスマートフォンアプリを開発します。そのため、セキュリティの基準がアプリとWeb技術両面から考えなければなりません。
最新のCordovaエンジンではホワイトリストと呼ばれる機能によって、アクセスできる外部サイトを制限できます。まずこちらを紹介します。
設定はプロジェクト直下にあるconfig.xmlに対して行います。設定は3つあります。
<access />
アクセスしてもいいサイトを指定します。すべて許可する場合は、
<access origin="*"/>
になります。例えばGoogle.comへのアクセスを許可する場合は、
<access origin="https://google.com" />
のように書きます。これは apache/cordova-plugin-whitelist: Mirror of Apache Cordova plugin whitelist で提供される機能で、最新のMonacaアプリではデフォルトでインストールされます。
<allow-navigation />
WebView上で使用できるURLを指定します。aタグを使ったページ遷移であったり、HTTPSでないiframeタグによるコンテンツ読み込みに対して制御が可能です。
iOS9以降のiOSではApplication Transport Securityという仕組みが導入されました。Application Transport Securityが有効になっているとHTTP接続が不可になります。そこで、<access>
と <allow-navigation>
で指定されたドメインはApplication Transport Securityの対象外になるように自動的に設定されます。
さらに <access>
と <allow-navigation>
には2つの要素が追加されています。
- minimum-tls-version(例えばTLSv1.2など)
- requires-forward-secrecy(デフォルトはtrue)
<allow-intent>
JavaScriptからネイティブ側へのブリッジ越しに送信されるネットワークリクエストに対して許可するサイトを指定します。XHR(Ajax)も対象になります。
その他、詳しい内容についてはWhitelist Guide - Apache Cordovaとホワイトリストへの登録 プラグイン ( Android 専用 ) - Monaca Docsをご覧ください。
コンテンツ セキュリティー ポリシー
HTMLのメタタグ内においてもアクセスできるサイトを制御できます。これはWebViewの中で使われるもので、ネイティブを経由しないアクセスに対して有効です。設定についてはContent Security Policy Reference & Examplesを参照してください。下記はデフォルトの設定です。
<meta http-equiv="Content-Security-Policy" content="default-src * data:; style-src * 'unsafe-inline'; script-src * 'unsafe-inline' 'unsafe-eval'">
セキュリティにおけるTips
Security Guide - Apache CordovaにあるセキュリティTipsを意訳して紹介します。
Androidのジンジャーブレッドは使わないこと
min-target-sdkを10より大きい値としましょう。API 10はジンジャーブレッドで、Googleによってすでにサポートされていません。最もセキュリティリスクの高いデバイスの一つとされています。ホワイトリストによる制御もジンジャーブレッド以前の端末に対しては適用されません。そのため攻撃者がiframeタグの中で攻撃コードを読み込ませたり、すべてのCordova APIにアクセス、個人の情報を読み取ったり、SMSメッセージを盗むことができるようになることを意味します。
外部リンクはアプリ内ブラウザを使いましょう
これはホワイトリストによる制御よりもより安全なものになります。アプリ内ブラウザはネイティブブラウザのセキュリティ機能を使い、Cordova内の環境にはアクセスできません。信頼できるサイトであればアプリ内で表示してもいいですが、そうでない場合はアプリ内ブラウザを使うようにしましょう。
ユーザの入力値は必ず検証しましょう
ユーザ名、パスワード、日付、アップロードするメディアなどすべて検証しましょう。攻撃者はアプリの解析を行っており、HTMLやJavaScriptを調べているからです。また、サーバ側でも検証を行い、かつ任意のバックエンドサービスを使う場合もデータを検証するようにしましょう。ユーザドキュメント、連絡先、プッシュ通知などのデータも注意しましょう。
機密データはキャッシュしないようにしましょう
ユーザ名やパスワード、位置情報など重要なデータをキャッシュすると、許可されていないアプリやユーザからアクセスされる危険性があります。
何が起きるか把握していないevalは使ってはいけません
JavaScriptのeval関数は長い間問題とされてきました。evalを使うと攻撃者のインジェクションを可能にし、デバッグを困難にします。さらにコードの実行が遅いという問題があります。
コードにセキュアだと過信しないでください
Cordovaアプリケーションはリバースエンジニアリングが可能なのだということを認識すべきです。
アプリを使う人が増える一方、攻撃者に合わせて増えています。スマートフォンは個人情報がたくさん詰まった端末ですので、アプリとしても、セキュリティについてきちんと考えなければならないでしょう。今回の記事を参考に皆さんのMonacaアプリをセキュアに開発してください。