サンプルアプリの脆弱性
サンプルアプリ「09社内WEBログイン」に存在している脆弱性について詳しく説明します。
具体的にどのような実装が脆弱性につながっているのか、ソースコードを確認してみましょう。
脆弱性のあるソースコード
プロジェクト |
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();
}
|
脆弱性の原因となっている処理は以下の2点です。
-
WebViewが任意のURLにアクセス可能になっている
25行目でWebViewに表示するURLをIntentで受け取っていますが、受け取ったURLの内容を検証していません。
そのため、信用できないコンテンツも読み込めるようになっています。
30行目、31行目でJavascriptInterfaceを有効にしていますが、有効にする場合は、アプリの機能を悪用されないよう、自社管理コンテンツなどの信用できるコンテンツのみ読み込むようにしなければなりません。
-
JavascriptInterface経由で重要な処理を行っているメソッドを呼び出し可能な状態になっている
36行目からのJavascriptInterface経由で呼び出し可能なメソッドで重要な処理を行っています。
細工されたJavaScriptを含むWebサイトを表示した場合に、この処理が悪用されてしまう脆弱性が生じています。
次は、脆弱性の修正方法について説明します。