ブログ 不正アプリへのリバースエンジニアリング:最新のモバイルにおける不正にアプローチし...

不正アプリへのリバースエンジニアリング:最新のモバイルにおける不正にアプローチしました

こちらのブログで、Googleの新しいPlay Referrer APIについて説明しました。このAPIがもたらすデータから、クリックインジェクションを根絶するためのヒントが得られます。

従来のクリックインジェクションの方式をとっていないと思われるアプリが見つかり、Adjustはこのアプリに対して詳しい調査を行いました。そしてAdjustは問題のアプリが「コンテンツプロバイダ」と呼ばれるGoogle Playストアのダウンロードレポジトリをすり抜け、アプリのインストールが完了する前に、バックグラウンドでクリックを行っている、という仮説を立てました。

これはクリックインジェクションに対する新しいアプローチ方法です。従来のアプローチでは、新しくインストールされたアプリを探し、新しいアプリがインストールされるのを待ち、クリックを行うというものでした。これは最も単純な方法であり、Androidは、PACKAGE_ADDEDブロードキャストを通して、アプリに新しいアプリがインストールされたかどうかを知らせる方法を提供していました。しかしこの方法には多くの欠点があり、インストール完了とダウンロード開始の間のタイムスタンプのずれが不正として検出されてしまうということが主な問題でした。

この記事では、不正アプリがどのようにしてインストール完了前に新しいアプリのダウンロードを検知しているのかについて分析します。これまでは、タイムスタンプの相違は微小でタイムスタンプによる不正探知が不可能だったため、この方法はモバイル広告不正の最も効果的な手法でした。

環境と手法

今回の調査に使用した手法は以下の通りです。

  • 2つの異なる逆コンパイラを用いた静的コード解析
  • Google Playストアとの相互作用中にアクティブデバッガを使用

ルート化されていないOnePlus Oneのデバイスで行ったテストを以下に挙げます。今回は2つの逆コンパイラを使って結果を検証しました。プライバシー上の理由で、アプリの名称は公開しません。そのアプリは仮名_AppZ_とします。特筆すべき点として、_AppZ_は現在ダウンロード数が5億以上あるアプリです。

下記に示すのは、検証結果をもとに導き出した仮説です。使用したコードベースは100クラスを超える非常に長いもので、難読解除ツール(デオブファスケータ)もほどんどのメソッド名を復元することができませんでした。コードベースは判読できないもので、実行結果も明確ではなく仮定は仮定に過ぎません。以上のことをご留意の上、次に進んでください。

トラフィックアナライザを実行してみると、パッケージインストールの完了直後に複数のAPIへのコールを起こそうとしていることが分かりました。これは、アプリがユーザーに知らせることなく、裏で未知のサーバーに通信を行っていることを意味します。_AppZ_の仕組みもまた選択の余地があります。いくつかのアプリが別のネットワークへの通信を行っている可能性があるからです。Charles Proxyのスクリーンショットをご覧ください。上がアプリ「Subway Surfers」、下がアプリ「Gems & Genies」のインストール完了後のコールを示しています。

Google Playコンテンツプロバイダへのアクセス

ユーザーが新しいアプリをインストールすると、Google Playストアはインストールデータを_コンテンツプロバイダ_と呼ばれる場所に保管します。コンテンツプロバイダは1つのテーブルから成るSQLiteデータベースと考えることができます。

Google Playストアが使用するコンテンツプロバイダのURLは_content://downloads/my_downloads/_.です。Adjustの仮定では、_AppZ_はGoogle Playストアから最近インストールされたアプリから情報を得るために、このコンテンツプロバイダを観測します。下のスクリーンショットは、_AppZ_のソースコードを逆コンパイルしたものです。これを見ると、_AppZ_がGoogle Playストアのコンテンツプロバイダの情報を持っているという事は明らかです。

Google Playストアのコンテンツプロバイダを常に観測するには、通知形式でユーザーのデバイス上で常に稼働する、_AppZ_が持つある一定のバックグラウンドサービスが必要になります。

上述の通り、基本的にコンテンツプロバイダは1つのテーブルから成るSQLiteデータベースのラッパークラスです。Google Playのダウンロード用コンテンツプロバイダは`content://downloads/my_downloads`で、これはユーザーが_ダウンロード_ボタンをタップした直後にダウンロードデータを格納するために、Google Playストアが使用するコンテンツプロバイダです。

AppZが使用した観測方法は次のスクリーンショットの通りです。[registerContentObserver()](https://developer.android.com/reference/android/content/ContentResolver.html#registerContentObserver(android.net.Uri,%20boolean,%20android.database.ContentObserver){.a-link })はコンテンツプロバイダの変化を検知し、コールバックを呼び出します。

しかし、_AppZ_はGoogle Playコンテンツプロバイダから得たデータを、一体どうするのでしょう?

下のスクリーンショットから、最近ダウンロードされたアプリの名称を抽出するパースロジックが、_AppZ_に実装されていることが分かります。これはスクリーンショット中のコード86行目で確認できます。

まとめると、AppZが最近ダウンロードされたアプリからの情報を観測し、照会する精緻なロジックを持っていることは明らかです。この情報により、アプリのダウンロードが完了する前にクリックインジェクションを行うことができる可能性が生まれます。

結論

不正業者は常に広告不正の新しい手口を試しています。今回調査した結果から、_AppZ_がユーザーのデバイスの弱点をついた、悪質なクリックインジェクションを行うための手段を持っていることが分かりました。この結果は、不正の手法の可能性だけでなく、実際_AppZ_のような多くのアプリに既に使われている可能性を示唆しています。

正規の環境で、ユーザーの同意なしに広告クリックを取り扱うという構想は、過去にもたくさん導入されてきました。今回Adjustが使った上述の手法は、洗練された最新のものです。しかし、Googleの新しいリファラAPIがより厳しいクリックインジェクション対策をとるべきであることも分かりました。

Adjustニュースレターに登録して、最新情報をいち早くご確認ください!