Android アプリのセキュア設計・セキュアコーディングガイドに記載されている内容の要約です。
JavaScriptを有効にするのは自社管理のコンテンツなど安全性を保証できるのみにする
- JavaScriptを有効にすることで、端末の情報を取得される、あるは端末を操作されるという被害が発生する可能性がある。
- 安全性を保証できないコンテンツを表示する場合はJavaScriptの実行を無効にすべきである。
ローカルコンテンツをWebViewで表示する場合は、assets/resディレクトリの限定する
- SDカードのような端末の外部記憶装置に配置されたコンテンツは他のアプリによる書き換えが可能なため、assets/resディレクトリの限定する。
通信にはHTTPSを使い、適切にエラーをハンドリングする
- 第三者によるサービスのなりすましによる被害を防ぐ。
- SSL通信エラーの場合は通信を終了する。
他アプリからIntentを受信するActivityのWebViewではJavaScriptを無効にする
- 予期せぬJavaScriptが実行されることを防ぐ。
- どうしてもJavaScriptを有効にする必要がある場合はIntentで渡されたURLが安全性を保証できるなのか、ホワイトリストで管理する必要がある。
Android4.2未満の端末における addJavascriptInterface() に起因する脆弱性
- Android4.2(API Level 17)未満ではJavaScriptからJavaのReflectionを行うことにより任意のJavaメソッドを実行できてしまう問題がある。
- Android4.2以降では@JavascriptInterfaceアノテーションが指定されたメソッドしか実行できないように仕様変更され、対策されている。
fileスキームに起因する脆弱性
- fileスキームを利用すると該当アプリがアクセス可能なすべてのファイルにアクセスすることが可能になる。
- 例えば、JavaScriptからfileスキームを使ったリクエストをすることで、アプリの専用フォルダに保存したファイル等を取得されてしまう。
- 意図しないfileスキームによるリクエストは処理しないような対策が必要である。
- またAndroid4.1(API Level 16)以降の場合は以下のコードでfileスキームによるアクセスを禁止することが出来る。
webView.settings.allowUniversalAccessFromFileURLs = false
webView.settings.allowFileAccessFromFileURLs = false
Web Messagingに起因する脆弱性
- WebViewを用いてWeb Messaging を行う際は postWebMessaging()メソッドに特定のオリジンを指定すべきである。
- postWebMessaging()メソッドでオリジンにワイルドカードを指定すると、WebViewに悪意のあるコンテンツが読み込まれている状況で、オリジンの制限なしに重要なメッセージを送信してしまう可能性がある。