ここから本文です

「Androidアプリのプライバシー情報取得」をどう監視すればよい?

@IT 7月5日(火)6時10分配信

 Androidアプリをめぐるセキュリティ対策技術の最新動向を紹介する本連載。第4回では、「アプリがマルウェアでないか」「アプリに脆弱(ぜいじゃく)性が存在しないか」を判定する技術について解説した。第5回となる今回は、特に「広告目的」で利用者に関する情報を取得しようと試みるライブラリの挙動を監視し、アプリ利用者の安全を確保するための技術を紹介する。

【その他の画像】具体的なAPIの監視方法

●広告と利用者情報

 Androidアプリには無料で配布されているものが多数あり、利用者にとっては大きなメリットとなっているが、そのようなアプリは画面に広告が表示されることが多い。この広告表示は、広告事業者によって提供される広告ライブラリモジュールを、アプリ開発者がアプリに組み込むことで実現されている。アプリに広告を組み込むことにより、開発者が広告事業者を通じて収入を得られるようになっている。

 広告ライブラリモジュールは、広告効果を向上させるために、「ターゲティング広告」と呼ばれる利用者の嗜好(しこう)に合わせた広告を表示する仕組みを備えている。この仕組みの裏では、何らかの個人識別IDをキーとして、利用者が過去にクリックした広告の種類や、購入した商品などの情報を管理することで、利用者の嗜好に関する情報を蓄積し、活用している。このとき、広告ライブラリモジュールがどのような個人識別IDを用いるかが問題となる。

 特に問題視されているのが、「グローバルID」と呼ばれる識別IDである。グローバルIDは、スマートフォンやSIMカードに割り当てられる番号など、ユーザーが自由に変更できないか、変更しづらいものを指す。具体的には、以下のようなものがグローバルIDに該当する。

・端末に依存するもの:デバイスID(Android ID)、IMEI(International Mobile Equipment Identity)、MAC アドレス
・SIMカードに依存するもの:IMSI(International Mobile Subscriber Identity)、ICCID(Integrated Circuit Card ID)、電話番号

 グローバルIDはユーザーが容易に変更できないため、ユーザーは一度収集された情報を変更・削除することができない。すなわち、ユーザーの意思とは無関係に、広告事業者に情報を継続的に蓄積されてしまう。また、スマートフォンを譲渡すると、元の持ち主の趣味嗜好が分かってしまうといった問題も考えられる。さらに、異なる複数の広告事業者が収集しているデータであっても、グローバルIDは同一である可能性が高いため、データを結合すれば、個人の行動や趣味嗜好を抽出することも可能になる。

 グーグルはこのような背景から2014年8月1日以降、広告のための追跡に、利用者が適宜リセット可能な広告ID(Advertising ID)を利用するよう定めている。この決定は極めて有意義だが、個々のアプリがこの規定を順守しているかどうか検査をしなければ有名無実化してしまう可能性もあるため、引き続き注視していく必要がある。

●どのようにしてアプリの情報利用を監視するか

 前述のようなグローバルIDの利用を検査するには、「アプリがグローバルIDを取得したかどうか」「取得したグローバルIDを送信したかどうか」などを監視する必要がある。アプリの監視の方法には、第2回で紹介した静的解析と動的解析があるが、このうち特に動的解析では、ソフトウェア階層(下図)のどの階層で観測を行うかが、大きな技術的選択の1つとなる。

 この判断における指標には、以下のものがある。

・アプリの動作を漏れなく監視できるかどうかという網羅性
・アプリが使用した機能から処理内容を推測する容易さ

 上図で示した階層のうち、アプリの監視が網羅的に可能なのは、「アプリケーションフレームワーク」または「Linuxカーネル」である。しかし、前述のような広告ライブラリモジュールの監視においては、グローバルIDを取得するようなAndroid特有のAPI呼び出しを検出し、かつアプリ内のどのモジュールがその呼び出しをしたのかを追跡する必要があるため、アプリケーションフレームワークレベルでの監視が適している。Linuxカーネルは、ライブラリ以上のソフトウェア階層を1つのものとして捉えており、API呼び出しを補足することが難しいからだ。また、Linuxカーネルでは、どのソフトウェア階層の動作であるのかを区別することも難しい。すなわち、処理内容を推測しづらいのである。

●監視の対象となるAPI

 広告ライブラリモジュールの監視においては、グローバルIDや、その他のセンシティブ情報を取得しようとする挙動を検出する必要がある。具体的には、次のようなAPIが対象となる。

Android ID / android.provider.Settings.Secure.getString()
IMEI / android.telephony.TelephonyManager.getDeviceId()
IMSI / android.telephony.TelephonyManager.getSubscriberId()
ICCID / android.telephony.TelephonyManager.getSimSerialNumber()
電話番号 / android.telephony.TelephonyManager.getLine1Number()
MACアドレス / android.net.wi.WiInfo.getMacAddress()
advertising ID / android.content.Intent.setPackage()
共有コンテンツ / android.content.Content.ContentResolver.query()
アカウント情報 / com.android.server.accounts.AccountManagerService.getAccountsAsUser()
インストール済みのアプリ一覧 / android.app.PackageManagerService.getInstalledApplications()
電話発信ログ / android.provider.CallLog.Calls.getLastOutgoingCall()
緯度 / android.location.Location.getLatitude()
経度 / android.location.Location.getLongitude()
Geolocation / com.android.webview.chromium.ContentSettingsAdapter.setGeolocationEnabled()
音声入力 / android.content.Intent.getStringExtra()

 また、取得したこれらの情報を外部に送信しようとする動作についても検出する必要がある。従って、次のようなAPIも対象となる。

HTTP / java.net.URL.URLConnection.openConnection()
〃 / com.squareup.okhttp.internal.http.HttpURLConnectionImpl.connection()
〃 / org.apache.http.impl.client.DefaultRequestDirector.execute()
Socket / libcore.io.Posix.sendto()
SSL / com.android.org.conscrypt.OpenSSLSocketImpl.SSLOutputStream.write()
WebView / android.webkit.WebView.loadUrl()
〃 / android.webkit.WebView.postUrl()
〃 / android.webkitWebView.loadDataWithBaseURL()
WebViewのredirect / WebViewContentsClientAdapter.shouldInterceptRequest()
〃 / Intent android.app.Activity.startActivityForResult()
〃 / android.app.Activity.startActivityAsUse()
〃 / android.app.Activity.startActivityFromFragment()
〃 / android.app.Activity.startActivities()

 さらに、Androidアプリ内でのスレッド生成や、メッセージ通信を利用した処理の依頼など、アプリの処理の流れを追跡するために、次のようなAPIも対象となる。

スレッド生成 / java.lang.Thread.start()
スレッドプール / java.lang.ThreadPoolExecute.execute()
Handler / android.os.MessageQueue.enqueue()
〃 / android.os.Looper.loop()
Intent / android.app.Activity.startActivityForResult()
〃 / android.app.Activity.startActivityAsUse()
〃 / android.app.Activity.startActivityFromFragment()
〃 / android.app.Activity.startActivities()
〃 / android.content.ContextWrapper.startService()
〃 / android.content.ContextWrapper.startServiceAsUser()
addJavascriptInterface / android.webkit.WebView.addJavascriptInterface()
ライブラリ読込み / java.lang.Runtime.loadLibrary()
コマンド実行 / java.lang.ProcessManager.exec()
ファイルアクセス / libcore.io.IoBridge.open()

●具体的なAPIの監視方法

 では、具体的にこれらのAPIの監視を、どのように実現すればよいのだろうか。Androidアプリは、利用者情報の取得や外部との通信を行うために、アプリケーションフレームワークが提供する前述のAndroid APIを用いている。そのため、APIフックを行い、その情報を記録することで、利用者情報の取得や通信内容の追跡が可能である。具体的には、下図のような仕組みとなる。

 なお、APIの先頭には、ロギングメソッドを呼び出すように改変を加える。ロギングメソッドでは、下記のような情報を記録する。

・パッケージ名やUIDなどの、アプリケーションの識別情報
・プロセスIDやスレッドIDなどの実行情報
・APIの種類、引数、戻り値などの情報
・APIが呼び出されるまでの呼び出し過程

 これらの情報は、PCに取り出して解析することができる。特に、呼び出し過程については、各スレッドのスタックをさかのぼることで取得できる。下図のように、同じ通信系APIが呼び出された場合でも、スタックからどのモジュールから呼び出されたのかを区別することで、広告モジュールの挙動を特定できる。

 ただし、スレッドの生成やメッセージ通信による処理依頼など、一連の処理でありながらスタックが異なる場合については、個別に処理の流れを記録し、スタック間の関連を追える仕組みが必要となる。

 以上のような仕組みを用いて取得したログを基にすることで、グローバルIDなどの識別IDをAPIを用いて取得、送信するようなアプリを抽出することができる。また、そのようなAPIを呼び出したモジュールを特定することも可能となる。

●実際のアプリを用いた調査の結果

 筆者らは、以上で述べた仕組みを用いて、著名アプリマーケットに掲載された「新着無料アプリケーション」上位50件について挙動を調査した。具体的には、広告事業者ごとに、グローバルIDなどを取得、送信したアプリケーションの個数を調査した。調査期間は2015年12月21日から2016年1月18日である。

 調査では、アプリケーションへの操作として、メニュー画面などで最初に利用者が操作できるアイコンを全てタップした。また、広告が画面に表示される場合には、広告にアクションを行い、ブラウザアプリケーションやマーケットアプリケーションへの画面遷移も観測した。

 調査結果は下表の通りである。表のうち「?」となっている部分は、個人識別情報取得のAPIを利用していることは観測できたが、その送信を検出できなかった場合である。また「-」の部分は、観測対象のAPIの利用が検出できなかった場合を示している。表にある通り、ほとんどの広告事業者はAdvertising ID(表中ではAdID)を用いているが、一部にはグローバルIDを取得するものがあることが分かる。

●アプリ監視に関する今後の課題

 このように、アプリケーションフレームワークでの監視は比較的容易だ。アプリがJavaで記述されている限りは、監視漏れを抑えることができ、アプリケーションの挙動の意味を理解しやすい。ただし、JNI(Java Native Invocation)を用いて、CやC++などを用いて作成された外部のプログラム群を呼び出すことで、これらの監視をくぐり抜けることができてしまう。従って、外部プログラム群については、Linuxカーネルによる監視も検討する必要がある。

 また、取得したグローバルIDがネットワーク経由で送信されるときに暗号化されると、検出が難しくなる。これに対しては、アプリケーションのプログラム中での特定のデータに対するコピーや変換、保存、送信などの操作を追跡する「テイント解析技術」を用いて解決する研究もなされている。ただし、処理速度の問題や暗黙的フローと呼ばれる検出が困難なデータの流れが存在するという問題、JNIが用いられたときに追跡が困難となる問題など、まだまだ解決すべき課題も多いのが現状である。

 以上、本稿ではAndroidアプリにおける広告ライブラリモジュールの挙動を監視する技術について解説を行った。次回は、不正なAndroidアプリ(マルウェア)によるシステム改ざんを検知する技術について紹介する。

●著者プロフィール 毛利公一:立命館大学情報理工学部 教授。オペレーティングシステム、仮想化技術の研究・教育に従事。近年は、これらを基にしたコンピュータセキュリティ分野の研究として、特にマルウェア対策技術、Androidセキュリティ、情報漏えい対策などのテーマに取り組んでいる。博士(工学)。

最終更新:7月5日(火)6時10分

@IT

TEDカンファレンスのプレゼンテーション動画

暗闇で光るサメと驚くほど美しい海洋生物たち
波のほんの数メートル下で、海洋生物学者であり、ナショナルジオグラフィックのエクスプローラーかつ写真家のデビッド・グルーバーは、素晴らしいものを発見しました。海の薄暗い青い光の中で様々な色の蛍光を発する驚くべき新しい海洋生物たちです。彼と一緒に生体蛍光のサメ、タツノオトシゴ、ウミガメ、その他の海洋生物を探し求める旅に出て、この光る生物たちがどのように私たちの脳への新たな理解を明らかにしたのかを探りましょう。[new]