それでは、実際に脆弱性のあるソースコードを見てみましょう。
この例では、表示したWebサイトのHTMLから端末の設定情報を取得して表示するために、JavascriptInterface経由で端末の電話番号を取得できるメソッドを実装し、JavaScriptから当該メソッドを呼び出せるようにしています。
JavascriptInterfaceは、WebView#addJavascriptInterface()により使用可能になり、JavaScriptは、WebView#getSettings().setJavaScriptEnabled(true)の設定により有効になります。
下記のサンプルコードには、悪意あるWebサイトに誘導された際に、細工されたJavaScriptによりアプリの機能が悪用され、電話番号が盗まれてしまう脆弱性が含まれています。
プロジェクト |
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");
// ▲▲▲脆弱性のあるソースコード▲▲▲
}
//JavascriptInterface経由で電話番号を返す
public String getLine1Number() {
return ((TelephonyManager) getSystemService(TELEPHONY_SERVICE)).getLine1Number();
}
|