では、具体的にこれらのAPIの監視を、どのように実現すればよいのだろうか。Androidアプリは、利用者情報の取得や外部との通信を行うために、アプリケーションフレームワークが提供する前述のAndroid APIを用いている。そのため、APIフックを行い、その情報を記録することで、利用者情報の取得や通信内容の追跡が可能である。具体的には、下図のような仕組みとなる。
なお、APIの先頭には、ロギングメソッドを呼び出すように改変を加える。ロギングメソッドでは、下記のような情報を記録する。
これらの情報は、PCに取り出して解析することができる。特に、呼び出し過程については、各スレッドのスタックをさかのぼることで取得できる。下図のように、同じ通信系APIが呼び出された場合でも、スタックからどのモジュールから呼び出されたのかを区別することで、広告モジュールの挙動を特定できる。
ただし、スレッドの生成やメッセージ通信による処理依頼など、一連の処理でありながらスタックが異なる場合については、個別に処理の流れを記録し、スタック間の関連を追える仕組みが必要となる。
以上のような仕組みを用いて取得したログを基にすることで、グローバルIDなどの識別IDをAPIを用いて取得、送信するようなアプリを抽出することができる。また、そのようなAPIを呼び出したモジュールを特定することも可能となる。
筆者らは、以上で述べた仕組みを用いて、著名アプリマーケットに掲載された「新着無料アプリケーション」上位50件について挙動を調査した。具体的には、広告事業者ごとに、グローバルIDなどを取得、送信したアプリケーションの個数を調査した。調査期間は2015年12月21日から2016年1月18日である。
調査では、アプリケーションへの操作として、メニュー画面などで最初に利用者が操作できるアイコンを全てタップした。また、広告が画面に表示される場合には、広告にアクションを行い、ブラウザアプリケーションやマーケットアプリケーションへの画面遷移も観測した。
調査結果は下表の通りである。表のうち「?」となっている部分は、個人識別情報取得のAPIを利用していることは観測できたが、その送信を検出できなかった場合である。また「−」の部分は、観測対象のAPIの利用が検出できなかった場合を示している。表にある通り、ほとんどの広告事業者はAdvertising ID(表中ではAdID)を用いているが、一部にはグローバルIDを取得するものがあることが分かる。
広告事業者 | 2015年12 月 21 日 | 2016年1 月 4 日 | 2016年1 月 18 日 | |||
---|---|---|---|---|---|---|
送信情報 | 個数 | 送信情報 | 個数 | 送信情報 | 個数 | |
A社 | AdID | 7 | AdID | 6 | − | |
B社 | ? | 1 | − | − | ||
C社 | AdID | 3 | ? | 2 | ? | 1 |
D社 | AdID、 Android ID | 2 | AdID | 2 | − | |
E社 | ? | 1 | − | − | ||
F社 | − | ? | 2 | ? | 2 | |
G社 | AdID | 2 | AdID | 1 | AdID | 2 |
H社 | AdID | 4 | − | AdID | 5 | |
I社 | AdID | 5 | AdID | 1 | AdID | 2 |
J社 | − | − | AdID | 3 | ||
K社 | ? | 4 | ? | 7 | ? | 4 |
L社 | AdID | 5 | AdID | 10 | AdID | 9 |
M社 | ? | 1 | ? | 1 | AdID | 2 |
N社 | AdID | 8 | AdID | 10 | AdID | 10 |
O社 | − | ? | 1 | − | ||
P社 | Android ID、IMEI、MAC、AdID | 2 | Android ID、IMEI、MAC、AdID | 5 | Android ID、 IMEI、MAC、AdID | 6 |
Q社 | Android ID、AdID | 7 | Android ID、AdID | 5 | Android ID、AdID | 8 |
R社 | AdID | 2 | − | AdID | 1 | |
S、 T、 U、 V社 | − | − | − | |||
このように、アプリケーションフレームワークでの監視は比較的容易だ。アプリがJavaで記述されている限りは、監視漏れを抑えることができ、アプリケーションの挙動の意味を理解しやすい。ただし、JNI(Java Native Invocation)を用いて、CやC++などを用いて作成された外部のプログラム群を呼び出すことで、これらの監視をくぐり抜けることができてしまう。従って、外部プログラム群については、Linuxカーネルによる監視も検討する必要がある。
また、取得したグローバルIDがネットワーク経由で送信されるときに暗号化されると、検出が難しくなる。これに対しては、アプリケーションのプログラム中での特定のデータに対するコピーや変換、保存、送信などの操作を追跡する「テイント解析技術」を用いて解決する研究もなされている。ただし、処理速度の問題や暗黙的フローと呼ばれる検出が困難なデータの流れが存在するという問題、JNIが用いられたときに追跡が困難となる問題など、まだまだ解決すべき課題も多いのが現状である。
以上、本稿ではAndroidアプリにおける広告ライブラリモジュールの挙動を監視する技術について解説を行った。次回は、不正なAndroidアプリ(マルウェア)によるシステム改ざんを検知する技術について紹介する。
▼毛利 公一(もうり こういち)
立命館大学情報理工学部 教授
オペレーティングシステム、仮想化技術の研究・教育に従事。近年は、これらを基にしたコンピュータセキュリティ分野の研究として、特にマルウェア対策技術、Androidセキュリティ、情報漏えい対策などのテーマに取り組んでいる。博士(工学)。
Copyright © ITmedia, Inc. All Rights Reserved.