« なぜミログはクロか | 高木さんがMIAU非難にノリノリな件 » |
株式会社ミログが最近発表した、AppLogSDK というものが、スパイウェアもどきじゃないかという批判が出ていたので、その会社の成果物をチェックしてみたら、app.tvというAndroidアプリ群が、スパイウェアそのものだった。
app.tv について簡単に説明すると、電子書籍アプリで、ミログのいう AppReward という仕組みで、アプリを入れることでターゲティング広告が表示され、その実績を仮想通貨のポイントに変換し、ポイントに応じて電子書籍を入手する、という仕掛け。手っ取り早くポイントを購入する仕掛けも別にある。
ここで問題なのは、このターゲティング広告が、Android端末の「アプリケーション情報」を用いるという点。このために、アプリを入れた端末から、インストールされたアプリの情報や起動されているアプリの情報を常時収集し、定期的にミログのサーバーに送る仕掛けが入っている。これは、プライバシーの観点からはものすごくインパクトのある話で、「きっちり許諾をとっているのか」が問題になる。AppLogSDKは情報収集部分だけというフレコミのもので、この許諾がちゃんとしているかどうか、が問題になった。そこで騒ぎになる前に出ていた app.tv ではどうか、というのが今回の問題。
app.tv アプリでは、初回起動時に端末に登録しているアカウントのメールアドレス一覧が表示され、そのうちどれか(通常、1つはある)を選択すると、サーバ側でアカウント情報を確認するため、認証tokenを要求され、端末のシステム側が許可を求めるDialogを表示する。ここで許可を出すと、サーバ側でメールアドレスが正しくGoogleのアカウントに紐づいていることを確認できたとして、次のフェーズになる。それが、ユーザ情報登録という、性別と生年月日を登録するフォームの表示。アプリが表示するものと同じものがオンラインで確認できるが、ここでは
app.tvはお客様のアプリケーション情報を取得し、コンテンツの改善に利用致します(現在、ご登録頂きました情報はリワード広告表示及び成果測定のために使用しております)。利用規約、プライバシーポリシーをよくお読みになり、ユーザ情報をご登録下さい。
と明記している。利用規約とプライバシーポリシーは、ボタンを押せば読めるが、読まなくても、「利用規約、プライバシーポリシーに同意する」にチェックを入れれば同意となる。これが十分な同意か、というのは問題になる。が、app.tv は、その水準の問題ではなかった。
前節の話、普通に読めば、利用許諾とプライバシーポリシーに同意して、そこではじめて「アプリケーション情報を取得」が行われる、と思うだろう。が、そうではない。app.tv 発表のプレスリリースにも登場する、【闘牌伝説アカギ】日テレオンデマンドというアプリを Android エミュレータにインストールし、起動して利用規約同意画面までたどり着いたところでしばらく置いておいた。そうすると、 log.friend-app.com というサイトに自動的に通信を始めて、起動アプリの情報とインストールアプリの情報を送信した。つまり、同意とか関係ない、という動作をするのだった。
なぜそんな動作をするのか、だ。実は動作させる前に解析しておいたので実際の順序は逆になるのだが、解析結果を簡単に。
app.tv 系のアプリでは、Launcher からアイコンをクリックして起動する Activity のクラスは、必ずjp.co.milog.apptv.sdk.view.AppActivity
というクラスの子クラスとなっている。このAppActivity
が、端末に電源を入れた後に最初に起動されるさいに呼ばれる onCreate()
というメソッドでは、初期化処理のあと、アカウント(メールアドレス)選択済かどうかをチェックし、まだ選択されていない、インストール後初回の起動では、jp.co.milog.apptv.sdk.common.ui.AccountSelectDilaog
という、別のActivityを起動し、その終了を待つ。このActivityは、名前のとおり、Dialog を表示して、登録アカウントを選ぶものとなっている。
画面上でアカウントを選択すると、AndroidのAccountManagerのtoken利用許可を求めるDialogが起動する。ここでの token の種類は、Google Contacts Data API といって、Gmail で出てくる「連絡先」データへのアクセス権ということで、この時点で、注意深い人なら敬遠するかもしれないが、分からないので 許可をすると、この token がミログのサーバーに送られて確認作業を行う。ここで問題ないと、AccountSelectDialog
はその役割を終えて終了する。ここで、前述のAppActivity.onCreate()
に処理が戻ってくる。
そして、行われるのが、jp.co.milog.apptv.sdk.common.service.AppBootService
とjp.co.milog.apptv.sdk.common.service.AppLogAggregateService
という、二つのサービスの起動となる。このうち、AppBootService
のほうは、起動アプリ情報に応じた広告ダウンロードをバックグラウンド実行するもののようだ(あまり細かくみていない)。そして、もうひとつのAppLogAggregateService
のほうが、アプリ情報送信を行う。AppLogAggregateService
には、TaskAppBootCollect
と、TaskAppInstalledCollect
の2つのInner Classがあり、両方ともjava.util.TimerTask
の子クラスとなっている。AppLogAggregateService
が起動すると、両子クラスのオブジェクトがTimerにスケジュールされる。TaskAppBootCollect
は1時間に1回、TaskAppInstalledCollect
は24時間に1回の起動で、両方とも最初の起動はService起動から3分後である(ただし、時間はあまり厳密ではない)。
TaskAppBootCollect
は、Androidのアプリ実行を司る ActivityManager に、現在実行されているタスク一覧を問い合わせ、それをアプリのパッケージ名に変換してミログのサーバに送信する。Androidスマートフォンなどを使っていると、アプリは一見、表示されているものだけが動いているように見えるけれども、Androidではアプリ間の切り替えを早くするために、一度起動されたアプリは、メモリに余裕がある限り、内部的には生き続けている。このため、1時間に1回程度の情報収集でも、大抵の場合は、利用者のアプリ利用実績がそのまま反映された内容になる。
TaskAppInstalledCollect
は、Androidにインストールされるアプリを管理する PackageManager に、現在インストールされているアプリ一覧を問い合わせ、それをミログのサーバに送信する。こちらは1日一回だが、アプリのインストール状況の変化というのは、ふつうはそれほど頻繁ではないだろうから、この程度の間隔でも目的は達成される。1日の間にアプリを試しでインストールしたけれどもやっぱりアンインストール、といったものは拾えないが、ターゲット広告のための情報という背景からすれば、一日経たずにアンインストールされるアプリの情報は重要でないだろうから、これで目的は達せられているのだろう。そして、ここまでの経路に、利用許諾の判断が一切関係していないことも分かる。なお、ここでは初回起動時のことを細かく述べたけれども、端末の電源を一旦切り、再起動した場合は、app.tv では自動的に情報送信が再開されることはない。app.tv アプリを起動した場合に、アプリの画面を表示したのちにAppBootService
とAppLogAggregateService
が開始する。
以上のように、コードの解析からも、app.tv は利用者の許諾なく、端末内のアプリ情報を送信する、スパイウェアであることが分かった。なお、ここでは「【闘牌伝説アカギ】日テレオンデマンド」を例にしているけれども、コードの解析という面では、このアプリは、簡単なものとはいえ難読化処理が行われていて、わかりにくい。裏取りのために解析されたい方は、まず、その名もapp.tvという、ベースとなっているアプリのコードをまず調査し、そのあと他の app.tv コンテンツアプリを調査するとよいと思う。