ここまで、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に存在する脆弱性の回避策は以下の通りです。