参考

ここまで、JavascriptInterfaceの理解不足に関する対策について学習してきました。しかし、Android OS自身にもJavascriptInterfaceに関する脆弱性が存在している場合があります。ここではCVE-2013-4710の脆弱性を紹介します。

OS側の問題をアプリ開発者側で回避するのは本来の責任範囲とは言えませんが、CVE-2013-4710の脆弱性は影響が大きいため、参考情報として取り上げます。
この脆弱性に対する回避策は存在していますので、ここでサンプルコードを基に回避策を学んでいきましょう。

Android OSに存在する脆弱性

Android OSのWebViewに存在する脆弱性
Android OSにはバージョンにより、JavascriptInterface経由で任意のJavaのメソッドが実行される脆弱性が存在しています。アプリ内で開発者がJavascriptInterfaceを明示的に有効していない場合でも、本脆弱性の影響を受けます。
Android OSのWebViewに脆弱性が存在するかどうかは、以下の2点によって決まります。
  • アプリのminSdkVersion
  • アプリを実行する端末のOSバージョン
上記2点をまとめると、以下の表になります。

CVE-2013-4710の脆弱性におけるminSdkVersionとAndroid OSの関連性
実行端末のAndroid OSのバージョン minSdkVersionの値
16以下(Android4.1以前) 17以上(Android4.2以降)
Android4.1以前 任意のJavaのメソッドが実行される 開発したアプリをインストールできない
Android4.2、Android4.3 任意のJavaのメソッドは実行されない 任意のJavaのメソッドは実行されない
Android4.4 任意のJavaのメソッドは実行されない 任意のJavaのメソッドは実行されない

minSdkVersionが16以下で開発したアプリは、実行する端末のOSバージョンにより、細工されたJavaScriptを実行した際に、JavascriptInterface経由で任意のJavaのメソッドが実行される脆弱性があります。
この問題の原因はAndroid OS側にあるため、開発者は問題を根本的に解決することはできません。開発者がWebViewでJavaScriptを有効するだけで、細工されたJavaScriptを実行した場合には、JavascriptInterfaceを悪用されてしまいます。
開発者はminSdkVersionを16以下に設定し、Android4.1以前のバージョンに対応するアプリでJavaScriptが有効なWebViewを使用する際は、細工されたJavaScriptを実行しないようにしてAndroid OSの脆弱性を回避する対策が必要です。

CVE-2013-4710の脆弱性については、修正プログラムが提供されています。詳しくは以下のJVNのサイトを参考にしてください。
Android OS において任意の Java のメソッドが実行される脆弱性
http://jvndb.jvn.jp/ja/contents/2013/JVNDB-2013-000111.html

一度、サンプルアプリを修正前の状態にして、この脆弱性が悪用されたことを体験してみましょう。
「サンプルアプリをインポート」ボタンをクリックしてプロジェクトJavascriptInterfaceをワークスペースにインポートしてください。
プロジェクトの上書き確認に「OK」を指定してインポートを続行します。

サンプルアプリをインポート


脆弱性対策を行う前の状態に戻ったサンプルアプリのソースコードを以下のように変更します。
プロジェクト JavascriptInterface
ソースファイル WebViewActivity.java
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_sub);

    uri = getIntent().getData();

    webView = (WebView) findViewById(R.id.webView);
    // ▼▼▼脆弱性のあるソースコード▼▼▼
    // javascriptInterfaceを有効にする
    webView.getSettings().setJavaScriptEnabled(true);
    //webView.addJavascriptInterface(this, "javascriptInterface");
    // ▲▲▲脆弱性のあるソースコード▲▲▲
}
31行目をコメントアウトすることで、サンプルアプリ内でJavascriptInterfaceを有効にしないようにします。
これにより、アプリ内のメソッドはJavaScriptから呼び出されなくなったはずです。

次にJavascriptInterfaceを無効にしたサンプルアプリをインストールして実行します。
脆弱性体験と同様の手順でサンプルアプリ「09社内WEBログイン」を実行し、以下の画面が表示される事を確認してください。

次に、「攻撃アプリをダウンロード」ボタンをクリックし、JavascriptInterfaceAndroidSpyware.apkをダウンロードしてください。
なお、このシナリオで使用している攻撃アプリは、エミュレータ上ではうまく動作しない場合があります。

攻撃アプリをダウンロード


脆弱性体験と同様の手順で攻撃アプリ「16社内WEBログインスパイ」を実行して、Android OSの脆弱性が攻撃された場合の被害を体験してみましょう。
「09社内WEBログイン」アプリではaddJavascriptInterfaceを有効にしていないのにも関わらず、電話番号が取得できていることが分かります。

Android OSに存在する脆弱性の回避策

Android OSに存在する脆弱性の回避策は以下の通りです。
  • WebView#removeJavascriptInterface("searchBoxJavaBridge_")を実行する
    Android3.0から4.1までのOSが有効にしている「searchBoxJavaBridge_」という名前のJavascriptInterfaceを削除するため、 WebView#removeJavascriptInterface("searchBoxJavaBridge_")を実行します。
    WebView#removeJavascriptInterface(String name)は引数に指定した名前のJavascriptInterfaceを削除するメソッドです。
    以下のようにしてJavascriptInterfaceを削除します。
    webView.removeJavascriptInterface("searchBoxJavaBridge_");
    
  • JavaScriptを有効にしない
    細工されたJavaScriptを実行しない限り、JavascriptInterfaceは悪用されません。WebViewはデフォルトでJavaScriptは無効ですので、WebViewが表示するコンテンツ内でJavaScriptの実行が不要な場合は、JavaScriptを有効にしないでください。