被害者は「不正アプリ」と書かれた側
ITmediaにGoogle Playに132本の不正アプリ、開発環境を悪用する手口が浮上といったニュースを見かけたので、悪意を持って作られたアプリがまとまった数見つかったのかとおもいくいや。1次情報であるPaloalto のGoogle Play Apps Infected with Malicious IFramesを確認するとどうやら特定のクラウド開発環境を用いて開発したアプリが不正に書きかえれたとのことで被害者は「不正アプリ」と書かれた側だとわかりました。日本のニュースサイトでは度々こういった誤解し兼ねない記載が目立つので必ず1次情報を取りに行くようにしましょう。
発見方法と対策について1行でできる対策について
手口としては特定の開発環境でのアプリリリース時にwebviewでの静的ページの読み込みwebSettings.setJavaScriptEnabled(true);でJavascriptを有効にを追加しloadUrlで不正なコンテンツを読み込むを不正に追加するものです。発見方法は開発環境の感染が原因なのでリリースしたアプリを逆コンパイルでソースを確認するといった方法しかない。
【対策】assets と res ディレクトリ以外の場所に配置したファイルへのアクセスを禁止にする
外部からコンテンツを読み込ませるのが目的なので内部読み込みのみに制限しましょう。感染箇所が静的ページであることから設定による影響もないと考えられます
webSettings.setAllowFileAccess(false);
shouldOverrideUrlLoadingを利用したもう一つの対策
WebView では新しく指定された URI を開くときに、WebViewClient が与えられていなければホストアプリケーションに処理を任せます。一方WebViewClient が与えられている場合はこの WebViewClient オブジェクトでは新しく URL が指定された時に shouldOverrideUrlLoading が呼ばれます。
このshouldOverrideUrlLoadingの中でできればホワイトリスト、少なくとも正規表現により、不正なアクセス先が自分のアプリケーションに表示されることを防ぐことができます。
import android.app.Activity; import android.os.Bundle; import android.webkit.WebView; import android.webkit.WebViewClient; public class WebViewSampleActivity extends Activity { WebView webView; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); webView = (WebView)findViewById(R.id.webView1); webView.setWebViewClient(new WebViewClient(){ @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { //ここでurlの妥当性を検証する return false; } }); webView.loadUrl("http://www.google.com/"); } }
以上です。参考になれば幸いです。