サンプルアプリの脆弱性説明

サンプルアプリの脆弱性

サンプルアプリ「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サイトを表示した場合に、この処理が悪用されてしまう脆弱性が生じています。

次は、脆弱性の修正方法について説明します。