PR

 今回紹介する脆弱性はAndroidアプリ内でWebコンテンツを扱うコンポーネント「WebView」の実装に問題があり、脆弱性が作り込まれてしまうものである。前回までのIntentやContent Providerのようなアプリ間連携の仕組みとは異なるものの、やはりアプリの設計ミスによって生じる脆弱性である。まずはWebViewの機能について紹介した後、脆弱性の詳細について述べる。

図1●WebViewクラスとは
図1●WebViewクラスとは
[画像のクリックで拡大表示]

 WebViewとは、Androidアプリ内でHTMLを表示したい場合に使うクラスである。WebViewを実装すると、Androidアプリに簡易的なブラウザー機能を搭載することができる(図1)。

 WebViewは、表示したいHTMLコンテンツの性質によってカスタマイズすることが可能である。例えば、JavaScriptを有効にしたり、HTMLファイルに記述されているJavaScriptからAndroidアプリを操作可能にしたりすることができる。JavaScriptからAndroidアプリを操作可能にするメリットとして、Androidアプリの基盤部分をJavaで記述し、変更の多いコンテンツ部分をHTML+JavaScriptで記述することで開発期間を短縮できることが挙げられる。このような実装のアプリはハイブリッド・アプリと呼ばれることもある 。料理レシピ・アプリやゲーム・アプリなどで採用事例がある。

 ただし、実装方法によっては、Androidアプリで細工したWebページを閲覧しただけで攻撃が成立してしまう脆弱性を作り込んでしまうため、開発者の注意が必要である。

JavaScriptからAndroidアプリを操作することの落とし穴

 JavaScriptからAndroidアプリを操作するメソッドは「addJavascriptInterface」と呼ばれる。addJavascriptInterfaceを使用すると、当該Androidアプリの任意のJavaオブジェクトをJavaScriptから操作可能にすることができる。しかし、Androidアプリが悪意あるJavaScriptコードを含むコンテンツを読み込むことを想定していない場合、悪意ある者にAndroidアプリが操作されてしまう可能性がある。

脆弱性のあるアプリの挙動

 ここでは、脆弱性のあるアプリの例として「アドオンにより機能拡張が可能なWebブラウザー」を挙げる。このアプリは、WebViewクラスやaddJavascriptInterfaceメソッドを使ったWebブラウザーである。HTML+JavaScriptで記述されたアドオンによりブラウザーの各種機能にアクセスし、機能拡張するものとする。例えば、Webブラウザーの閲覧履歴の表示・検索機能を強化するアドオンが作成可能であると思っていただきたい。addJavascriptInterfaceメソッドは、アドオンからWebブラウザーの特定機能が使用できるようにするために使用している。

攻撃イメージとその影響

図2●WebView(addJavascriptInterface)の脆弱性の攻撃
図1●WebView(addJavascriptInterface)の脆弱性の攻撃
[画像のクリックで拡大表示]

 上記のWebブラウザーが、悪意ある者が用意したWebページ(HTML+JavaScript)を表示した場合、当該Webブラウザーが悪意ある者に操作されてしまう(図2)。例示したアプリの場合、Webページを閲覧しただけで、これまでに閲覧したページの履歴情報が悪意ある者に窃取されてしまう可能性がある。

 Android Developerのサイト(外部の関連サイト)には、Javaのリフレクションの仕組みを悪用することで当該Androidアプリの権限でJavaコードを実行できてしまう旨の注意書きが掲載されている。リフレクションとは文字列を使ってクラスやインスタンスを生成し、メソッドを実行できる機能である。これを使ってAndroidの内部情報を取得したり、取得した情報に基づいてメソッドを実行したりすることができる。つまり、JavaScriptで操作可能なJavaオブジェクトは、addJavascriptInterfaceで指定した当該AndroidアプリのJavaオブジェクトに限らないということになる。その結果、当該Androidアプリが管理するデータの漏えいや改ざんだけでなく、任意のOSコマンドが実行される可能性がある。

 なお、WebViewに関する脆弱性については、イエラエセキュリティの資料が詳しい (外部の関連資料)。参考までに紹介する。

対策方法

 Androidアプリにおいて、信用のおけるコンテンツのみ読み込むように制限する、下記のような方法が考えられる。なお、以下には記載していないが、addJavascriptInterfaceを使わないことも対策として考えられる。

1. Android端末内部の当該アプリが管理する領域にあるコンテンツに制限する
2.SDメモリーカードに保存したデータは他のアプリが書き換え可能である。そのため、不正なアプリによるファイル改ざんを想定し、基本的に他のアプリが書き換えられない、当該アプリが管理する領域(/data/data/<アプリのパッケージ名>/配下)にあるコンテンツのみを読み込むようにする
3.外部サーバーからコンテンツを読み込む場合は、アクセス先のドメインを制限し、通信はHTTPSに制限する
4.信用のおけるアクセス先に制限するだけでなく、中間者攻撃などによりアクセス先を改ざんされた場合を想定し、通信はHTTPSに制限する。HTTPS通信において、アプリ側でサーバー証明書によるアクセス先の正当性確認は必須である

最後に

 本連載を通して、Androidアプリの脆弱性について解説してきた。開発者の方にとって、Androidアプリにおける脆弱性の考え方や安全なAndroidアプリの開発の役に立てば幸いである。

 現在、JPCERT/CC、日本スマートフォンセキュリティ協会(JSSEC)などさまざまな組織がAndroidに関するセキュリティ情報を発信しているが、IPAの情報と併せてこれらの情報も活用いただきたい。