SourMint:iOSにおける悪意あるコード、広告詐欺、データ漏えい
2020年8月24日
0 分で読めます更新:当初公表した調査結果に加え、SDKのiOS版とAndroid版の両方で新たな懸念点を確認しました。更新された調査結果と、Apple、Google、コミュニティからの反応についてはこちらをご覧ください。
Snykの調査チームは、業界専門家の推定によると月間3億回以上ダウンロードされる、App Store上の1,200以上のアプリで使われている人気の広告SDKに、悪意ある動作があることを発見しました。
この悪意あるコードは、中国のモバイル広告プラットフォームプロバイダーMintegralのSDKのiOS版に含まれており、2019年7月までさかのぼって確認されました。悪意あるコードは、アプリ内で行われたURLベースのリクエストを記録することで、ユーザーのアクティビティをスパイできます。このアクティビティはサードパーティのサーバーに記録され、個人を特定できる情報(PII)やその他の機密情報が含まれる可能性があります。さらに、このSDKは広告のユーザークリックを不正に報告し、競合する広告ネットワーク、場合によってはアプリの開発者やパブリッシャーから収益を奪います。
https://www.youtube.com/watch?v=MMuL5MaQeLM
SourMintの悪意あるコードの概要
Mintegral SDKは、アプリ開発者や広告主が広告による収益化マーケティングを実現するためのツールをうたっています。しかし、調査を通じ、モバイル広告業界の専門家とも連携した結果、SnykチームはSDK内の一部の悪意あるコードが、アプリで使用されている他の広告ネットワークから収益を奪い、アプリ内で行われるURLベースのリクエストをスパイすることを発見しました。
開発者はパブリッシャーとして登録し、MintegralのサイトからSDKをダウンロードできます。SDKを組み込むと、アプリ内からApp StoreへのリンクなどのURLを開いたときに実行される、iOSの標準関数にコードを注入します。これによりSDKは大量のデータ、さらには個人のユーザー情報にアクセスできる可能性があります。またSDKは、競合する広告ネットワークのSDKがアクティビティの発生元かどうかを判断するため、URLを開くイベントを特に調べています。
興味深いことに、Mintegral SDKには、研究者がアプリの真の動作を発見できないように設計されたとみられる、複数のデバッグ対策も含まれています。コードには、端末がroot化されているか、何らかのデバッガーやプロキシツールが使われているかを判定しようとするルーチンがあります。監視されている証拠を見つけると、SDKは悪意ある動作を隠そうとして挙動を変更します。これにより、悪意ある動作が検出されずにAppleのアプリ審査を通過しやすくなる可能性もあります。

広告詐欺
SnykがこのSDKで発見した悪意あるコードの主な目的は、アプリ内の広告に対するユーザーのクリックを乗っ取ることだと考えられます。モバイルアプリでは、開発者がコードに組み込んだ広告ネットワークが広告を配信することがよくあります。
広告主は広告を表示するために広告ネットワークへ料金を支払い、広告の成果(ユーザーが広告をクリックして広告主のサイトを訪問したり、アプリをインストールしたりすること)に応じて課金されます。アプリ開発者は、広告ネットワークが広告主から得た利益の一部を受け取ります。
アプリのパブリッシャーが、広告メディエーターを利用して複数の広告ネットワークのSDKをアプリに組み込むことは一般的です。メディエーターは複数の広告ネットワークを利用し、ネットワークのパフォーマンス指標に基づいて広告リクエストごとに利用するネットワークを選択することで、パブリッシャーの収益を最適化します。
しかし、Mintegral SDKはアプリ内の広告クリック(およびその他のURLクリックも)をすべて傍受できます。この情報を使い、アトリビューションプロバイダーに偽のクリック通知を送ります。この偽造された通知により、実際には競合する広告ネットワークが広告を配信していたとしても、Mintegralのネットワーク経由でクリックされたように見えます。
Mintegralは、主に2つの方法で競合する広告ネットワークから広告収益を奪います。まず、他の広告ネットワークに入るはずだった広告主の収益を奪います。これは、Mintegralが配信した広告で発生していないクリックのアトリビューションを不正に主張することで実現します。この悪意ある機能の主な目的は、これだと考えられます。
もう1つの影響として、開発者やメディエーターSDKがMintegralのパフォーマンスが他の広告ネットワークより高いと判断し、競合ネットワークよりMintegralを優先して選択するようになる可能性があります。
Mintegralが広告配信に使われていない場合でも、アプリ開発者やパブリッシャーが収益を失う可能性があります。調査では、Mintegral SDKをアプリに組み込むと、Mintegralが広告配信を有効にしていない場合でもクリックを傍受することがわかりました。その場合、競合する広告ネットワークを通じて開発者やパブリッシャーに還元されるはずだった広告収益が、開発者に支払われなくなります。
データ漏えいによるプライバシーのリスク
広告詐欺が悪意あるコードの主な目的とみられますが、最も深刻な影響とは限りません。Snykの調査で、Mintegral SDKは侵害されたアプリ内から行われるURLベースのリクエストをすべて記録することも判明しました。
こうしたリクエストの情報に加え、端末やアプリに関するデータもリモートのログサーバーに送信されます。SDKは次のような多くの情報にアクセスします。
リクエストされたURL。識別子やその他の機密情報が含まれる可能性があります
リクエストのヘッダー。認証トークンやその他の機密情報が含まれる可能性があります
アプリ内のリクエスト発生箇所。ユーザーの行動パターンの特定に役立つ可能性があります
端末を識別するために使われる固有のランダムな番号である広告識別子(IDFA)と、端末固有のハードウェア識別子であるIMEI。
SDKが記録するリクエストには、Web URL、カスタムURLスキーム(プロトコルハンドラー)のリクエスト、アプリ内からApp Storeへの呼び出しが含まれます。
広告クリックのアトリビューション以外に、このデータがログサーバーにアップロードされた後、どのように使われるのかは明らかではありません。少なくとも、記録されたデータを使えば、アプリ内でのユーザー行動を詳細に分析できます。さらに懸念されるのは、侵害されたアプリの性質によっては、収集されたURLやその他のデータから個人情報が漏れる可能性があることです。最終的に、Mintegralがデータ分析目的で他者に販売し、こうしたデータを収益化する可能性も考えられます。
ユーザーの機密データを大量に記録するこの機能は、モバイルアプリ全般によるデータ収集への懸念が高まる中で、特に注目に値します。最近では、データ収集の慣行をめぐり、TikTokアプリへの監視が強まっています。
Mintegralが、改ざん対策の仕組みや独自のエンコード方式を用いて収集データの実態を隠そうとしていることは、TikTokアプリを分析した研究者が報告した類似の機能を思い起こさせます。
SourMintで収集されるデータの範囲は、正当なクリックアトリビューションに必要な範囲を超えています。また、このアプリは、これほど広範なデータアクセスを実現するために、疑わしいコーディング手法を使っています。
技術的な攻撃の詳細と対策
この悪意あるコードによる攻撃は、どのように行われるのでしょうか。調査で明らかになった詳細を見ていきましょう。
開発者はMintegralのサイトからSDKをダウンロードし、アプリに組み込むことができます。SDKが初期化されると、Mintegralのサーバーに複数のリクエストを送信します。そのうちの1つへの応答として、アプリ内の悪意あるコードが直接利用する複数のパラメーターを含むJSONが返されます。これには次のものが含まれます。
改ざん・デバッグ検知を有効または無効にするフラグ
URLクリックを取得して記録するフックを有効にするフラグ
ユーザーのクリックアクティビティを記録するURL(エンコード済み)
取得した設定JSONには、次回の設定更新までの遅延時間を示す数値も含まれています。これはSDKの設定をリモートから更新できることを示しています。
前述のとおり、SDKは基本的な改ざん検知を行います。次の条件を確認します。
アプリがシミュレーター上で実行されている
アプリのプロセスにデバッガーが接続されている
端末がroot化されている(Cydiaアプリなど、複数のファイルを確認)
プロキシが有効になっている
SDKは上記のいずれかの条件を検知すると、SDK内の他の関数で使われるフラグを設定し、挙動を変更します。変更後の挙動では、URLの書き換えやユーザーデータの記録といった悪意ある活動が無効になるようです。つまり、SDKの悪意ある活動の検出を回避しようとしていると考えられます。
実行時にSDKはメソッドスウィズリングを使い、多数のメソッドやハンドラーの実装に悪意あるコードを注入します。これらのフックにより、Mintegral SDK以外で発生したものも含め、アプリ内から行われるあらゆるURLベースのリクエストを傍受できます。これは、SDKがユーザーのクリックに関する必要な情報を収集し、アトリビューションプロバイダーにクリック通知を送れるようにする重要な手順です。SDKが独自のコードに置き換えるメソッドは次のとおりです。
UIAplication OpenURLUIAplication OpenURL:options: completionHandler(アプリがiOS 10.x以降で実行されていることを確認した後)NSURLProtocolSKStoreProductViewController loadProductwithParameters:completionBlock
上記のメソッドのいずれかが呼び出されると、SDKが注入したコードはいくつかの処理を行います。まず、改ざん対策フラグが設定されているかを確認し、設定されていれば、それ以降のMintegralのコードをすべてスキップします。次に、リクエストがMintegralの配信したマーケティング広告から発生したのか、競合から発生したのかを調べます。Mintegralの広告からのリクエストであれば、追加の処理を行わず、通常のメソッドハンドラーを呼び出します。
リクエストがMintegral以外のメソッド内から発生した場合、コードはURL、リクエストヘッダー、クリックが発生したクラスとメソッド、追加のバックトレースデータなど、イベントに関する情報を収集します。このリクエストデータとその他の端末データは、設定ファイルで指定されたMintegralのログサーバーにエンコードされた形式で送信されます。記録されるデータは次のとおりです。
OSバージョン
IPアドレス
充電状態
Mintegral SDKのバージョン
ネットワークの種類
モデル
パッケージ名
IDFA
URL
リクエストヘッダー
メソッド名
クラス名
バックトレースデータ
データがMintegralに記録されると、メソッドの残りの処理は通常どおり続行されます。アトリビューションプロバイダーから提供されたレポートに基づき、バックエンドでMintegralが他の広告ネットワーク経由で発生したタッチポイントに対し、クリック通知を作成していることを確認できました。
この情報を明らかにするため、Snykのセキュリティ調査チームはSDKをテストアプリに追加しました。改ざん検知を回避するため、無線アクセスポイントで中間者プロキシ(mitm.it)を使ってアプリの通信を傍受しました。SnykはHopper逆アセンブラーを使用してSDK内のコードを調査し、その機能を特定しました。この悪意ある機能は、執筆時点の最新バージョン6.4.0に対し、少なくともバージョン5.5.1までさかのぼって確認できました。
最終的に、社内での調査に加えて、業界の主要な組織や専門家と連携することで、ユーザーの広告クリックイベントがエンドツーエンドで乗っ取られることを確認できました。
発見したコードと使用された手法について、さらに詳しい技術的な説明は、調査レポートをご覧ください。



