この記事はiRidge Advent Calendar 2018 の18日目の記事です。
はじめに
非機能要件として機密性や安全性が求められるアプリの開発をすることとなり、復習がてら日本スマートフォンセキュリティ協会(JSSEC)が公開しているガイドを読み、WebView実装において何が必要かをまとめました。
『Android アプリのセキュア設計・セキュアコーディングガイド』【2018年9月1日版】
https://www.jssec.org/dl/android_securecoding.pdf
自社もしくは連携会社が管理していないコンテンツでJavaScriptを有効にしない
自社や連携会社が管理している、もしくは安全性を保証できるコンテンツでなければJavaScriptを有効にすべきではありません。
また、Build.VERSION_CODES.JELLY_BEAN以前でaddJavascreptInterface()
をコールするとリフレクションを用いることができます。
JavaScriptを有効にする=思っているより危険なコードを実行したり、アプリの権限で端末の情報を抜き取る、あるいは端末を操作することができる可能性があるため有効にする場合は注意が必要です。
HTTPS(暗号化されたページ)でないページにアクセスしない
自社のサービスにアクセスする際は、悪意ある第三者によるサービスのなりすましによる被害を防ぎ、対象サービスへ確実に接続する必要があります。
HTTPのページにアクセスすることは安全性を保証できないということで、悪意のある第三者への情報流出を防ぐことができません。
SSL通信のエラーを適切にハンドリングする
SSLエラーが発生した場合、有効期限切れなど証明書に不備があるか、
プライベートな証明書が設定されたり、もしくは中間者攻撃を受けている可能性があるので、安全のために接続を中止する対策が必要です。
// URLリクエストをハンドリングするためのクラス
private class MyWebViewClient extends WebViewClient{
// SSL通信で問題がある場合にコールされる
@Override
public void onReceivedSslError (WebView view,
SslErrorHandler handler,
SslError error){
// 接続を停止するなどの処理
}
}
ブラウザアプリとしてActivityを公開する場合の注意点
例えばサービスのWebページをブラウザで開いていて、その中にアプリへのリンクを設け起動させるURIスキームに対応したActivityを実装する際も注意が必要です。同じURIスキームに対応したマルウェアアプリをインストールさせURLに含まれるパラメータを横取りされるといったことが可能だからです。
また、URIスキームに対応したActivity側では、URLのパラメータを利用する前に値の安全性を確認することが必要です。
<application>
// ブラウザアプリとしてActivityを公開
<activity
android:name=".BrowsableActivity"
android:exported="true" >
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<categoryandroid:name="android.intent.category.LAUNCHER"/>
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.VIEW"/>
// 暗黙的intentを受け付ける
<categoryandroid:name="android.intent.category.DEFAULT"/>
// Browsable intentを受け付ける
<categoryandroid:name="android.intent.category.BROWSABLE"/>
// URI 'hoge://iridge' を受け付ける
<data android:scheme="hoge" android:host="iridge"/>
</intent-filter>
</activity>
</application>
その他
WebViewの他、センシティブなものを入力する箇所ではロングタップを無効化しClipBoadへのコピーを防ぐなどの対策も必要と考えています。